TypeScript 50.6%
JavaScript 46.1%
SQL 2.1%
Shell 0.6%
CSS 0.5%
1# Inventaire source — Lou-Ka (audit en lecture seule, 2026-10-17)23Nœud : M4M64a, dossier `~/apps/lou-ka`, dépôt `gitsrv:srv/git/lou-ka.git` (HEAD 57646d3, 2026-10-15). Rien n'a été modifié.45## Stack6- Python 3.14 (`.venv`), FastAPI + Uvicorn ; frontend React 18 + Vite 5 + TS, cartes `@groupe-ka/ka-maps` sur Mapbox GL (jeton `VITE_MAPBOX_TOKEN`).7- Tests : `tests/` (pytest, 93 tests, 198 fixtures HTTP rejouables).8- PM2 : `lou-ka-web` (`run.py serve 8095`), `lou-ka-sync` (`run.py watch 60` : tous les connecteurs toutes les 60 min puis géocodage → POI → quartier → qualité → images → dédup → immeubles → fairvalue → KA Scores).910## Données11- SQLite WAL `data/louka.db` (4,2 Go). Table `listings` (uid = `<source>:<external_id>`, 220 801 lignes, 48 937 actives+publiées, 40 072 canoniques `dup_of IS NULL`), `price_log`, `listing_events`, `fairvalue` (fv, fv_low, fv_high, deviation, verdict sous/marche/sur, confidence, method, comps, model_version `fv-logement-1.0`), `kascores` (par `coord_key`), `buildings`, `geocode_cache`, `image_checks`, `users`/`favorites` (KA ID).12- Photos : URL hotlinkées du site source (`images` JSON), filtrées (`images_ok`) ; miniatures WebP à la volée via `/api/img` seulement si `image_checks.status='ok'`. **Aucun droit de redistribution documenté.**13- Taux de remplissage (actifs) : lat/lng 97 %, prix 100 %, chambres 98 %, sdb 75 %, superficie 64 %, images 97 %.14- 424 sources distinctes (gestionnaires, portails kangalou/louer_ca/rentals_ca/zumper, petites annonces kijiji/lespac/fb_marketplace, courtiers). Chaque connecteur a une fiche `docs/connecteurs/<id>.md` (données factuelles publiques, UA identifiable `LouKaBot/1.0`, throttling, lien vers l'original, retrait sur demande).1516## Logique réutilisable17- `louka/fairvalue.py` : médianes de segment (ville/quartier × chambres) → ajustements multiplicatifs → kNN géographique ; `explain(uid)`.18- `louka/kascores.py` (`2026.08-v1`) : walk/transit/bike/calme/services → global, sur tuiles OSM + PMD 2021.19- `louka/dedup.py` : blocage grille ~110 m / clé d'adresse normalisée, confirmation type d'unité + prix ±4 % + second signal ; canonique = source la plus autoritaire.20- `louka/geocode.py` : Nominatim + Adresses Québec (MERN ArcGIS), cache.21- `louka/quartier.py` + `data/quartier.db` (recensement, défavorisation, écoles, chaleur) ; couches `inondation.db`, `rdl.db`, `hydro.db`, `air.db`, `commerces.db`, `transit.db`.2223## Décision Toveli24- **Réutiliser en lecture seule** : instantané `sqlite3 .backup` de `data/louka.db` → extraction mince (`listings` canoniques actives + `fairvalue` + `kascores` + `price_log`) rapatriée la nuit sur le nœud Toveli (clé `ka_guardian_ed25519` de M3U96b autorisée sur M4M64a le 2026-10-17, entrée commentée `toveli-sync-depuis-M3U96b-2026-10-17`).25- **Adapter** : logique de dédup (grille + adresse) réécrite en TypeScript pour le rapprochement annonce → propriété Toveli ; KA Scores et fairvalue consommés tels quels (résultats, pas recalcul).26- **Exclure** : connecteurs (aucune collecte dupliquée), médias (hotlink conservé avec crédit source, pas de copie), comptes/KA ID.27