SPB Git forge

spb/lou-ka

Public

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

232commits 1branches 0releases
172.9 MBsize
maindefault branch
3 days agolast push
HTML 98.9% Python 0.6%

page 4

  1. Sun, Aug 23, 2026 9

    1. 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 committed 1 mo ago · 10 files +451 −26
    2. 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 committed 1 mo ago · 8 files +398
    3. [ka2] fix connecteur devimco : nouveau format d'iframe Planpoint groupe (/g/<x>/<ns>)
      …
      Le widget groupe Planpoint est passé de /g/<ns> à /g/<x>/<ns> (le namespace
      de l'API groups/find est le DERNIER segment, parfois avec majuscules dans le
      premier). L'ancien regex envoyait le 1er segment -> 404 sur Alexander,
      Maestria et Hexagone depuis le 2026-08-19 (479 -> 231 annonces). On essaie
      maintenant les deux segments (en minuscules), et on accepte les namespaces
      projet avec espace encodé (%20) -> Éolia (20 unités) capté pour la 1re fois.
      
      Volume mesuré : 231 -> 481 trouvées (sync réelle : +22 ajouts, ~85 màj).
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +19 −7
    4. Simon-Pierre Boucher committed 1 mo ago · 4 files +720 −12
    5. ka-agent : balise analytics KA (collect vers administration-ka.com)
      …
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +2
    6. tri_logis : réécriture pour le nouveau site trilogis.ca (Next.js/Supabase) + fenêtre syncs_since_h sur /api/stats
      …
      - tri_logis : l ancien site statique tri-logis.ca a migré vers trilogis.ca
        (Next.js App Router + Supabase) — 23 synchros à found=0. Le connecteur lit
        désormais le payload RSC rendu serveur de /a-louer (tableau "units" JSON
        complet : prix, statut, date de dispo, notation n½, secteur, GPS,
        inclusions) et la galerie signée de chaque fiche /a-louer/<slug>
        (bucket privé property-media, tokens ~7 j re-signés à chaque sync).
        Périmètre : résidentiel longue durée seulement (commercial exclu).
        Sync de test : found=51, added=51.
      - web.py /api/stats : paramètre optionnel syncs_since_h (fenêtre en heures
        pour recent_syncs, LIMIT 4000, repli sur les 20 dernières si <20 dans la
        fenêtre) — le moniteur central api-ka voit enfin toute la fenêtre de 2 h
        au lieu de 20 entrées (~11 min), fin des fausses alertes stale.
        Sans paramètre : comportement inchangé.
      - Diagnostics sans changement de code : courtemanche, place_florimay et
        atlas_immo retournent 0 annonce parce que les sites n affichent réellement
        aucune disponibilité (vérifié en live) — connecteurs sains.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +222 −190
    7. court terme : 2e vague — 5 connecteurs (Expedia, Hipcamp, Glamping Hub, Parcs Canada, Sinistar, Corporate Stays) + 3 sources fermées documentées
      …
      - expedia : SSR + rendu Scrapfly ASP (pile Vrbo), 13 destinations QC × 2 tris
      - hipcamp : GraphQL public (LandsSearch bbox QC + détail camper), ~350 terrains
      - glampinghub : endpoint AJAX ouvert, 208 fiches QC, prix CAD seulement
      - parcscanada : API GoingToCamp (reservation.pc.gc.ca), oTENTik/Ôasis/MicrOcube
        des 12 terrains québécois, prix via feeDetails
      - sinistar : index Algolia public prod_housings (state:QC + quadtree bbox),
        ~5 600 hébergements de relogement, pas de prix public (assumé)
      - corporatestays : API REST WordPress properties, 47 meublés MTL/QC
      - tripadvisor (vertical locations fermé nov. 2024), sonder (liquidée nov. 2025,
        devenue affilié Booking), blueground (aucun marché QC) : disabled documentés
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 9 files +1,396
  2. Sat, Aug 22, 2026 10

    1. airbnb : polygone frontière Québec (élagage cellules + filtre cartes) et budget mélangé
      …
      Le bbox provincial englobe l'est de l'Ontario, le nord des É.-U. et le NB :
      4 857 annonces hors province (Ottawa & cie étiquetées « Outaouais ») ont été
      récoltées puis purgées. QC_POLY filtre désormais les cartes et élague les
      cellules entièrement hors Québec ; l'ordre des cellules est mélangé à chaque
      run pour que les cellules restantes tournent, budget par défaut 900 → 1200.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +52 −6
    2. court terme : 12 connecteurs supplémentaires + Airbnb réécrit en quadrillage carte (quadtree)
      …
      - airbnb : couverture provinciale robuste via search_by_map + bbox — subdivision
        en 4 quand une cellule sature (15 cursors ≈ 270 résultats), région déduite des
        coordonnées (centroïde le plus proche), dédoublonnage par room id.
        Env : LOUKA_AIRBNB_PAGES / LOUKA_AIRBNB_BUDGET / LOUKA_AIRBNB_DEPTH.
      - Nouveaux connecteurs QC : monsieurchalets, wechalet, chaletsalouer,
        chaletsarabais, mcal, qldc, rsvpchalets, sepaq, bonjourquebec (CITQ), vrbo.
      - chaletsquebec (domaine mort), chaletsdirect, locationschalets (redirigé)
        livrés désactivés.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 13 files +2,688 −70
    3. Simon-Pierre Boucher committed 1 mo ago · 24 files +2,844 −2
    4. apartments_com : acteur Apify maison ka-apartments-com (toute la province via Bright Data) + enrichissement PDP fb_marketplace
      …
      - nouvel acteur actors/ka-apartments-com : recherche /qc/ paginée (arrêt sur
        retombée page 1 via <title>), fiches détail en français (GPS, description,
        plans d'unités dédoublonnés, commodités, galerie), déblocage Akamai délégué
        au Web Unlocker Bright Data (curl_cffi/Scrapfly/Oxylabs → 403)
      - connecteur louka/connectors/apartments_com.py : 1 annonce = 1 propriété,
        prix « à partir de » (minimum des plans), bedrooms/bathrooms = minimum,
        cache détail 30 j, cadence LOUKA_APTS_INTERVAL_H (12 h) avec ré-émission
        des actives entre deux runs — 615 propriétés QC au premier passage
      - fb_marketplace : acteur 0.1.3 (adresse civique, beds/sdb, commodités,
        disponibilité, walk/transit/bike scores, visite virtuelle) + PAYLOAD_VERSION
        pour re-visiter progressivement le cache, filtre hors-Québec state+bbox GPS
      - sources.json : apartments_com passe de « non connectable » à actif
      - docs connecteurs régénérées (218 fiches)
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 230 files +1,672 −756
    5. fb_marketplace : acteur Apify maison ka-fb-marketplace (33 villes, tout le Québec)
      …
      Remplace la chaîne Scrapfly par un acteur Apify maison (curl_cffi sans rendu
      JS, proxy Oxylabs résidentiel CA via proxyUrlTemplate) : recherche 116 URLs
      (10 grandes villes × 7 tranches de prix + 23 régions par ID Marketplace),
      fiches détail (GPS, description, statut) et galerie complète via le
      MediaViewer préchargé. Filtre hors-Québec à deux niveaux : state du
      reverse_geocode dès la recherche + filet bbox GPS côté connecteur (FB glisse
      des suggestions d'autres provinces dans le flux public). Coût ~100× moindre.
      
      Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 227 files +2,615 −2,173
    6. Simon-Pierre Boucher committed 1 mo ago · 2 files +10 −8
    7. Simon-Pierre Boucher committed 1 mo ago · 2 files +17 −14
    8. Simon-Pierre Boucher committed 1 mo ago · 1 file +1 −1
    9. connecteurs: chaine de fetch anti-bot resiliente (Oxylabs->Scrapfly->Bright Data)
      …
      Auto-escalade de BaseConnector.get() sur blocage (403/429/503/challenge CF)
      ou coupure reseau, via connectors/_resilient.py. Cles lues de l env avec repli
      sur ~/.claude/.env (accepte SCRAPFLY_KEY et SCRAPFLY_API_KEY). Reponse
      compatible requests.Response; coupe-circuit par hote. Aucun connecteur modifie.
      
      Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +386
  3. Fri, Aug 21, 2026 1

    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 committed 1 mo ago · 3 files +204 −1
  4. Wed, Aug 19, 2026 8

    1. Simon-Pierre Boucher committed 1 mo ago · 1 file +3
    2. 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 committed 1 mo ago · 3 files +110 −61
    3. fix(seo): remplacement re.sub via lambda — titres/descriptions avec backslash ne plantent plus le SSR
      …
      Un titre d annonce contenant \2 ou \g<n> etait interprete comme reference
      de groupe par re.sub (re.PatternError: invalid group reference).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +2 −2
    4. Rapport final : KA Scores calculés sur 94,7 % du parc (42 845 annonces)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +7 −2
    5. Simon-Pierre Boucher committed 1 mo ago · 1 file +4 −1
    6. 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 committed 1 mo ago · 7 files +1,757 −306
    7. 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 committed 1 mo ago · 5 files +153 −16
  5. Tue, Aug 18, 2026 10

    1. Script de reprise : complète les tuiles env (limites Overpass) puis calcule les KA Scores
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +20
    2. 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 committed 1 mo ago · 8 files +76
    3. 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 committed 1 mo ago · 20 files +1,535 −20
    4. 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 committed 1 mo ago · 22 files +1,829 −41
    5. Garde-fou overflow-x: clip (débordement transitoire 360 px au chargement)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +5
    6. 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 committed 1 mo ago · 76 files +5,841 −2,002
    7. Vague 3 : connecteurs Zumper (API directe), Atimco (Livya), Simplex (Supabase)
      …
      - zumper : API JSON interne en DIRECT (bundle CSRF -> pages/listables par bbox
        -> fiches /buildings avec cache BD cle modified_on), 8 bbox QC, filtre
        state=QC ; 4 345 annonces au premier sync (2 391 absorbees par la dedup =
        +1 954 nettes). PadMapper = meme API (ids 100/100 identiques) : couvert.
      - _livya : base commune des gestionnaires servis par Livya (ex-RealVuu),
        patron generalise du connecteur thrace (flux RSC des pages plans).
      - atimco : ~18 projets Monteregie (Longueuil, St-Constant, St-Hyacinthe,
        Chambly, Chateauguay, St-Jean, Sorel, Cowansville) — 299 unites disponibles,
        prix/GPS/chambres/sdb complets, 0 doublon.
      - simplex : catalogue Supabase public (RPC get_public_rental_listings_page),
        Trois-Rivieres/Shawinigan — 3 annonces actives (28 publiees en rotation).
      - sources.json : +6 entrees (zumper, atimco, simplex actifs ; padmapper
        couvert via zumper ; apartments.com non connectable — 403 CoStar ;
        cloria non connectable — inventaire Livya complet mais 0 prix publie).
      - docs/connecteurs regeneres (217 fiches).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 223 files +1,954 −944
    8. docs: documentation standardisée des 214 connecteurs (générateur + fiches)
      …
      scripts/gen_connector_docs.py : générateur 100 % programmatique et rejouable
      qui croise data/sources.json, l introspection statique (ast) du code des
      connecteurs et la BD live (volumétrie, complétude SQL par champ, sync_log).
      Écrit docs/connecteurs/INDEX.md + une fiche par connecteur (sections fixes :
      description, accès, champs -> schéma, fréquence & budget, volumétrie,
      erreurs, licence, historique).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 216 files +17,888
    9. Vague 2 : colonnes bedrooms/bathrooms, perf fb_marketplace/logisquebec, connecteurs Kangalou + Rentals.ca, visites virtuelles
      …
      - Schéma : colonnes bedrooms/bathrooms REAL (additives) dérivées dans
        finalize() — details explicites > type d'unité (n½ -> n-2, convention QC)
        > extraction texte ; backfill one-shot : 96,7 % bedrooms / 51 % bathrooms
        sur le parc actif.
      - fb_marketplace : recherche et détails Scrapfly EN PARALLÈLE (6 fils,
        mêmes requêtes, aucun volume perdu), TTL détail 10 -> 30 j, annonces
        louées filtrées avant enrichissement : 43-47 min -> 7,3 min/cycle.
      - logisquebec : budget détail 1200 -> 400 (dimensionné TTL 7 j / ~10
        passes/j), fiches jamais vues servies en premier, délai 0,7 -> 0,5 s :
        19 min -> 7,6 min/cycle, parc complet (6 393 fiches).
      - Kangalou (nouveau) : découverte en 1 requête via les pins de la carte
        (/fr/recherche/ajax/search-map/, loués/commerciaux exclus), fiches SSR
        (adresse, chambres/SDB, GPS, galerie, dispo, superficie) : 7 916 annonces.
      - Rentals.ca (nouveau) : même GraphQL que Louer.ca mais inventaire ~+15 %,
        rejoué via Scrapfly ASP sans rendu JS (Cloudflare), détails PAR LOTS de
        40 via nodes(ids), villes/volumes plafonnés : 3 452 annonces (les
        recoupements Louer.ca sont résorbés par la dédup, déjà dans PORTALS).
      - Visites virtuelles : details.virtual_tour — tours{} Matterport/YouTube
        du réseau Rentals.ca (louer_ca clé cache v2 + rentals_ca) + détection
        générique Matterport/iGUIDE/Klapty dans les fiches logisquebec,
        duproprio, kangalou. 1 107 annonces actives en ont déjà une.
      - TtlDetailCache : peek()/put() pour la planification de lots parallèles.
      - sources.json : +kangalou, +rentals_ca (275 sources, 212 connecteurs).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 12 files +808 −114
    10. Connecteurs : rivero/trudel suspendus (RealVuu mort), groupe_dallaire via proxy Scrapfly, disjoncteur ingest, capreit/logisquebec/royal_lepage enrichis
      …
      - rivero + trudel : app.realvuu.com hors-ligne depuis 2026-08-10 (DNS NXDOMAIN)
        -> flag disabled=True (exclus du registre auto), statut sources.json mis a
        jour, 244 annonces zombies archivees (active=0, aucune suppression)
      - ingest : disjoncteur leger — une source en echec aux 5 derniers passages
        est sautee (log sync_log "disjoncteur: ..."), retentee 1 passage sur 5
      - groupe_dallaire : le pare-feu bloque l IP du serveur (timeout TCP sur tout
        le domaine) -> timeout direct 8 s puis repli proxy Scrapfly (simple, puis
        escalade ASP residentiel apres 422 WAF) pour admin-ajax et fiches ;
        teste : 255/256 unites retrouvees en ~5 min
      - capreit : area_sqft (colonne pi2 de la fiche) et availability_date
        (earliest_date du flux) mappes directement — 117/117 vs 107/117 avant
      - logisquebec : details canoniques postal_code / contact.phone / rooms
        (JSON-LD) ; superficie : verifie, aucune source structuree sur la fiche
      - royal_lepage : enrichissement fiche detail (description "Remarques",
        superficie habitable, agence) avec cache detail2 + cap 100/cycle
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 10 files +169 −22
  6. Mon, Aug 17, 2026 2

    1. Simon-Pierre Boucher committed 1 mo ago · 2 files +106 −350
    2. Câblage du widget KA Agent (bulle de chat IA Groupe KA)
      …
      Balises window.KA_AGENT={site:"lou-ka"} + /ka-agent.js (defer) dans
      frontend/index.html ; le gabarit SSR de louka/seo.py reprend le shell du
      build Vite, les fiches logement héritent donc du widget sans doublon.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +235