SPB Git forge

spb/vrai-prix

Public

Vrai-Prix — l'évaluation du vrai prix des propriétés résidentielles au Québec.

60commits 1branches 0releases
12.3 MBsize
maindefault branch
17 days agolast push
TypeScript 90.2% JavaScript 3.5% Python 3.4% CSS 1.9% HTML 0.6%

page 1

  1. Tue, Sep 8, 2026 7

    1. Simon-Pierre Boucher committed 17 days ago · 1 file +1 −1
    2. Simon-Pierre Boucher committed 17 days ago · 1 file +504
    3. Simon-Pierre Boucher committed 17 days ago · 1 file +29 −5
    4. Méthode du coût + propriétés à vendre (portage uqo-eval → Vrai-Prix)
      …
      Deux nouveaux univers, portés du fork UQO Éval (commits 8fa85f6, 726b80b,
      1779481, 08b3a13) et rebrandés Vrai-Prix :
      
      • /cout — méthode du coût « ultra avancée » : base data/cost.db (184 articles,
        99 assemblages, 16 localisations ; 4 967 observations, 2 895 grilles APCHQ
        2023→2026, 1 084 points StatCan 18-10-0289), moteur déterministe
        (RCN → dépréciation âge-vie / composantes → terrain → indication, fourchette
        P10-P90, confiance A-D décomposée), atelier propriété / construction,
        catalogue d'assemblages, console admin (jeton COST_ADMIN_TOKEN), connecteurs
        Firecrawl (APCHQ, CCQ, StatCan, Canac, BMR, Patrick Morin, imports
        Altus/RSMeans) + planificateur `npm run cost:sync`, PDF « Rapport — Méthode
        du coût » (mot-symbole Vrai-Prix, palette rouge/bordeaux), 9 outils Ka
        (cout_*), lien « Voir la méthode du coût » sur chaque rapport de valeur.
      
      • /a-vendre — toutes les propriétés réellement à vendre au Québec (copie
        Immo-Ka data/immoka.db, ~71 600 annonces vivantes) : recherche FTS +
        filtres, fiche complète (galerie, prix, caractéristiques, historique de prix,
        mesure Vrai-Prix vs prix demandé, duel des méthodes, portrait au rôle,
        voisines), atelier « mon évaluation » (bassin de ventes réelles + annonces,
        comparables, grille d'ajustements en $, réconciliation, confrontation ;
        localStorage), analyse IA du bâtiment (Sonnet 5, photos + description →
        composantes → moteur déterministe du coût, overrides, JSON technique,
        similaires techniques). Table vp_eval (ex-uqo_eval) produite par
        scripts/eval-immoka.ts (shards) + build-marche-stats.mjs.
      
      • /stats/marche + teaser /stats — la mesure à l'épreuve du marché, lue à chaud
        depuis data/marche-stats.json (src/lib/marche-stats.ts) avec repli sur
        l'instantané versionné src/data/marche-stats.json.
      
      • scripts/immoka-sync.sh — rafraîchissement nocturne : .backup Immo-Ka sur
        M4M64b (SSH LAN, clé gardien), rsync delta, ré-évaluation en shards,
        vp_eval + agrégats, index/FTS, bascule atomique, pm2 restart.
      
      • Intégration : nav header/tabbar/footer/sitemap, accueil (2 cartes),
        méthodologie (sections 08 Méthode du coût et 09 Marché), confidentialité
        (analyse IA à la demande, photos publiques, rétention 30 j), prompt système
        de Ka. Rebranding complet : aucune mention UQO / IMM1003 / IMM1033 /
        « laboratoire pédagogique » ; « mode étudiant » → « mode exercice ».
      
      • Dépôt : .gitignore `data/` → `/data/` (src/data/*.json désormais versionné :
        stats.json, stats-v2.json, marche-stats.json) + `tmp/` ; devDep tsx ;
        scripts cost:sync / immoka:sync ; docs/cost-*.md portés.
      
      Tests : 69 vitest (moteur, connecteurs hors ligne, IA hors ligne), tsc propre,
      next build OK.
      
      Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 17 days ago · 139 files +17,656 −13
  2. Sun, Aug 30, 2026 1

    1. analytics: passage au loader central ka-a.js (v2)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 25 days ago · 1 file +1 −1
  3. Fri, Aug 28, 2026 1

    1. docs: README ultra détaillé + visite guidée en 10 captures
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 27 days ago · 12 files +83 −5
  4. Wed, Aug 26, 2026 1

  5. Tue, Aug 25, 2026 9

    1. Header : vraiment collant au défilement
      …
      La règle hors @layer « body > * { position: relative } » (peinture au-dessus
      du grain) écrasait l'utilitaire Tailwind sticky du header — les styles
      non-layered gagnent sur @layer utilities. Exception explicite
      « body > header { position: sticky; top: 0 } » : le menu du haut reste
      visible en scrollant, mobile comme desktop.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +4
    2. Barre de navigation mobile commune Groupe KA (KA Tabbar v1)
      …
      Pilule flottante fixe en bas (standard ka-ui/nav, variante Next.js) :
      Estimer · Marché · Ventes · Méthode, accent rouge signature, bilingue fr/en,
      safe-area iOS. Estimer mène immédiatement à la recherche d adresse (focus du
      champ héros, id vp-adresse) ; Ventes ancre le flux des dernières ventes
      réelles de l accueil (id ventes).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 6 files +400 −1
    3. fix(db): index NOCASE municipalité + index partiel ventes récentes — panne 2026-08-25
      …
      municipalityCenter/municipalityPercentile faisaient un SCAN des 3,7 M
      d'unités à chaque page d'estimation (COLLATE NOCASE ≠ idx_units_mun
      BINARY) ; recentSales scannait 750 k transactions avec tri temporaire.
      Sous trafic crawlers, better-sqlite3 (synchrone) gelait l'event loop :
      next-server à 100 % CPU pendant 10 h, port 8090 muet, site down.
      
      Index créés sur la base live + bootstrap CREATE INDEX IF NOT EXISTS
      dans getDb() pour survivre à une reconstruction de la base.
      Requêtes vérifiées : covering index, pages < 0,32 s sous 20 req
      parallèles (avant : plusieurs secondes chacune, empilement infini).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +12
  6. Mon, Aug 24, 2026 5

    1. Simon-Pierre Boucher committed 1 mo ago · 1 file +11
    2. Simon-Pierre Boucher committed 1 mo ago · 1 file +110 −44
    3. Simon-Pierre Boucher committed 1 mo ago · 1 file +121 −29
    4. Simon-Pierre Boucher committed 1 mo ago · 3 files +90 −249
  7. Sun, Aug 23, 2026 6

    1. Favoris unifiés « Mon univers Ka » (KA ID) — ♥ hub Groupe KA
      …
      - lib/hubfav.ts : client HMAC du hub (transposé de food-ka) — aucun stockage
        local, toggle synchrone, lecture GET signée avec cache mémoire 30 s
        invalidé à chaque toggle
      - /api/favorites (GET, 401 sans session) + /api/favorites/toggle (POST,
        bascule add/remove selon la liste du hub, action explicite acceptée)
      - FavButton ♥ : fiche estimation (panneau prix) + cartes du parc ;
        déconnecté → départ SSO KA ID ; état initial partagé (une requête/page)
      - page /favoris : liste (titre, ville, estimation, lien fiche, retrait) ;
        lien « Mes favoris » sur /compte
      - Testé bout en bout contre le hub (add → list → remove, rien laissé)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 9 files +584 −3
    2. stats v3 : rapports PDF personnalisés (catalogue, rendu au choix, ReportBuilder)
      …
      - report-stats.ts : catalogFromDashboard() + buildCustomReport(spec)
        (dispatch par bloc, conversions tableau, sommaire, gabarit Groupe-KA)
      - routes /api/stats/catalog (GET) + /api/stats/report/custom (POST)
      - kacharts.tsx v3 : ReportBuilder intégré à PdfButton (modal, ordre,
        rendus, modèles localStorage) — SPEC.md §3bis
      Simon-Pierre Boucher committed 1 mo ago · 6 files +951 −15
    3. widget KA Agent : balise analytics première partie (admin-ka /collect)
      …
      Bloc KA_ANALYTICS ajouté en fin de ka-agent.js par le déploiement du
      tableau de bord admin-ka : identifiant visiteur anonyme (localStorage
      KA_VID) + battement par minute vers administration-ka.com/collect
      (site, vid, chemin). Commité a posteriori — état déployé en prod.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +2
    4. Retrait complet de Monetag (meta de vérification + script publicitaire)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file −9
    5. Script publicitaire Monetag (zone 272534) dans le layout
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +7
    6. Balise meta Monetag (vérification régie pub) dans le <head>
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +2
  8. Sat, Aug 22, 2026 6

    1. Upgrade majeur apparence + information : contexte marché, fourchette visuelle, accueil enrichi
      …
      - Fiche estimation : barre de fourchette P10-P90 (marqueurs estimation + rôle),
        faits rapides ($/m², type, année, superficies), section « Le marché autour de
        cette propriété » (courbe d'indice base 100 + tendances 12 mois/2021, ventes
        réelles du secteur avec rayon adaptatif, position percentile dans la
        municipalité), comparables enrichis ($/m², superficie, année)
      - Moteur : MarketContext (estimator) — stats secteur depuis les candidats déjà
        chargés, percentile municipal (db), aussi servi par /api/estimate (manuel)
      - Accueil : pouls du marché (indice par type + variations), dernières ventes
        réelles captées (lien vers l'estimation), bande « comment ça marche »,
        compteur ventes/30 j — page en ISR 1 h
      - DB : index idx_tx_date sur transactions(date)
      - MetricViz : RangeBar, MarketIndexChart, PercentileBar, IndexSpark
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 6 files +906 −23
    2. Ré-estimation hédonique sur le nœud : terrain/autre + recalibrage P10/P90
      …
      scripts/hedonic-retrain.py (sklearn HGB ≈ LightGBM, log-prix, encodages
      locaux par voisinage, pondération de récence) — bench équitable sur les
      ventes jamais vues par le build laptop (> 2026-07-27, n=4849) :
      
      - unifamilial : laptop meilleur (10,3 % vs 13 % MdAPE) → conservé ;
      - terrain 62→36 %, autre 79→52 % → challenger appliqué sur ces 926k unités ;
      - P10/P90 laptop recalibrés (couverture 18,5/16,8 % → 10,1/9,8 %) ;
      - clamp p10 ≤ est ≤ p90 (38 826 violations du build laptop → 0).
      
      Sauvegarde intégrale dans units_est_prev (rollback documenté §10).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +404 −1
    3. Connecteur incrémental « nouvelles ventes » (JdM/api.qub.ca)
      …
      Ajoute les ventes récentes directement dans data/vraiprix.db sur le nœud,
      sans reconstruire la base (le pipeline batch reste sur le laptop).
      
      - scripts/qub-token.mjs : Bearer QUB via login Scrapfly (connect.qub.ca,
        Akamai + reCAPTCHA v3, réessais sur sessions neuves) puis /api/checklogin.
      - scripts/ingest-jdm.mjs : balayage des 1478 secteurs /v1/locations/all →
        /v1/map (quadtree si plafond), mapping vers schéma transactions, spatial-
        join units (id_provinc/valeur_role), INSERT OR IGNORE (dédup par id).
      - Planifié quotidiennement via pm2 (vrai-prix-ingest, cron 08:00).
      - Gap 2026-07-27 → 2026-08-12 comblé province-wide (+4189 ventes, match 100%).
      - Doc : PIPELINE-DONNEES.md section 9.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +491 −3
    4. SEO : og:title/openGraph alignés sur le titre riche de l'accueil + lang fr-CA
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +14 −1
  9. Wed, Aug 19, 2026 4

    1. Simon-Pierre Boucher committed 1 mo ago · 1 file +4 −1
    2. Stats v2 (module commun Groupe KA) : /stats ultra complet + 5 rapports PDF
      …
      - Dashboard v2 (agrégats réels du rôle + corpus de ventes, stats-v2.json via
        scripts/build-stats-v2.mjs) : 10 KPI (deltas honnêtes millésime/12 mois +
        sparklines), 4 jauges de couverture, 5 séries (millésimes, ventes/mois,
        volume, prix médian), 2 multi-courbes (indice marché, $/m² par type),
        ventes empilées par type, 3 répartitions, 2 distributions, géo, calendrier
        des ventes, 6 tableaux, 10 records.
      - /api/stats/report : 5 modes (complet, synthese, tendances, repartitions,
        donnees ; inconnu → complet), filename(mode), moteur pdfkit v2 100 %
        vectoriel (sommaire paginé, courbes/aires/barres, multi-courbes à motifs,
        empilées, anneau, jauges, heatmap, tableaux zébrés paginés, records).
      - /stats : hero conservé + StatsDashboard (kit kacharts v2, ordre SPEC §1),
        PdfButton menu 5 rapports, fraîcheur + rafraîchir.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 7 files +1,105 −457
    3. Correctifs front-end mobile : viewport-fit=cover, safe-area et verrou de scroll cookies, socle mobile ka-ui
      …
      - layout.tsx : export viewport (device-width, initial-scale 1, viewport-fit=cover) pour les encoches iOS ; extension tactile ::after -8px sur le logo Vrai-Prix du header (cible >= 44 px)
      - CookieConsent.tsx : padding bas du bandeau avec env(safe-area-inset-bottom) ; verrou du scroll d arriere-plan quand le panneau de preferences est ouvert (useEffect + cleanup) + fermeture a Escape
      - src/ka/tokens.css : nouvelle section SOCLE MOBILE OBLIGATOIRE (z-index unifies, --vh100 dvh, .ka-bottombar, verrou ka-scroll-lock, filet anti-zoom iOS 16 px, extension tactile gk-badge)
      - public/ka-agent.js : agent corrige (safe-area bulle/panneau, textarea 16 px, plein ecran auto <= 640 px + verrou scroll kaa-lock)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 4 files +137 −10