SPB Git

spb/vrai-prix

Public

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

page 1
  1. Tue, Aug 25, 2026 4

    1. 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 · 1 file +12
  2. Mon, Aug 24, 2026 5

    1. Simon-Pierre Boucher · 1 file +11
    2. Simon-Pierre Boucher · 1 file +121 −29
    3. Simon-Pierre Boucher · 3 files +90 −249
  3. 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 · 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 · 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 · 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 · 1 file −9
    5. Script publicitaire Monetag (zone 272534) dans le layout
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 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 · 1 file +2
  4. 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 · 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 · 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 · 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 · 2 files +14 −1
  5. Wed, Aug 19, 2026 4

    1. Simon-Pierre Boucher · 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 · 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 · 4 files +137 −10
  6. Tue, Aug 18, 2026 1

    1. docs: PIPELINE-DONNEES.md — pipeline batch de bout en bout (continuité)
      …
      Documente le pipeline qui produit data/vraiprix.db (il tourne sur le laptop,
      pas sur le nœud) : sources amont (rôles MAMH 2021-2026 FGDB/GPKG Données
      Québec licence ouverte ; transactions api.qub.ca scrapées en quadtree avec
      token Bearer manuel), étapes (extract_roles → merge_transactions kNN 2 passes
      99,88 % → hedonic LightGBM 4 modèles → build_vrai_prix_db → build_stats),
      livraison scp 1,5 Go vers M3U96a, volumétrie vérifiée live (3 747 008 unités,
      745 119 transactions, market_index 268), complétude (GPS 100 %, frontage
      83 %, année 79 %), risques (token manuel, non-reproductible sur nœud, rôle
      2027) et procédure de rafraîchissement pas à pas.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +175
  7. Mon, Aug 17, 2026 8

    1. Simon-Pierre Boucher · 2 files +94 −42
    2. Ajout du fichier statique ka-agent.js (widget KA Agent)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +233
    3. Câblage du widget KA Agent (bulle de chat Groupe KA)
      …
      Ajout des balises window.KA_AGENT={site:"vrai-prix"} et /ka-agent.js
      en fin de <body> du layout racine. Coexiste avec l agent Ka de /ka.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +6
    4. Footer/contact : Job-Ka rejoint l écosystème (ecosystem.json 13 sites)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +175 −24
    5. Stats Groupe KA — /api/stats/dashboard (contrat SPEC), rapport PDF au gabarit commun (complet/synthèse) et boutons PDF + fraîcheur sur /stats
      …
      - Nouveau GET /api/stats/dashboard : KPI, série des millésimes 2021-2026,
        répartition par type, top municipalités, top 20 en table, records —
        period accepté mais non applicable (instantané du rôle 2026), cache mémoire.
      - report-stats.ts porté au gabarit Groupe-KA (A4) : couverture kicker
        GROUPE KA · RAPPORT STATISTIQUE + wordmark boîte encre/accent #ff5148 +
        bande « par Groupe KA — groupe-ka.com », sommaire, en-tête/pied normalisés,
        page de fin (3 courriels + rôles, avertissement d agrégateur d ecosystem.json).
        Contenu riche conservé (chiffre-choc, millésimes, types, palmarès 200) +
        records ; mode synthese = couverture + sommaire exécutif.
      - GET /api/stats/report?mode=complet|synthese (alias /api/report/stats),
        fichier groupe-ka_vrai-prix_stats_instantane_<date>.pdf.
      - /stats : barre en tête (mention de fraîcheur + Télécharger le rapport PDF +
        Synthèse) ; correction du débordement 360 px des stat-chips du bloc encre.
      - Kit commun src/ka/stats (SPEC.md, kapdf.py, kacharts.tsx) versionné.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 9 files +1,569 −100
    6. Assets Groupe KA (og.png, favicon.svg, apple-touch-icon) + correction du débordement à 768 px
      …
      - ka-assets/ → public/ : image de partage og.png (1200×630), favicon.svg,
        apple-touch-icon.png ; retrait du favicon.ico par défaut de Next.
      - layout.tsx : icons + og:image/twitter:image (summary_large_image).
      - page.tsx : titre d'accueil suffixé « · Un service Groupe KA ».
      - HeaderNav : la nav pilule n'entre pas à 768 px (~852 px requis) —
        bascule desktop/mobile déplacée de md: à lg: (cause racine du
        débordement horizontal de +84 px en tablette).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 7 files +16 −4
    7. API publique /api/stats — agrégats provinciaux pour les métriques live du hub
      …
      GET /api/stats expose en JSON les agrégats de src/data/stats.json (unités,
      valeur totale et médiane 2026, croissance, logements, municipalités,
      transactions, version du modèle, date de génération). Import statique du
      JSON, aucune base de données ; Cache-Control public max-age=600 + CORS
      ouvert en lecture. Consommé par groupe-ka.com pour ses métriques live.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +35
    8. Harmonisation Groupe KA — design system ka-ui, badge, footer commun, page contact
      …
      - ka-ui vendoré (src/ka/) : tokens.css importé dans layer(base) via globals.css
        (bat le preflight Tailwind, reste sous les utilitaires et le design local),
        bloc compat pour les titres, accent rouge canonique (--accent/--accent-soft/
        --accent-deep/--on-accent) avec alias historiques --lime/--lime-soft
      - Header : badge « Un service Groupe KA » à côté du logo (desktop xl+) et dans
        le pied du menu mobile, cliquable vers groupe-ka.com
      - Footer : KaFooter commun (bloc encre, contacts et sites centralisés
        d ecosystem.json) précédé de la rangée locale FooterNav restylée papier
      - Nouvelle page /contact : courriels centralisés, avertissement d agrégateur,
        lien hub + création de compte KA ID, liste des sites de l écosystème
      - SEO : titre par défaut « Vrai-Prix — Un service Groupe KA » (layout + OG/X)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 9 files +545 −17
  8. Thu, Aug 13, 2026 5

    1. README ultra-détaillé — captures d'écran, visite guidée, badges enrichis
      …
      10 captures Playwright prises en prod (docs/screenshots/, desktop @1600px
      + mobile @780px, régénérables via scripts/screenshots.mjs) : accueil,
      fiche+portrait, Vrai-Prix Maps, Ka, stats, page municipalité,
      méthodologie, mobile. Nouveau README : sommaire, visite guidée en
      galerie, sections Ka (12 outils), SEO programmatique (3,76 M d'URLs,
      sitemaps), structure du projet, endpoints complets (nearby/ka/auth),
      variables d'environnement, badges municipalités/URLs/Tailwind/SQLite/iOS.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 12 files +190 −22
    2. SEO programmatique — pages municipalités, sitemaps 3,7 M de fiches, métadonnées
      …
      - Fondations : metadataBase, gabarit de titres, og/twitter, canonical par
        page, JSON-LD Organization+WebSite (layout), title/description uniques
        sur toutes les pages statiques (pages clientes scindées en wrapper
        serveur + *Client.tsx).
      - /estimation/[id] : generateMetadata (adresse, estimation, fourchette),
        JSON-LD SingleFamilyResidence/Residence/Place + BreadcrumbList,
        estimation dédupliquée via React cache().
      - Pages programmatiques : /municipalites (index A-Z), /municipalite/[slug]
        (~1 097) et /municipalite/[slug]/[type] (~5 900) — stats agrégées
        (médiane, totaux, croissance 2021-2026), liens HTML vers les fiches,
        municipalités voisines (lib/municipalites.ts, cache mémoire).
      - Sitemaps : /sitemap-index.xml (à soumettre dans GSC) → /sitemap.xml
        (7 043 pages) + /estimation/sitemap/0-83.xml (45 000 fiches chacun,
        plages de rowid). robots.ts (disallow /api/, /compte).
      - noindex : /compte, /estimation/manuelle (espace d'URL paramétrique).
      - Accueil : section « Explorer par municipalité » (maillage indexable).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 26 files +1,175 −15
    3. SSO « Se connecter avec KA ID » via le hub groupe-ka.com
      …
      Routes /api/auth/ka/{login,callback} + /api/auth/{me,logout}, session
      cookie signée (ka-auth.ts, node:crypto pur), profil hub (hub-profile.ts,
      cache 60 s), page /compte carte de membre, AccountButton au header.
      (Déployé le 2026-08-13 ; l'intégration au layout arrive avec le commit SEO.)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 14 files +941
    4. docs: ka-maps-vrai-prix.md — intégration Vrai-Prix Maps
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +39
    5. Vrai-Prix Maps — recherche par carte propulsée par Ka Maps (framework Groupe Ka)
      …
      Remplace la carte Leaflet/OSM par le framework partagé @groupe-ka/ka-maps
      (moteur Mapbox GL, style Standard 3D par défaut + bouton 2D) : pastilles
      de VALEURS ESTIMÉES 2026 (encre, liseré rouge — jamais présentées comme
      un prix demandé), grappes avec compte + valeur moyenne clampée,
      chargement piloté par le viewport (débounce, annulation, cache, mode
      auto), aperçu React bilingue FR/EN, « Me localiser » sur action
      explicite, badge Vrai-Prix Maps · Groupe Ka.
      /api/nearby : plafonds relevés (halfLat 0,08 / halfLng 0,12 / limit 1500)
      — changement additif, contrat iOS 1.1.0 inchangé (défauts identiques).
      Consommé via tarball npm (file:../../ka-maps/*.tgz) — Turbopack ne résout
      pas les liens symboliques hors racine. leaflet/@types/leaflet retirés.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 9 files +346 −249
  9. Tue, Aug 11, 2026 1

    1. Recherche par carte — /carte (Leaflet+OSM) + API /api/nearby
      …
      - GET /api/nearby : unités dans une boîte englobante (idx_units_geo),
        tri par distance au centre (sinon l'index renvoie une bande sud),
        plafonds serveur ~2,2 km / 400 unités
      - Page /carte : fond OpenStreetMap, points encre/accent, popup éditoriale
        (adresse, type, estimation 2026 → /estimation/[id]), géolocalisation
        « Me localiser », garde de zoom, bilingue FR/EN, entrée nav « Carte »
      - Sert aussi l'app iOS native (onglet Carte MapKit, repo vrai-prix-ios)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 10 files +376
Menu

Theme