spb/cluster-skill
Public
HTML 57.2%
Shell 19.1%
Python 11.2%
CSS 7.4%
JavaScript 5.1%
1{2 "updated": "2026-09-04",3 "deployments": [4 {5 "app": "ka-stats",6 "node": "M1M32",7 "port": 8140,8 "domain": "www.ka-stats.com",9 "process_manager": "pm2",10 "label_or_name": "ka-stats + ka-stats-ngrok",11 "dir": "~/apps/ka-stats",12 "start": "cd ~/apps/ka-stats && pm2 start /opt/homebrew/bin/node --name ka-stats --interpreter none -- server.mjs 8140 ; pm2 start /opt/homebrew/bin/ngrok --name ka-stats-ngrok --interpreter none -- http --url=www.ka-stats.com 8140",13 "deployed": "2026-08-24",14 "notes": "Ka·Stats — l'explorateur de statistiques du Québec (Groupe KA), EN LIGNE sur https://www.ka-stats.com (bout-en-bout validé 2026-08-24). RENOMMÉ depuis qc-stats le soir même : l'utilisateur a finalement acheté ka-stats.com (GoDaddy, CNAME www → ngrok déjà posé) — marque Ka·Stats, dir/pm2/fichiers renommés. Serveur Node ZÉRO dépendance : agrège en direct les /api/stats/dashboard (contrat ka-stats v2) des 12 plateformes publiques (enveloppe api-ka {success,data} dépliée), cache mémoire+disque 10 min avec stale-while-error, endpoints /api/sites /api/overview /api/dashboard/:id, healthcheck /healthz. Front SPA vanilla ka-ui (tokens.css vendorisé + fonts Space Grotesk/JetBrains Mono, accent bleu Québec #095797) : Vue d'ensemble (héros 4,78 M d'éléments, pouls de l'écosystème, grille 12 plateformes, prix du Québec, records), /site/:id (rendu générique COMPLET du contrat v2 : KPI+sparklines, jauges, séries crosshair+infobulles, multi-courbes à motifs de trait, empilées, anneaux, histogrammes, géo, heatmaps calendrier+horaire, tableaux triables/filtrables/paginés, records, menu des 5 rapports PDF du satellite), /indicateurs (par thème), /comparer (≤4 plateformes, indice base 100, un seul axe), /palmares. Graphiques QCharts (public/charts.js) conformes au skill dataviz : palette catégorielle validée, vue tableau jumelle sur chaque graphique, gaps de surface 2 px, grilles hairline. | 2026-08-24 v2 INTERACTIF+STUDIO : lineChart interactif (zoom par sélection/brush, double-clic reset, légende cliquable pour masquer des séries), commutateur de type sur chaque carte (Ligne/Aire/Barres, Barres/Anneau), exports ⭳CSV/⭳PNG (SVG→canvas 2×, styles inlinés) ; nouvelle page /studio = CONSTRUCTEUR D'INDICATEURS : endpoints /api/catalog (227 métriques aplaties des 12 dashboards : kpi|series|multi|stacked, réf `site|kind|id[|sub]`) + /api/metric?ref=, picker avec recherche (≤4 métriques), transformations (brut/indice 100/variation %/moy. mobile 7 j/cumul), combinaisons A÷B A−B A+B (2 métriques), titre, sauvegarde localStorage (kastats_studio, 30 max) + LIEN PARTAGEABLE /studio?c=<json url-encodé> ; bouton « ✦ Studio » sur les graphiques des pages plateformes (préremplit la config). GOTCHA rsync : `-e \"$RSH\" $DEST:path` avec variables shell a interprété la destination comme CHEMIN LOCAL → dossier parasite M1M32pps créé dans le dossier SOURCE du laptop (rsync exit 0 !) puis resynchronisé sur le nœud — supprimé des deux côtés ; toujours vérifier le transfert avec -v/grep sur le nœud. | 2026-08-24 v2.1 SEO+BRANDING : metas SSR par route dans server.mjs (renderIndex : title/description/canonical/og:url/twitter + JSON-LD @graph Organization+WebSite+WebPage injectés dans index.html via marqueur <!--SEO--> ; routes /, /site/:id [titre+desc par plateforme], /indicateurs, /comparer, /studio, /palmares), og:site_name/locale/image:alt+dims, twitter summary_large_image ; BANNIÈRE OG officielle 1200×630 (gabarit gen-assets.mjs de ka-ui rendu via chrome-headless-shell — Playwright absent ; boxed « Stats » INVERSÉ bleu #095797/texte blanc et accents éclaircis #79b4e5 sur encre car le bleu Québec est trop sombre pour le gabarit standard) + favicon.svg/apple-touch-icon.png officiels « Ka » ; assets aussi déposés dans ka-ui/assets/ka-stats/ (canonique) ; sitemap 17 URLs (+/studio). GOTCHA données : vrai-prix publie une série ANNUELLE → le pouls n'agrège que les points datés au jour (≥8 pts, report dernière valeur, couverture ≥70 %) comme le hub. pm2 save + LaunchAgent pm2.simon-pierreboucher.plist installés (pm2 installé sur le nœud à cette occasion). NGROK : pattern standard (ngrok http --url=www.ka-stats.com 8140). LEÇON du soir : « réservé dans ngrok » ≠ domaine enregistré — qc-stats.com n'a jamais été acheté (RDAP Verisign 404), d'où des heures de HTTP 000 avant que le vrai domaine (ka-stats.com) soit nommé. ⚠️ SSH Tailscale laptop→M1M32 tombé pendant le déploiement : rebond LAN ssh -A -J M3U96a simon-pierreboucher@192.168.2.76 (M1M32 = .76, hostname MacStudnpierre8). Source laptop : ~/Desktop/Groupe-KA/apps-web/ka-stats. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai partout."15 },16 {17 "app": "spboucher-ai",18 "node": "M2U64",19 "port": 3100,20 "domain": "www.spboucher.ai",21 "process_manager": "pm2",22 "label_or_name": "spboucher + spboucher-ngrok",23 "dir": "~/spboucher-ai",24 "start": "scripts/start-production.sh (next start -H 0.0.0.0 -p 3100) ; ngrok http --url=www.spboucher.ai 3100",25 "deployed": "2026-08-12",26 "notes": "New multi-page academic + Zyquo apps site (Next.js 16 App Router, Tailwind v4, Framer Motion). Rebuilt from scratch per new CLAUDE.md spec (pages: /, /research, /teaching, /apps, /cv). Port 3100 car 3000 = console.maclustr.io. Health: /api/health. Source: laptop ~/Desktop/spboucher. pm2 save fait. | 2026-08-05: MAJ v2 — page /apps avec section Web Platforms & Open Source (8 repos GitHub) + redesign visuel complet (pill nav flottante, cartes rounded-3xl, palette éclaircie). Rebuild + pm2 restart spboucher OK. | 2026-08-12: MAJ — /apps + pages détail pour Search-Box et WorthDoing (commit 1fff779 poussé sur git.spboucher.ai). Rebuild + pm2 restart spboucher OK. | 2026-08-28: nouvel onglet « Projects » (/projects) présentant l'écosystème Groupe Ka — lib/groupe-ka.ts (14 plateformes + hub, accents/taglines officiels tirés du SITES de ka-stats), components/ka-app-card.tsx, page groupée par catégories (Housing/Mobility & Employment/Consumer/Culture & Discovery/Data & Infrastructure), nav header+footer MAJ. Rebuild + pm2 restart spboucher OK, /projects 200 public. Le VRAI repo = copie laptop ~/Desktop/Projets/apps-web/spboucher (origin spbgit git.spboucher.ai/spboucher.ai.git + remote github) ; le dir du nœud n'est pas un repo git (rsync/scp depuis le laptop). Commit aa361ce poussé sur spbgit. | 2026-08-28 v2 : pages détail /projects/[slug] pour les 18 entrées Ka (contenu anglais détaillé tiré des README sur les nœuds — lib/groupe-ka-details.ts : hero, stats, features, stack, docUrl) + ka2/ka4/ka6 ajoutés (catégorie AI Explorer Bots, favicons ka*.bot). Commit poussé sur spbgit."27 },28 {29 "app": "lou-ka",30 "node": "M3U96b",31 "port": 8095,32 "domain": "www.lou-ka.com",33 "process_manager": "pm2",34 "label_or_name": "lou-ka-web + lou-ka-sync + lou-ka-ngrok",35 "dir": "~/apps/lou-ka",36 "start": "pm2 start .venv/bin/python --name lou-ka-web --interpreter none --cwd ~/apps/lou-ka -- run.py serve 8095 ; pm2 start .venv/bin/python --name lou-ka-sync --interpreter none --cwd ~/apps/lou-ka -- run.py watch 60 ; pm2 start /opt/homebrew/bin/ngrok --name lou-ka-ngrok --interpreter none -- http --url=www.lou-ka.com 8095",37 "deployed": "2026-08-15",38 "notes": "2026-08-18 : qualité des données (score de complétude + quarantaine, audit d'images imgcheck, 26 connecteurs enrichis galeries+détails), mobile validé (matrice Playwright 360-1440 px, lightbox tactile, miniatures WebP /api/img, KA Agent plein écran), framework de juste valeur fairvalue.py (pastilles sous/dans/au-dessus du marché, filtre deal=sous, /juste-valeur, endpoint API-KA /api/v1/louka/fairvalue). Base en WAL. Commits dabf9c3 + 3e74b24. Agrégateur de logements QC/Lévis/Gd-Mtl (FastAPI+SQLite+React PWA). MAJ 2026-08-08 : refonte majeure — 82 connecteurs (13 nouveaux : Somex, Sila, Edifia, AULA, La Cour, Louis XIV, Mercini, Girescom, Mosaïque, SIG, Guillot, Forts, Centurion + Logis-Experts), schéma enrichi (dispo ISO, superficie, animaux, inclusions structurées), géocodage Nominatim+Adresses Québec (cache seedé, 97,5% GPS), carte MapLibre (vue Liste/Carte), tests fixtures (191). ~6000 annonces après premier cycle de sync. Source: laptop ~/Desktop/lou-ka + github spboucher-ai/lou-ka. | MAJ 2026-08-12 : vague « portails & courtiers location » — 10 connecteurs portés d'Immo-Ka (Kijiji c37+c36, LesPAC b457/458/460, RE/MAX Québec Meilisearch a-louer, Sutton typeInscription=2, Royal LePage transactionType=LEASE, Via Capitale criteresJson AVendre:false via Firecrawl, Proprio Direct rentOrSale:rent, Ubee Renter, Barnes Algolia type:rental, M Immobilier CODE_STATUT=AL), 265 sources au registre, backends Scrapfly portés dans base.py (SCRAPFLY_KEY ajoutée au .env du node), helper _detailutil (cache fiches détail). Commit dcb5008. | 2026-08-13: connexion déléguée au HUB KA ID (groupe-ka.com) — auth.py: routes /api/auth/ka/login (redirige vers {KA_HUB_URL}/sso/authorize, state signé) + /api/auth/ka/callback (vérifie le JWT HS256 du hub en stdlib, upsert local: match google_sub=\"ka:<hubid>\" puis par courriel — les ex-comptes Google directs gardent leur google_sub —, cookie louka_session, /bienvenue si nouveau), /api/auth/config renvoie {google, ka}, /api/me provider \"ka-id\"; frontend: 6 boutons basculés vers /api/auth/ka/login (« Se connecter avec KA ID », badge KA au header), dist rebuildé. .env node: + KA_SSO_SECRET (partagé avec le hub) + KA_HUB_URL. L'ancien flux Google direct reste en place (fallback). Testé bout-en-bout curl. | 2026-08-13 comptes v2+v3 : SSO « Se connecter avec KA » via hub groupe-ka (adopte le ka_id du hub), rôles locataire/gestionnaire (/bienvenue), favoris (cœur + /favoris), pages gestionnaires réclamables et personnalisables (/gestion + /g/{source}), profil enrichi (photo téléversée Pillow 512px → data/uploads/ — ⚠️ exclure data/uploads des rsync --delete, bio, ville, réseaux sociaux), profil public /u/{ka_id}, carte de membre. python-multipart ajouté au venv du node. | 2026-08-13 v2: PROFIL DICTÉ PAR LE HUB groupe-ka.com — louka/hubprofile.py (fetch signé HMAC vers /api/sso/profile, cache TTL 60s positif+négatif, to_epoch UTC — piège: created_at ISO naïf du hub parsé en heure locale = +4h, corrigé). /api/me: champs hub remplacent les locaux + role_label/job_title/company/age/public_url/profile_source; /api/users/{ka_id}: le hub dicte (404 si privé au hub), fallback local pour comptes legacy. Frontend: carte de membre marquée « Groupe KA » (plus Lou·Ka) + badge statut lime, section « Mon profil Groupe KA » EN LECTURE SEULE + bouton « Modifier sur groupe-ka.com » (l'éditeur local ne reste que pour profile_source=local), profil public = état+lien du hub. Testé bout-en-bout (privé au hub → 404 sur lou-ka après TTL). | 2026-08-13 v3: FAVORIS POUSSÉS AU HUB — louka/hubfav.py (push_favorite en thread non bloquant, signé HMAC; listing_item compose titre/type·secteur/prix/photo/lien /logement/{uid}), accounts.py add/remove_favorite poussent add/remove (comptes ka- seulement, legacy ignorés). Rattrapage one-shot exécuté (0 favori legacy relié). Testé bout-en-bout. 2026-08-13 : SEO — SSR léger (louka/seo.py), pages /villes /ville/{v}[/{type}], robots.txt, sitemaps dynamiques, JSON-LD, 410 annonces retirées, GZip. | 2026-08-13: Ka Maps déployé (frontend Mapbox 3D + backend bbox/index géo + geocode batch au watch) | 2026-08-15: IDENTITÉ VISUELLE OFFICIELLE — palette marine #0B1330 / bleu vif #2258FF / orange #FF6A00 / gris #F2F2F2, logo « porte entrouverte » (Logo.tsx, favicon+PWA marine), wordmark Lou-Ka (Ka orange), baseline « La porte d'entrée vers votre prochain chez-vous. », héro « Trouvez votre prochain chez-vous. » + rangée 4 avantages, Inter partout, pill-shaped + ombres douces (styles.css réécrit), tab bar mobile 4 onglets (active orange), thème Ka Maps marine/orange, immeuble 3D orange, PDF+SSR alignés. Rsync (data/ et .env préservés) + pm2 restart lou-ka-web/lou-ka-sync OK, site vérifié (Playwright). Commits: lou-ka b30336e, lou-ka-ios c9aebaa (Theme.swift) — poussés sur git.spboucher.ai. | 2026-08-17 harmonisation ka-ui : retour à l'éditorial sharp avec ACCENT ORANGE #ff6a00 (identité marine 08-15 remplacée, logo porte conservé), tokens vendorés frontend/src/ka/, GroupeKaBadge, KaFooter, /contact, title « Un service Groupe KA », og.png/favicon, SSO vérifié. NB : ka-maps redéployé sur le nœud (dépendance file:../../ka-maps). | 2026-08-18 CAMPAGNE CONNECTEURS (commits 689cd7d + 7ea14bb) : rivero/trudel désactivés (RealVuu DNS mort, 244 zombies archivés), groupe_dallaire récupéré via Scrapfly ASP (IP du nœud bloquée domaine entier, ~66k crédits/j), disjoncteur sources en échec, capreit/logisquebec/royal_lepage enrichis ; colonnes bedrooms (96,7%)/bathrooms (51,1%) + backfill 45k ; fb_marketplace 43→7,3 min (parallélisé), logisquebec 19→7,6 min ; NOUVEAUX connecteurs kangalou (7 916) + rentals_ca (3 452, ~1 600 nettes) ; visites virtuelles 1 107 ; 275 sources au registre ; docs/connecteurs générées. | VAGUE 3 (303d902) : zumper API interne DIRECT (rituel CSRF, bbox, buildings éclatés — +1 954 nettes ; PadMapper = même API vérifiée), atimco Montérégie (+299, base _livya.py), simplex. apartments.com 403 CoStar documenté. 281 sources, 48 401 visibles. | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud."39 },40 {41 "app": "vrai-prix",42 "node": "M3U96a",43 "port": 8090,44 "domain": "www.vrai-prix.com",45 "process_manager": "pm2",46 "label_or_name": "vrai-prix + vrai-prix-ngrok",47 "dir": "~/apps/vrai-prix",48 "start": "cd ~/apps/vrai-prix && pm2 start ./node_modules/.bin/next --name vrai-prix --interpreter none -- start -H 0.0.0.0 -p 8090 ; pm2 start /opt/homebrew/bin/ngrok --name vrai-prix-ngrok --interpreter none -- http --url=www.vrai-prix.com 8090",49 "deployed": "2026-08-11",50 "notes": "Plateforme d'estimation immobilière QC (Next.js 16 App Router, TS strict, Tailwind, bilingue FR/EN, Leaflet). Moteur: modèle hédonique LightGBM pré-calculé (22M estimations 2021-2026, MdAPE 11%) blendé 65/35 avec comparables ajustés (marché/superficie/âge, médiane pondérée), fourchette P10-P90, indice de confiance A-D. SQLite 1.2 Go (data/vraiprix.db): 3 747 008 unités du rôle 2026 + 745 119 transactions + FTS5 adresses. API <20 ms. Tests moteur: npm test (15 pass). Sources laptop: ~/Desktop/qc_house_eval/vrai-prix (app), scripts/ (pipeline données: extract_roles.py, merge_transactions.py, hedonic.py, build_vrai_prix_db.py). Node imposé par l'utilisateur malgré la règle M3U96a=staging. pm2 save fait. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai partout. | 2026-08-08 v2: refonte design complète — identité « éditorial sharp » portée de Lou-Ka (papier grainé #f5f3ee, encre #141814, lime électrique #d9f26b, Space Grotesk/Inter/JetBrains Mono, bordures encre + ombres décalées, ticker marquee, héros uppercase outline+highlight, stat-chips, tableau éditorial, section lead sur fond encre). Tokens dans globals.css (vp-card, btn, pill-conf-A..D, kicker, klabel, hbar). Rebuild + pm2 restart OK. | 2026-08-08 v3: fiche propriété ultra-détaillée (DB rebuild 1,5 Go: +frontage, lien physique, genre constr., matricule, valeurs terrain/bâtiment/antérieure, cond. marché, unité voisinage — codes décodés via domaines MAMH). Carte maison RadarMap.tsx (SVG from scratch, plan d'arpenteur: anneaux distance, azimut réel, N, échelle, hover sync tableau; Leaflet retiré). Rapport PDF vectoriel /api/report (pdfkit + fonts TTF dans assets/fonts, 2 pages: logo, fiche, hbars historique, radar dessiné, comps, méthodo — ~150 ms). Pages /methodologie (7 sections + tableau IAAO), /conditions, /confidentialite (Loi 25, responsable S-P Boucher contact@spboucher.ai) + CookieConsent (bandeau + panneau sélecteur, localStorage vp-cookie-consent 12 mois, bouton footer). serverExternalPackages: better-sqlite3 + pdfkit. | 2026-08-08 v4: page /parc (Parc immobilier) — multi-adresses (SearchBox mode onPick, liste persistée localStorage vp-parc, max 40), agrégation estimatePortfolio() (totaux, fourchette cumulée, confiance pondérée par valeur, croissance 2021→2026, répartitions mun/type, sommes registre), dashboard tuiles encre/lime + hbars historique + cartes par propriété, PDF multi-propriétés /api/report/portfolio (couverture agrégée + 1 page/propriété, report-portfolio.ts). HeaderNav pilule (Estimer/Parc/Méthodologie). | 2026-08-08 v5: MetricViz.tsx (SVG data-driven: BuildingGlyph façade étages/logements/genre, LotDiagram terrain à l'échelle frontage×profondeur+empreinte, ValueSplit terrain/bâtiment animé, ConfidenceDial jauge, Sparkline 2021-26, EraLine frise, CountUp) — intégré ResultView (section Portrait de la propriété bento + registre brut en <details>, YoY badges historique, animations rise/grow-x) + cartes /parc (sparkline+split). Rapport PRO /api/report/pro (report-pro.ts, 6 pages format évaluateur: page titre, sommaire exécutif, mandat/définition valeur marchande, description, grille d'ajustement 4 comps, indice marché, analyse hédonique, réconciliation, 9 conditions limitatives, attestation — encadrés 'pas un rapport OEAQ'). | 2026-08-08 v5.1: correctifs display métriques — CountUp SSR-safe (rend la valeur finale côté serveur, anime 0→valeur au montage; plus jamais '0 $' au premier paint), nombres localisés via locNum() (1 206,6 m² FR), VacantGlyph (borne d'arpenteur + conifères pour CUBF 9xxx — plus de fausse maison), LotDiagram placeholder condo ('quote-part de copropriété') quand superficie nulle, ValueSplit masque les segments <1% et labels <14%, EraLine s'étire avant 1900, écart vs rôle signé, grille historique auto (mobile). | 2026-08-08 v6: page /stats (nav 'Stats') — chiffre-choc provincial 2 009 452 277 400 $ (somme des 3,75M estimations 2026) en CountUp 2,6s sur carte encre, comparaisons (220k$/habitant, ×12 budgets QC, ×3 PIB), tuiles physiques, valeur provinciale par année avec YoY, répartition par type, top 10 municipalités + table top 200 filtrable. Données précalculées scripts/build_stats.py -> src/data/stats.json (17K, embarqué; re-générer après tout rebuild de la DB). | 2026-08-08 v6.1: menu hamburger mobile (HeaderNav — pilules desktop md+, tiroir plein-largeur animé <md avec backdrop), Stats+Parc ajoutés au FooterNav, rapport statistique provincial PDF /api/report/stats (report-stats.ts, 7 pages: chiffre-choc 2,01 billions sur carte encre, 8 tuiles comparaisons, barres par millésime et par type, palmarès complet 200 municipalités paginé 42/page) + bouton download sur /stats. | v6.2: fix menu mobile — le backdrop-blur du header créait un containing block cassant les descendants position:fixed; remplacé par panneau pleine largeur absolute inset-x-0 top-full sous l'en-tête (bg-paper, bordure encre, animation rise, ● actif), plus de voile fixed. Fix total pages rapport stats (6, pas 7). | v6.3: menu mobile refait en plein écran via createPortal(document.body) — plus AUCUN ancêtre avec backdrop-filter (cause racine des rendus transparents/rognés sur WebKit) : takeover fond papier opaque z-3000, barre marque+✕, liens géants numérotés 01-04 uppercase (actif en encre/lime), bascule de langue et liens légaux au pied, scroll body verrouillé, safe-area iOS. | v6.4: CAUSE RACINE menu mobile trouvée via Playwright (tap intercepté par <main>) — la règle hors-@layer 'body > * { z-index:1 }' de globals.css écrasait TOUTES les utilities z-* (les règles non-layerées battent @layer utilities en cascade Tailwind v4) → header et menu à z=1 sous le contenu. Fix: retrait du z-index de la règle. Menu mobile refait en checkbox+peer-checked (PUR CSS, fonctionne sans JS/hydratation morte/cache périmé), header opaque sur mobile (blur seulement md+). Testé Playwright viewport iPhone avec JS activé ET désactivé: ouverture+navigation OK, fond opaque rgb(245,243,238). playwright en devDependency. | v7: identité ROUGE (accent #ff5148, bordeaux #9e2a25 — vars --lime/--green conservent leurs NOMS, seules les valeurs changent) distincte de Lou-Ka. README détaillé (badges, IAAO, archi). Repo GitHub PUBLIC: https://github.com/spboucher-ai/vrai-prix (data/ exclue). | 2026-08-09 v8: agent IA « Ka » (page /ka + API /api/ka) — Claude Haiku 4.5 en streaming SSE, boucle agentique manuelle avec 11 outils serveur (chercher_propriete FTS, evaluer_propriete, comparables_detailles, indice_marche, stats_municipalite/provinciales, evaluer_parc, comparer_proprietes, estimation_manuelle, chercher_proprietes_secteur, liens_rapports), prompt caching system+tools, clarification si adresse ambiguë. ANTHROPIC_API_KEY dans ~/apps/vrai-prix/.env.local sur le node (jamais versionnée, .env* dans .gitignore). Lien Ka dans header+footer. | v8.1: Ka renforcé — recherche approximative (relaxation progressive FTS), outil dossier_complet (éval+marché+tendance+comps+synthèse en 1 appel), tableaux HTML dans le chat, fil à défilement interne (fix saut de page en streaming), mobile refait, 12 tours/2200 tokens. | 2026-08-11: recherche par CARTE (page /carte Leaflet+OSM, popups éditoriales, géolocalisation, garde de zoom) + API GET /api/nearby?lat&lng&halfLat&halfLng&limit (bbox sur idx_units_geo, plafonds serveur ~2,2 km / 400 unités) + nav Carte FR/EN. Dépendance leaflet ajoutée. Déployé (npm install + build + pm2 restart). Sert aussi l'app iOS native (ios/ dans le repo: SwiftUI 17+, onglet Carte MapKit, bundle ai.spboucher.vraiprix). | 2026-08-13: SSO « Se connecter avec KA ID » via le hub groupe-ka.com — src/lib/ka-auth.ts (node:crypto pur, zéro dépendance: vérif JWT HS256 du hub aud=vrai-prix + session cookie vp_ka_session signée KA_AUTH_SECRET, state embarqué signé sans cookie), routes /api/auth/ka/{login,callback} + /api/auth/{me,logout}, AccountButton dans le header (bilingue), page /compte = carte de membre Groupe KA (gabarit .pc encre+lime, accent rouge conservé ailleurs). Env node .env.local: + KA_SSO_SECRET/KA_HUB_URL/KA_BASE_URL/KA_AUTH_SECRET. Session sans stockage (aucune table users). Testé bout-en-bout curl (ka_id partagé OK). | 2026-08-13: carte de membre UNIFORMISÉE — marque « Groupe KA » sur la carte (plus la marque de l'app), même gabarit que le hub. Déployé+vérifié dans le bundle prod. | 2026-08-13: PROFIL HUB AFFICHÉ — hubprofile.py (fetch signé /api/sso/profile du hub, cache 60s), /api/auth/me enrichi (bio/city/job_title/company/age/website/socials/role_label/public_url/profile_source), page profil: badge statut sur la carte + section « Mon profil Groupe KA » lecture seule + bouton « Modifier sur groupe-ka.com ». Testé bout-en-bout. | 2026-08-13: /carte = Vrai-Prix Maps (Ka Maps, Mapbox 3D, tarball ~/ka-maps/) ; /api/nearby plafonds relevés (additif iOS) | 2026-08-13 SEO programmatique v9: metadataBase+canonical+og+JSON-LD (Organization/WebSite au layout; SingleFamilyResidence/Residence/Place+BreadcrumbList sur les fiches), generateMetadata /estimation/[id] (title=adresse+estimation, description unique), pages clientes scindées en wrapper serveur+*Client.tsx (accueil, methodologie, conditions, confidentialite, parc), pages programmatiques /municipalites + /municipalite/[slug] (1097) + /municipalite/[slug]/[type] (maison|plex|chalet|condo|terrain|maison-mobile|autre, ~5900 pages) — stats agrégées SQLite avec cache mémoire (src/lib/municipalites.ts), échantillon 24-30 fiches liées en HTML, voisines; sitemaps: /sitemap-index.xml (à SOUMETTRE dans Google Search Console) -> /sitemap.xml (7043 pages) + /estimation/sitemap/0-83.xml (45k fiches/fichier, plages rowid, force-dynamic); robots.ts (disallow /api/, /compte); noindex /compte + /estimation/manuelle; section municipalités sur l'accueil + lien footer. Vérifié curl prod (robots, 85 sitemaps, titles uniques, JSON-LD, 404). NB: premier build node avait échoué transitoirement (npm install en cours) — pipeline avec tail masque les exit codes, rebuild OK. | 2026-08-13 v9.1: README ultra-détaillé (10 captures Playwright prod dans docs/screenshots/, régénérables scripts/screenshots.mjs; visite guidée, section SEO, endpoints, env vars). Poussé sur origin git.spboucher.ai (3 commits: SSO, SEO, README). Push github ÉCHOUÉ: compte spboucher-ai SUSPENDU (403) — miroir GitHub à re-pousser une fois le compte rétabli. Redéployé+vérifié. | 2026-08-17 harmonisation ka-ui (tokens en layer(base) — gotcha Tailwind v4 : import brut non-layered écrase les utilities), badge+KaFooter+/contact, GET /api/stats (agrégats publics pour le hub), og/favicon, fix débordement 768 (nav md:→lg:), title suffixé. | 2026-08-18 : docs/PIPELINE-DONNEES.md ajouté au repo (pipeline batch laptop documenté pour continuité). | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud."51 },52 {53 "app": "groupe-ka",54 "node": "M3U96b",55 "port": 8110,56 "domain": "www.groupe-ka.com",57 "process_manager": "pm2",58 "label_or_name": "groupe-ka + groupe-ka-ngrok",59 "dir": "~/apps/groupe-ka",60 "start": "cd ~/apps/groupe-ka && pm2 start ./node_modules/.bin/next --name groupe-ka --interpreter none -- start -H 0.0.0.0 -p 8110 ; pm2 start /opt/homebrew/bin/ngrok --name groupe-ka-ngrok --interpreter none -- http --url=www.groupe-ka.com 8110",61 "deployed": "2026-08-13",62 "notes": "Plateforme corporative du holding Groupe KA — présente les 7 agrégateurs automatisés (Lou·Ka, Immo·Ka, Vrai-Prix, ValoPlex, Auto·Ka, Fabri·Ka, Food·Ka) avec leurs couleurs de marque. Next.js. | 2026-08-12 v2 « groupe global · ka = agrégation »: héros repensé (« Mille sites. Un seul ·Ka. », carte-définition dictionnaire ·Ka /ka/ suffixe = agréger, CTA), FIGURE D'AGRÉGATION SVG signature (section #flux: 10 chips de sites sources → faisceau de flèches animées en pointillés + pilule « 450+ connecteurs » → boîte KA « = agrégation » → split en 7 flèches vers les plateformes avec pastilles de marque; sablier ·Ka, scroll horizontal sur mobile, prefers-reduced-motion respecté), allusions ka=agrégateur partout (ticker, titres « Ce que nous agrégeons », CTA « Quelque chose à agréger ? », footer), nav +« L'agrégation », OG description corrigée (disait encore 3 plateformes). GOTCHA: colonnes de grille du héros en minmax(0,…fr) + min-w-0 sinon le rail de stat-chips (nowrap) gonfle le min-content et fait déborder la carte hors conteneur. Source laptop désormais: ~/Desktop/groupe-ka (rsync → node + ./node_modules/.bin/next build + pm2 restart groupe-ka). | 2026-08-13 v3: 5 NOUVELLES FIGURES (src/app/figures.tsx, le sablier y a été déplacé): pipeline vertical 5 stations avec boucle « resync en continu », cycle ·Ka (anneau pointillé animé, 4 gestes autour de KA « jour et nuit »), barres d'inventaire vivant (5 plateformes marketplace, une teinte verte, étiquettes directes + pastilles de marque — règles dataviz), matrice de connecteurs « un point = un connecteur » (317 points: Auto·Ka 124/Lou·Ka 108/Immo·Ka 65/Food·Ka 20), tuiles de couverture Vrai-Prix 3 747 008 / ValoPlex 393 867 + carte encre « l'équation ·Ka » (1000+ sites → 450+ connecteurs → 7 plateformes); nouvelle section #chiffres + nav « Chiffres » (hrefs nav passés en /#… pour marcher depuis les sous-pages). PAGES LÉGALES /conditions + /confidentialite (Loi 25, responsable = admin@groupe-ka.com, CAI mentionnée). COURRIELS @groupe-ka.com placés: contact@ (header, menu mobile, CTA, footer — projets/partenariats), info@ (CTA + footer — médias/questions générales), admin@ (footer + pages légales — légal/vie privée); footer avec bloc « nous joindre » 3 adresses + liens légaux; contact@spboucher.ai retiré de l'UI (reste dans les en-têtes auteur du code). | 2026-08-13 v4 — KA ID (hub d'identité du groupe): comptes courriel/mdp (scrypt) + connexion Google + SSO « Se connecter avec KA » pour toutes les plateformes. Better-sqlite3 (~/apps/groupe-ka/data/ka-id.db — EXCLU du rsync de déploiement, ne jamais l'effacer) + jose. Routes: /api/auth/{register,login,logout,me}, /api/auth/google + /api/auth/callback/google (id_token vérifié via JWKS), /sso/authorize (client_id+redirect_uri whitelistés dans src/lib/sso.ts, jeton HS256 5 min signé du secret partagé par client), pages /connexion + /compte, UserButton header + « Mon KA ID » menu mobile. .env.local sur le node (chmod 600): BASE_URL, KA_AUTH_SECRET, KA_SSO_SECRET_LOU_KA (partagé avec lou-ka), GOOGLE_CLIENT_ID/SECRET = client OAuth DÉDIÉ « Groupe KA » créé par l'utilisateur le 2026-08-13 (380896406983-1ph2…, même projet GCP que lou-ka; origine https://www.groupe-ka.com + redirect https://www.groupe-ka.com/api/auth/callback/google enregistrés). Connexion Google ACTIVE (authorize vérifié 302). Nav desktop passée à lg (débordait entre md et lg avec 6 items + 2 boutons). SSO testé bout-en-bout par curl (register hub → ka/login lou-ka → jeton → session lou-ka, compte test supprimé des 2 DB). LOU-KA MODIFIÉ EN MÊME TEMPS (voir entrée lou-ka). | 2026-08-13 KA ID v1 : colonne users.ka_id (unique, « ka- »+10 chiffres) créée AU HUB (source de vérité du groupe) — attribution à l'inscription courriel + Google, rattrapage auto à l'ouverture de la DB, claim ka_id dans le jeton SSO /sso/authorize, affichage sur /compte. SECRETS dans ~/apps/groupe-ka/.env.local sur le node (KA_SSO_SECRET_LOU_KA = KA_SSO_SECRET de lou-ka) — ⚠️ TOUJOURS exclure .env* et data/ des rsync --delete. DB hub: ~/apps/groupe-ka/data/ka-id.db. | 2026-08-13 v5: KA-ID minté PAR LE HUB (colonne users.ka_id + ensureKaId, transporté dans le jeton SSO — les plateformes l'adoptent), last_login, /compte refait = CARTE DE MEMBRE Groupe KA (gabarit .pc de Lou·Ka porté en .mc dans globals.css: fond encre, filigrane KA, KA-ID mono lime glow, bande code-barres) + grille d'infos + copier KA-ID. Secrets SSO générés pour les 7 clients (KA_SSO_SECRET_{LOU_KA,IMMO_KA,VRAI_PRIX,VALOPLEX,AUTO_KA,FABRI_KA,FOOD_KA}) et distribués aux nœuds des apps. ⚠️ INCIDENT 2026-08-13: ~/apps/groupe-ka/.env.local a été écrasé (probable déploiement parallèle avec --delete) → Google/KA_AUTH_SECRET perdus, reconstruit; BACKUP désormais dans ~/.groupe-ka.env.backup sur M3U96b (chmod 600) — le restaurer si ça se reproduit; TOUJOURS exclure .env* ET data/ des rsync de cette app. | 2026-08-13 v6: CODE QR sur la carte de membre /compte (lib qrcode, data-URL PNG, cadre lime) pointant vers la page publique /m/{ka_id} qui transmet le profil (nom, avatar, ancienneté, badge « authentique et actif » — jamais le courriel; ID invalide → introuvable; noindex). Apple Wallet (.pkpass) faisable ensuite: nécessite un Pass Type ID + certificat du compte développeur Apple de l'utilisateur (pas encore créé). NOTE RÉSEAU: si SSH Tailscale vers M3U96b timeout alors que le site répond, déployer via rebond LAN: rsync -e 'ssh -A -J M3U96a' vers simon-pierreboucher@192.168.2.82 (IP DHCP, re-vérifier). | 2026-08-13 v7: APPLE WALLET ACTIF (cert Pass Type ID pass.com.groupe-ka.membre installé 2026-08-13, expire 2027-09-12 — RENOUVELER avant via developer.apple.com avec le CSR/clé de ~/Desktop/groupe-ka-wallet/) — /api/wallet/pass génère un .pkpass signé (pass.json générique encre/lime avec KA-ID + QR /m/{ka_id} + backfields, icônes assets/wallet/ générées PIL, manifest SHA-1, signature PKCS#7 via openssl smime, zip) ; bouton « Ajouter à Apple Wallet » sur /compte rendu SEULEMENT si env KA_PASS_DIR+KA_PASS_TYPE_ID présents. Sur le node: ~/apps/groupe-ka/wallet/ contient déjà pass-key.pem + wwdr.pem (chmod 600). RESTE À FAIRE (utilisateur): créer Pass Type ID (ex. pass.com.groupe-ka.membre) + certificat sur developer.apple.com avec le CSR ~/Desktop/groupe-ka-wallet/Groupe-KA-Pass.certSigningRequest (clé privée locale ~/Desktop/groupe-ka-wallet/pass-key.pem, Team ID 3YM54G49SN) ; puis convertir pass.cer→pass-cert.pem, scp vers wallet/, ajouter au .env.local KA_PASS_DIR=/Users/simon-pierreboucher/apps/groupe-ka/wallet + KA_PASS_TYPE_ID + KA_PASS_TEAM_ID=3YM54G49SN, pm2 restart. | Wallet vérifié en prod: /api/wallet/pass → 200 application/vnd.apple.pkpass, signature PKCS#7 valide (chaîne WWDR G4 + Pass Type ID), QR = /m/{ka_id}, bouton visible sur /compte. | 2026-08-13 v8: PHOTO DE PROFIL — upload sur /compte (POST/DELETE /api/profile/avatar, multipart ≤8 Mo, sharp rotate+cover 512×512 JPEG q88, stockée data/avatars/{ka_id}.jpg — data/ exclue des rsync), servie publiquement par GET /avatars/{ka_id} (cache 1h), avatar_url = URL absolue+cache-bust → voyage dans le jeton SSO (toutes les plateformes l'affichent à la connexion suivante). Carte Wallet: vignette thumbnail(@2x/@3x).png générée de la photo. Page QR /m/{ka_id} refaite en PAGE D'IDENTIFICATION: grande photo ronde 176px (ou initiale), nom en gros, badge « Membre vérifié », carte KA-ID encre/lime, grille d'infos (identifiant, membre depuis, dernière connexion, type de compte, valide sur les 7 plateformes) — jamais le courriel. Testé bout-en-bout (upload+recadrage+page+pkpass avec thumbnails, compte test nettoyé). | 2026-08-13 v9: TYPES DE COMPTE obligatoires à l'inscription (src/lib/roles.ts: membre « Utilisateur des plateformes » / fournisseur « Fournisseur · partenaire » / equipe « Équipe Groupe KA ») — sélecteur cartes radio dans AuthForm (register 400 sans rôle), comptes Google choisissent via RolePicker sur /compte (bandeau tant que role NULL), POST /api/profile/role. AFFICHÉ SUR LA CARTE: badge lime rotaté .mc-holder-role sous le nom, ligne « Type de compte » dans la grille, « Statut » sur la page /m/{ka_id}, champ STATUT sur le pass Apple Wallet, claim ka_role dans le jeton SSO. Compte de l'utilisateur spbou4@protonmail.com (ka-4693099255) marqué role=equipe en base à sa demande. Testé bout-en-bout. | 2026-08-13 v10: PROFIL ENRICHI = SOURCE DE VÉRITÉ DU GROUPE — colonnes users bio/city/phone/website/job_title/company/birth_date/socials(JSON 6 réseaux)/public; éditeur complet sur /compte (ProfileForm: nom affiché, bio 280, ville, emploi, entreprise, date de naissance→âge calculé, téléphone, site, 6 réseaux; POST /api/profile) + toggle PROFIL PUBLIC (POST /api/profile/public) avec lien groupe-ka.com/u/{ka_id}; page publique /u/{ka_id} (opt-in, grande photo, badge statut, bio, emploi·entreprise, ville, âge, chips site+réseaux, lien vérif /m/, privé=introuvable indistinct, JAMAIS courriel/téléphone); API SERVEUR-À-SERVEUR pour les plateformes GET /api/sso/profile?client_id&ka_id&ts&sig (HMAC-SHA256 du secret SSO du client sur `client.ka_id.ts`, fenêtre ±5 min) → profil complet JSON (incl. email/phone — plateformes de confiance). Les plateformes doivent afficher CE profil sur leurs pages utilisateur (lou-ka corrigé le premier). Testé bout-en-bout. | 2026-08-13 v11: CARTE PHYSIQUE & NFC — section sur /compte (lien https://www.groupe-ka.com/m/{ka_id} à écrire sur puce NTAG215 + bouton copier + mode d'emploi NFC Tools en 5 étapes) et page /compte/carte = carte IMPRIMABLE format CR80 exact (85,6×54 mm, rayon 3,18 mm, repères de découpe pointillés, print-color-adjust, @media print masque header/ticker/footer/grain): recto encre (marque, KA-ID lime, nom, badge statut, membre depuis, photo) + verso blanc (QR 30 mm, « Tapez la carte (NFC) ou scannez », zone pointillée où coller la puce, liste des 7 plateformes). | 2026-08-13 v12: FAVORIS UNIFIÉS « MON UNIVERS KA » — le hub est LE magasin central: table favorites (user_id+app+item_id uniques, title/subtitle/price_label/image_url/url/meta), API serveur-à-serveur /api/sso/favorites (POST add/remove + GET ?scope=app|all, HMAC verifyClientSig factorisé dans src/lib/sso.ts), API session /api/favorites (GET + POST remove), section « Mon univers Ka » sur /compte (groupée par app avec pastilles de marque, vignettes, prix, lien profond, bouton retirer, état vide pédagogique). Testé bout-en-bout: ♥ posé sur lou-ka → visible sur /compte du hub → retiré → disparu. | 2026-08-13 : Sign in with Apple ajouté (Services ID com.groupe-ka.web, Team 3YM54G49SN, Key 2L3VSACA87 ; APPLE_* dans .env.local, clé .p8 aussi sur le laptop ~/Desktop/AuthKey_2L3VSACA87.p8). Colonne apple_sub en DB. NB: SSH M3U96b depuis le laptop = ProxyJump via M3U96a (192.168.2.82) — port 22 Tailscale/LAN direct bloqué, voir ~/.ssh/config. | 2026-08-13 v2: boutons OAuth officiels (G coloré/pomme noire), icône compte dans le header mobile (retirée du menu déroulant), README avec badges+captures. Source versionnée: https://git.spboucher.ai/groupe-ka (spbgit). | 2026-08-13 v13: SECTION KA2 (#ka2, entre socle et manifeste) — l'agent de découverte web du groupe (www.ka2.bot, bot IA de cartographie du web québécois, Claude Haiku 4.5 + Firecrawl/Scrapfly, robots.txt/Loi 25): carte produit wordmark Ka[2] + carte encre « Ka2 découvre → ·Ka agrège → vous trouvez »; nav « Ka2, le bot », ligne ticker, lien footer. Commit 62bfdb2. | 2026-08-13 v14: KA4 AJOUTÉ — la section devient #bots (« les bots découvrent »): cartes jumelles Ka[2] (lime) + Ka[4] (orange #ff9f45, 5 types d'entités, tableau de bord live) via tableau BOTS, carte encre commune pleine largeur « Les bots découvrent → ·Ka agrège »; nav « Les bots » (/#bots), ticker « Ka2 & Ka4 », footer +Ka4 (www.ka4.bot). Commit a966e8c. | 2026-08-13 v15: PAGE /loi-25 « Protection des renseignements personnels (Loi 25) » — politique complète (15 cartes: responsable = Simon-Pierre Boucher / admin@groupe-ka.com, nature d'agrégateur de contenu public, tableau des 7 apps et données traitées, note estimations automatisées Vrai-Prix/ValoPlex, témoins essentiels seulement — pas de bandeau requis, hébergement Canada, droits + CAI, retrait 48-72h ouvrables via admin@, incidents, MAJ 13 août 2026); lien footer + lien croisé depuis /confidentialite. Commit 7959e3b. | 2026-08-13 v16: PAGE /bots « Déclaration de transparence — robots d'indexation » — 8 principes communs (données publiques, robots.txt, identification, charge minimale, extraits seulement, journalisation, retrait 48-72h via admin@, Loi 25/LPRPDE), fiches ka·2 (cartographie générale, 4 types), ka·4 (élargie, 5 types + live) et ka·6 (NOUVEAU bot — créateurs/influenceurs QC, www.ka6.bot, droit de retrait renforcé), « ce que nos robots ne font pas », section exploitants de sites (fréquence/exclusion/partenariat contact@); lien footer « Transparence des robots d'indexation », Ka6 ajouté aux liens footer, lien croisé /loi-25 ↔ /bots. NB: page /bots ≠ ancre /#bots de l'accueil. Commit 98e410b. | 2026-08-13 v17: PAGES /retrait + /avis. /retrait « Politique de retrait et de révision » — Partie A retrait d'annonces (qui peut demander, 6 motifs, procédure, table des preuves minimales src-table, avertissement anti-pièce-d'identité encadré pointillé, liste d'exclusion), Partie B Vrai-Prix/ValoPlex (B1 révision de données, B2 arrêt de couverture avec preuve de propriété + liste d'exclusion permanente, B3 copropriétés), traitement/refus/recours CAI (retrait 48-72h, révisions ≤10 j ouvrables); tout via admin@groupe-ka.com. /avis « Notre rôle d'agrégateur » — clause « AUCUN CONTRAT » en encadré encre/lime en tête, puis « en conséquence » (ni vendeur/courtier, sources tierces à vérifier, estimations indicatives, aucune commission). FOOTER: ligne d'avis en évidence (bordure lime « nous ne vendons rien… » + En savoir plus → /avis) + liens légaux /retrait et /avis; liens croisés /loi-25→/retrait et /bots→/retrait. Commit 72e8cd1. | 2026-08-13 v18: TROUVE·KA PRODUIT PHARE — section #trouve-ka juste après le héros (carte moteur: wordmark Trouve[Ka] bleu #b9cfee, barre de recherche factice, chips, 4 features, CTA; carte encre « Les grands moteurs cherchent le monde. Trouve·Ka cherche le Québec. »); héros « sept agrégateurs et un moteur de recherche » + chip; rangée socle (8 plateformes); nav +« Moteur » — BREAKPOINT NAV lg→xl + libellés raccourcis (Socle/Bots) + whitespace-nowrap + px-3 (8 items débordaient à 1024-1280); ticker; footer Trouve·Ka en tête de liste; meta description; ajouté à /avis, /loi-25 (rangée tableau moteur de recherche) et /retrait. Trouve-ka live: M2M32:3000, ~57k pages/7.9k domaines au moment de l'ajout (croissance ~36k pages/h — chiffres volontairement non figés sur le site). Commit 7378bce. | 2026-08-17 : ajout des 3 nouveaux agrégateurs Resto·Ka, Sorti·Ka et Créa·Ka (cartes 08-09-10 avec badge Nouveau, données réelles des APIs), refonte des cartes produits (bande d'accent de marque, numéro en pastille encre/accent, étiquette de marché, puces couleur marque, 10e carte pleine largeur), figures à 10 plateformes/13 sources/340 connecteurs, socle 11 plateformes, ticker+footer+OG à jour. Rebuild + pm2 restart OK. Commit 2389176 pushé sur git.spboucher.ai/groupe-ka. | 2026-08-17: client SSO crea-ka ajouté au registre KA ID (sso.ts + KA_SSO_SECRET_CREA_KA en env), rebuild + pm2 restart OK (commit a656d95). | 2026-08-17 : .env RESTAURÉ (7 secrets KA_SSO_SECRET_* — était absent, SSO KA ID cassé pour toutes les plateformes) + client sorti-ka inscrit au registre SSO (src/lib/sso.ts), rebuild + restart. | 2026-08-17 (2) : PDF « L'agrégation, expliquée » (12 pages A4 paysage, schémas sablier/pipeline/cycle/bots/Trouve·Ka/inventaire/flotte/moteurs/socle/manifeste) — source assets/poster/groupe-ka-agregation.html (figures JS, rendu via chrome-headless-shell de playwright ~/Library/Caches/ms-playwright), servi sur /documents/groupe-ka-agregation.pdf (public/), bouton de téléchargement dans #flux. | 2026-08-17 HARMONISATION ÉCOSYSTÈME : hub du design system ka-ui (repo spbgit ka-ui — tokens éditorial sharp + accents 12 marques + ecosystem.json centralisé + og/favicons). SSO RÉPARÉ (le .env.local avait été écrasé → restauré de ~/.groupe-ka.env.backup, secrets par client resynchronisés depuis les satellites, backup re-synchronisé) ; clients api-ka + trouve-ka ajoutés (14 clients). Métriques LIVE (src/lib/live.ts ← /api/stats des plateformes, ISR 10 min, replis) : ticker, héros, cartes, figures, socle. Page /status v2 avec HISTORIQUE (pm2 cron groupe-ka-status-tick 5 min → /api/status/tick → data/status/history.jsonl 90 j ; barres 24 h + 90 j, uptime 24h/7j/30j). API·Ka au footer. og.png/favicon.svg servis. | 2026-08-17 (2) : tableau de bord MAÎTRE /stats (ecostats.ts — consolidation live des dashboards satellites, classement, blocs par plateforme, chips de période) + proxy /api/stats/ecosystem-report (streaming vers api-ka). Job·Ka intégré partout : client SSO (14→15 clients), métriques live (live.ts jobka), ticker, carte plateforme 11, socle, figures (accents officiels corrigés), footer, comptes status/stats dynamiques (13 plateformes). | 2026-08-18 (commit 71c6515) : hub exploite les champs riches des /api/stats (loyer/prix/salaire moyens, géo, santé des syncs, bloc Immo×Vrai-Prix écart +9%, trouve-ka live) ; hardcodes corrigés (SORTIKA_CONNECTORS, ticker plex daté). MANQUE .env : APPLE_* (Sign-in Apple mort) + KA_SSO_SECRET_TOIT_KA. | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud."63 },64 {65 "app": "spbgit",66 "node": "M3U96a",67 "port": 7420,68 "domain": "git.spboucher.ai",69 "process_manager": "pm2",70 "label_or_name": "spbgit-server + spbgit-tunnel",71 "dir": "~/srv/spbgit/app",72 "start": "cd ~/srv/spbgit/app && SPBGIT_LOG_DIR=$HOME/srv/spbgit/logs SPBGIT_NGROK_CONFIG=$HOME/srv/spbgit/ngrok.resolved.yml pm2 start deploy/ecosystem.config.cjs --update-env",73 "deployed": "2026-08-09",74 "notes": "SPB Git — plateforme git personnelle complète (forge auto-hébergée, équivalent GitHub perso). Fastify 5 :7420 (loopback), Smart HTTP v2 streamé (clone public, push par PAT argon2id), UI SSR Nunjucks (README GitHub-grade badges/mermaid/shiki, heatmap, blame, diffs, OG cards, feed.atom, sitemap), API /api/v1, CLI spbgit (init/create/clone/status/sync/doctor…). Données: ~/srv/git (repos bare = source de vérité), ~/srv/spbgit/{data,cache,logs,backups}. Node IMPOSÉ par le CLAUDE.md du projet (~/Desktop/git) malgré la règle M3U96a=staging. pm2 save fait; tunnel ngrok en exp_backoff (self-heal). ⚠️ BLOQUANT UNIQUE: réserver git.spboucher.ai dans dashboard.ngrok.com/domains (le CNAME GoDaddy existe déjà → ngrok-cname). Backup nightly cron 03:15 deploy/backup.sh (garde 14). Token bootstrap remis à l'utilisateur (jamais stocké en clair — argon2 dans data/tokens.json). Source laptop: ~/Desktop/git (repo git local, commits conventionnels). En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai sur chaque fichier."75 },76 {77 "app": "immo-ka",78 "node": "M4M64a",79 "port": 8096,80 "domain": "www.immo-ka.com",81 "process_manager": "pm2",82 "label_or_name": "immo-ka-web + immo-ka-sync + immo-ka-ngrok",83 "dir": "~/apps/immo-ka",84 "start": "pm2 start .venv/bin/python --name immo-ka-web --interpreter none --cwd ~/apps/immo-ka -- run.py serve 8096 ; pm2 start .venv/bin/python --name immo-ka-sync --interpreter none --cwd ~/apps/immo-ka -- run.py watch 60 ; pm2 start /opt/homebrew/bin/ngrok --name immo-ka-ngrok --interpreter none -- http --url=www.immo-ka.com 8096",85 "deployed": "2026-08-12",86 "notes": "Agregateur proprietes A VENDRE au Quebec. Frontend React18+Vite+TS+MapLibre (qualite Lou-Ka): Home filtres+grille+carte, fiche par propriete (galerie+lightbox, specs, tableau caracteristiques Centris, tableau pieces+dimensions, inclusions, historique prix, courtier, mini-carte), Stats, Agences. Backend FastAPI+SQLite, dedup par no Centris (web.py). 65 CONNECTEURS. 13 agences actives: RE/MAX central (~25k, Meilisearch+sharding FSA+detail enrichi), Proprio Direct (~2.4k), Via Capitale (~5.3k Firecrawl), Sutton, Barnes, M Immobilier, KW Urbain, Vendirect, Sotheby's, Profusion (357), Engel&Volkers (1240), KW Distinction (167), L'Expert PM (expertimmobilierpm.com) + 52 sous-agences RE/MAX backup (remax_ag_*, dedup no Centris). Caracteristiques detaillees (chauffage/toiture/annee/stationnement...) captees pour RE/MAX + kw_urbain/proprio/barnes/m/via_capitale/sutton. A_FAIRE (verrouilles): royal_lepage (ESRI da_id), century21 (moxiworks WAF 503), exp_quebec (BoldTrail XHR). Watch 180min. Source ~/Desktop/agent-courtage. | 2026-08-13: connexion « Se connecter avec KA ID » via le hub groupe-ka.com — immoka/auth.py: routes /api/auth/ka/login + /api/auth/ka/callback (JWT HS256 stdlib, aud=immo-ka, users keyed par ka_id du groupe), /me expose enabled avec KA, menu compte frontend affiche le KA-ID. .env node: + KA_SSO_SECRET/KA_HUB_URL/IMMOKA_BASE_URL/AUTH_SECRET. PIÈGE RÉGLÉ: le web.py du nœud était antérieur au laptop (pas d'include_router(auth)) → /api/auth/* tombait dans le catch-all SPA (renvoyait le HTML). Package immoka/ resynchronisé en entier. Testé bout-en-bout curl (ka_id partagé OK). | 2026-08-13 v2: bouton compte sorti de .nav (masquée <760px → invisible sur téléphone) vers .auth-slot toujours visible; pilule NOIRE « KA ID » avec badge KA lime (plus de hover transparent), règles mobiles dédiées. Vérifié par screenshot mobile prod. | 2026-08-13 v3: PAGE PROFIL CRÉÉE (/profil, route + menus) — carte de membre GROUPE KA complète (gabarit .pc, encre/lime identité groupe, badge statut, copier KA-ID, bande code-barres), section « Mon profil Groupe KA » lecture seule (bio/emploi·entreprise/ville/âge/site/réseaux avec 6 icônes maison) + « Modifier sur groupe-ka.com »; immoka/hubprofile.py + /api/auth/me enrichi (profile_source, ancienneté locale+hub). Testé bout-en-bout. | 2026-08-13 v4: FAVORIS ♥ (magasin central = hub, zéro stockage local) — immoka/hubfav.py + immoka/favorites.py (GET /api/favorites {ids,items}, POST /toggle; 401 sans session ou compte non ka-), ♥ sur cartes (grille) + galerie fiche, contexte AccountProvider (toggle optimiste), menu « Mes favoris — Mon univers Ka ». Testé bout-en-bout. | 2026-08-13: VRAIPRIX_DB branché (.env → data/vraiprix.db, 1,75 Go copié de M3U96a) ; backend Ka Maps déployé (geojson bbox/limit/totaux, index géo, watch = geocode batch + vraiprix_local/cycle) ; 59k+ estimations en prod | frontend Ka Maps (Mapbox 3D) déployé | 2026-08-13 SEO: rendu HTML côté serveur (immoka/seo.py) — le catch-all sert du HTML complet par route (title/meta/canonical/og uniques, JSON-LD RealEstateListing+Offer+BreadcrumbList, contenu+liens dans #root que React remplace). Pages programmatiques /a-vendre/{ville}[/{type}] et /type/{type} (seuil 3 annonces, stats médiane/moyenne, pagination 48, maillage interne), fiches /propriete/{uid}/{slug} (301 depuis l'uid nu, 410 Gone si active=0, 404 réel), robots.txt, sitemap index + fiches-N/villes/villes-types/types/pages.xml (lastmod, cache 1 h). Frontend: routes SPA miroirs (pages/Category.tsx, resolveSeo /api/seo/resolve), slugs partagés Python/TS (slugify identique), document.title dynamique. Vérifié curl prod: accueil 57 913, ville/type OK, 301/410/404 OK, sitemaps 57 913 fiches + 1 589 villes + 2 702 villes-types. | 2026-08-17 harmonisation ka-ui (accent cerise #e23744, badge, KaFooter, /contact, /profil branché — AccountProvider n'était monté nulle part, api.ts complété), og/favicon, title suffixé. NB kamaps/ + Category.tsx exclus du tsc (tarball ka-maps absent). | 2026-08-18 CAMPAGNE CONNECTEURS (commits 7911d58 + e9bc9d7 + 7c5bc1b) : barnes 403 → clé Algolia auto-extraite ; CAUSE RACINE parseur remax (tableau Libellé|Valeur inversé, details historiques = bruit) → réécrit label-first + taxes/éval (cache v4, re-parse 1 cycle) ; via_capitale détail (Firecrawl budget 200/c) ; kijiji attrs étendus ; JOINTURE RÔLE vraiprix.db : year_built 20→67%, lot_sqft 17→62%, valeurs officielles sur 55k fiches ; sutton/RLP/lespac fiches (taxes, frais condo, revenus plex, galeries) ; days_on_market ; dédup adresse +1 748 ; registre 95→92 ; docs générées. | VAGUE 3 (feaefa8) : Realtor.ca DÉBLOQUÉ (Scrapfly ASP rejoue PropertySearch_Post, 2 145 fiches, dédup MLS auto → 343 uniques), Sotheby's 60→869 (ajax_results.php, piège p_status), +7 agences source.immo dont ciemcq/mon-toit.net 3 920 fiches, Guide Habitation 95 projets neufs. 100 sources, 145 727 fiches. | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud."87 },88 {89 "app": "auto-ka",90 "node": "M4M64b",91 "port": 8095,92 "domain": "www.auto-ka.com",93 "process_manager": "pm2",94 "label_or_name": "auto-ka-web / auto-ka-sync / auto-ka-ngrok",95 "dir": "~/auto-ka",96 "start": ".venv/bin/python run.py serve 8095 | watch 120 | ~/bin/ngrok http --url=www.auto-ka.com 8095",97 "deployed": "2026-08-12",98 "notes": "Agrégateur voitures usagées QC — 35 connecteurs concessionnaires (D2C Media, SM360, AMVOQ, Convertus, EvalAuto, customs), FastAPI + React, SQLite. Firecrawl pour 3 sites Cloudflare (clé dans .env). IMPORTANT: utiliser ~/bin/ngrok (le ngrok homebrew gèle sur ce node). | 2026-08-13: SSO « Se connecter avec KA ID » via le hub groupe-ka.com — autoka/auth.py (modèle immoka: JWT HS256 stdlib aud=auto-ka, users keyed ka_id, cookie autoka_session signé SESSION_SECRET), include_router avant le catch-all SPA, AccountMenu header (pastille KA) + page /profil carte de membre Groupe KA. Env node .env: + KA_SSO_SECRET/KA_HUB_URL/AUTOKA_BASE_URL/SESSION_SECRET. Healthcheck local via python urllib (curl 127.0.0.1 se fige sur M4M64b). Testé bout-en-bout curl (ka_id partagé OK). | 2026-08-13: carte de membre UNIFORMISÉE — marque « Groupe KA » sur la carte (plus la marque de l'app), même gabarit que le hub. Déployé+vérifié dans le bundle prod. | 2026-08-13: PROFIL HUB AFFICHÉ — hubprofile.py (fetch signé /api/sso/profile du hub, cache 60s), /api/auth/me enrichi (bio/city/job_title/company/age/website/socials/role_label/public_url/profile_source), page profil: badge statut sur la carte + section « Mon profil Groupe KA » lecture seule + bouton « Modifier sur groupe-ka.com ». Testé bout-en-bout. | 2026-08-13 v2: FAVORIS ♥ hub — autoka/hubfav.py + fav_router (/api/favorites + /toggle), ♥ sur VehicleCard + fiche (galerie), account.tsx contexte, vehicleFavItem (année marque modèle · concessionnaire·région, /vehicule/{uid}), menu « Mes favoris ». Testé bout-en-bout. | 2026-08-13 SEO: rendu HTML côté serveur (autoka/seo.py) — meta uniques (title/description/canonical/og/hreflang fr-CA), JSON-LD Car+Offer+ItemList+BreadcrumbList, contenu complet dans #root que React remplace. Pages programmatiques /usagees/{marque}[/{modele}], /region/{r}, /ville/{v}, /carrosserie/{c} (liste blanche 10 carrosseries propres), /motos|/scooters/{marque} (~900 pages). Fiches /vehicule/{uid}/{slug} (301 depuis uid nu, slug année-marque-modèle partagé Python/TS, sans trim), 410 Gone si active=0, 404 réels (catch-all). robots.txt + sitemap.xml dynamique (index + pages.xml + vehicules-N.xml par 10k, lastmod). GZipMiddleware. Frontend: SeoListing.tsx lit window.__SEO_CTX__ injecté par le serveur, routes SPA miroirs, document.title dynamique. Vérifié curl prod (accueil 17 082 véhicules en HTML, 301/404/410 OK). RESTE (utilisateur): soumettre le sitemap dans Google Search Console. | 2026-08-17 harmonisation ka-ui (accent #ff5a2a, badge, KaFooter, /contact), og/favicon (+SSR), title suffixé. Lenteur home = images CDN concessionnaires (2 Mo, TTFB 2-3 s) — documenté, pas de fix simple. | 2026-08-18 CAMPAGNE CONNECTEURS (commits 2a35ac2 + bbc070b) : Carfax cascade (D2C badge HTML), fuelConsumption/structuralDamage/listed_at AED, specs moto HTML (fuel/rouage/carrosserie 0→100%), fix magnetis @graph (VIN/photos 0→100%), GPS lat/lng + villes_gps 216 villes (97% actifs) ; DÉDUP VIN (2 315 masqués) ; NOUVEAU kijiji particuliers (+3 002, GPS exact ; kijijiautos.ca n'existe plus) ; rappels Transports Canada (16 969, /api/vehicles/{uid}/recalls) ; table dealers 138/138 ; 139 sources ; docs générées. | VAGUE 3 (4a7b276) : +26 164 annonces — otogo API JSON publique INVENTAIRE COMPLET (23 700, VIN 99%, GPS exact, 0 crédit), autotrader/AutoHebdo direct (1 960, 0 crédit), cargurus deal ratings (ASP 1 crédit/req). Dédup VIN 8 438 masqués. 37 770 visibles, 142 sources. | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud."99 },100 {101 "app": "fabri-ka",102 "node": "M4M64a",103 "port": 8097,104 "domain": "www.fabri-ka.com",105 "process_manager": "pm2",106 "label_or_name": "fabri-ka-web / fabri-ka-sync / fabri-ka-ngrok",107 "dir": "~/fabri-ka",108 "start": ".venv/bin/python run.py serve 8097 | watch 360 | ngrok http --url=www.fabri-ka.com 8097",109 "deployed": "2026-08-12",110 "notes": "Agrégateur de produits québécois (marketplace de découverte). Source: ~/Desktop/qc-store. Connecteurs Shopify/WooCommerce/Squarespace génériques pilotés par data/stores.json (1354 boutiques QC, 284 connectables). Resync auto aux 6h. | 2026-08-13: SSO « Se connecter avec KA ID » via le hub groupe-ka.com — fabrika/auth.py (JWT HS256 stdlib aud=fabri-ka, users keyed ka_id, cookie fabrika_session signé SESSION_SECRET), AccountMenu header + page /profil carte de membre Groupe KA (tokens --ka-ink/--ka-lime ajoutés, --font-mono système). Env node .env: + KA_SSO_SECRET/KA_HUB_URL/FABRIKA_BASE_URL/SESSION_SECRET. Testé bout-en-bout curl (ka_id partagé OK). | 2026-08-13: carte de membre UNIFORMISÉE — marque « Groupe KA » sur la carte (plus la marque de l'app), même gabarit que le hub. Déployé+vérifié dans le bundle prod. | 2026-08-13: PROFIL HUB AFFICHÉ — hubprofile.py (fetch signé /api/sso/profile du hub, cache 60s), /api/auth/me enrichi (bio/city/job_title/company/age/website/socials/role_label/public_url/profile_source), page profil: badge statut sur la carte + section « Mon profil Groupe KA » lecture seule + bouton « Modifier sur groupe-ka.com ». Testé bout-en-bout. | 2026-08-13 v2: FAVORIS ♥ hub — fabrika/hubfav.py (router /api/favorites + /toggle inclus dans web.py), ♥ overlay sur ProductCard (Home/Catalog/similaires) + fiche produit, FavoritesProvider optimiste, productFavItem (/produits/{uid}), menu « Mes favoris ». Testé bout-en-bout. | 2026-08-17 harmonisation ka-ui (accent terracotta, badge, KaFooter, /contact) + SSO RÉPARÉ (KA_SSO_SECRET manquait du .env → ajouté ; FABRIKA_BASE_URL défaut localhost → prod). Header 768 réparé (flex:none + bascules 1024/1280/1360), og/favicon (+SSR), title suffixé. | VAGUE 3 (625b5e3) : 4 annuaires (Pages Vertes +127, Garde-Manger QC +97, Terroir et Saveurs +47, MIAM +21) → +283 boutiques (3 507), +99 connectables (1 568), +6 004 produits net (301 534) ; purge qualité provancher (4 150 billets de visites). Etsy 403 documenté. | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud. | 2026-08-19 Phase 3 expansion: registre 3507->3947 boutiques (+440: CARTV bio/SIPAB 340, CTAQ 56, vendors collectifs 28, acheterquebecois-MTL 22, epipresto+laboiteagrains re-testés via curl), produits publiés 299k->347k (+48k); champ certifications (1679 fiches), statut « présumée fermée » (fail_streak>=12, 8 mortes dépubliées, réversible); canal auto-inscription /inscrire -> POST /api/inscriptions (pending, honeypot+rate-limit, admin X-Admin-Token=FABRIKA_ADMIN_TOKEN dans .env); docs/CONFORMITE.md (REQ écarté: Cloudflare+CC-BY-NC-SA; UPA app morte; Goûtez Lanaudière Eudonet 404). Commits 0199f91->be73a3f."111 },112 {113 "app": "food-ka",114 "node": "M4M64b",115 "port": 8097,116 "domain": "www.food-ka.com",117 "process_manager": "pm2",118 "label_or_name": "food-ka-web / food-ka-sync / food-ka-ngrok",119 "dir": "~/apps/food-ka",120 "start": ".venv/bin/python run.py serve 8097 | .venv/bin/python run.py watch 360 | ~/bin/ngrok http --url=www.food-ka.com 8097",121 "deployed": "2026-08-12",122 "notes": "Agrégateur produits d'épicerie QC (20 connecteurs, ~22k produits). ATTENTION: utiliser ~/bin/ngrok (celui de homebrew se fige). Clés Scrapfly/Firecrawl dans .env. | 2026-08-13: SSO « Se connecter avec KA ID » via le hub groupe-ka.com — foodka/auth.py (JWT HS256 stdlib aud=food-ka, users keyed ka_id, cookie foodka_session signé SESSION_SECRET), AccountMenu header + « Mon compte » au menu mobile + page /profil carte de membre Groupe KA. Env node .env: + KA_SSO_SECRET/KA_HUB_URL/FOODKA_BASE_URL/SESSION_SECRET. Fix layout mobile ≤760px (compte à droite avant le hamburger). Testé bout-en-bout curl (ka_id partagé OK). | 2026-08-13: carte de membre UNIFORMISÉE — marque « Groupe KA » sur la carte (plus la marque de l'app), même gabarit que le hub. Déployé+vérifié dans le bundle prod. | 2026-08-13: PROFIL HUB AFFICHÉ — hubprofile.py (fetch signé /api/sso/profile du hub, cache 60s), /api/auth/me enrichi (bio/city/job_title/company/age/website/socials/role_label/public_url/profile_source), page profil: badge statut sur la carte + section « Mon profil Groupe KA » lecture seule + bouton « Modifier sur groupe-ka.com ». Testé bout-en-bout. | 2026-08-13 v2: FAVORIS ♥ hub — foodka/hubfav.py + routes /api/favorites + /toggle (502 explicite si hub muet), ♥ sur ProductCard + fiche (price-fav), favorites.tsx optimiste avec rollback, productFavItem (bannière·format, solde avec rég., /produit/{uid}), menu « Mes favoris ». Testé bout-en-bout. | 2026-08-17 harmonisation ka-ui : ACCENT VERT MARCHÉ #1f9d55 (fini le lime du hub), WIP SSO KA ID+favoris activé (buildé+déployé), badge, KaFooter, /contact, og/favicon, fix débordement 768 (bascule header 880 px). | 2026-08-18 CAMPAGNE CONNECTEURS (commits afdb2e6 + a45aeb4 + 114aa76) : pa_nature réparé (merchant 3287 + flyer_name_filter) ; Woo/Shopify enrichis (rating/poids/variantes/brands 0→88%), plafonds levés (+13,6k produits, aliments_merci complet) ; Flipp fine_print/discount/regular_price via fiches items ; 7 NOUVEAUX connecteurs circulaires grandes bannières (iga/metro/superc/maxi/provigo/walmart/costco_flyer, +3 103, zéro Scrapfly) ; MATCHING inter-bannières (product_links 1 248 groupes, /api/products/{uid}/compare) ; nutrition Open Food Facts (details.off, 100 rech./cycle) ; WAL+retry ; 48 760 produits actifs, 54 sources ; docs générées. | VAGUE 3 (2e52f7c+0e46a27) : SAQ SANS Scrapfly (Adobe Live Search GraphQL direct, clé publique storefront — 3 282 produits), 6 circulaires (pharmaprix/jean_coutu/brunet/uniprix filtrées rayons alimentaires, adonis/avril), metro +321 (coût mesuré 40-80 crédits/page). 52 865 actifs, 57 sources connectées, matching 1 518 groupes. | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud."123 },124 {125 "app": "ka2",126 "node": "M4M36",127 "port": 8799,128 "domain": "www.ka2.bot",129 "process_manager": "launchd",130 "label_or_name": "com.ka2.guardian + com.ka2.ngrok",131 "dir": "~/cluster-projects/ka-guardian",132 "start": "launchctl load ~/Library/LaunchAgents/com.ka2.guardian.plist (AGENT=ka2, ~/cluster-projects/ka-guardian, .venv python3.13) + com.ka2.ngrok conservé; runners com.ka.guardian-runner :7791 sur M3U96a/b+M4M64a/b; courrier com.ka.guardian-courier sur les 5 nœuds. Redeploy: deploy/deploy.sh all depuis ~/Desktop/Groupe-KA/apps-web/ka-guardian",133 "deployed": "2026-08-23",134 "notes": "ka2 GUARDIAN — RECONVERTI 2026-08-23 (ancien bot cartographie web QC archivé ~/ka-bots-backup-20260823.tar.gz sur M4M36). Agent gardien autonome des connecteurs: surveille api-ka /api/v1/monitoring/connectors (5 min), incidents broken/stale → mission claude -p headless (Claude Code CLI) via runner sur le nœud de l'app, surveillance 8 h post-fix, ROLLBACK git auto si ça empire (app down ou pas de guérison), 3 tentatives max. Périmètre: louka, immoka, restoka. + Efforts commandés depuis le site (nouveau connecteur avec découverte Serper + escalade Scrapfly/proxies/Apify, ou enrichissement d'un connecteur choisi) — sessions Claude Code 100% autonomes, jeton opérateur requis (~/.ka-guardian.env). Dashboard live style Groupe KA (papier/encre/lime): flux SSE, incidents, couverture, registre missions+transcripts. Source laptop ~/Desktop/Groupe-KA/apps-web/ka-guardian (git → spbgit ka-guardian.git). GOTCHAS: macOS 26 Local Network Privacy bloque le LAN dès que python homebrew est dans la chaîne (même ses enfants ssh/curl) → courrier zsh launchd (com.ka.guardian-courier, spool ~/ka-guardian-spool) qui expédie via ssh clé dédiée ka_guardian_ed25519 → curl localhost du nœud cible; launchd sans PATH; rsync silencieusement muet depuis $ROOT absolu → cd + ./ + vérif md5 dans deploy.sh. | 2026-08-23 (soir): bannières de partage OG par agent (/og.png + balises og:/twitter: rendues par agent dans main.py, jetons __NUM__/__DOMAIN__/__TAGLINE__) commit 810b430 ; le dir M4M36 est maintenant un REPO GIT (origin gitsrv via clé ka_guardian_ed25519) ; intégrés à administration-ka.com (chat projets ka2/4/6@M4M36 + Écosystème/actions launchd, admin-ka e379169). | 2026-08-28 : favicons corrigés — Safari n'affiche pas les SVG (onglet « ? ») → routes /favicon.ico (multi-tailles), /favicon.png 32 et /apple-touch-icon.png 180 par agent + fallbacks dans les 2 pages HTML."135 },136 {137 "app": "ka4",138 "node": "M4M36",139 "port": 8899,140 "domain": "www.ka4.bot",141 "process_manager": "launchd",142 "label_or_name": "com.ka4.guardian + com.ka4.ngrok",143 "dir": "~/cluster-projects/ka-guardian",144 "start": "launchctl load ~/Library/LaunchAgents/com.ka4.guardian.plist (AGENT=ka4) — voir ka2",145 "deployed": "2026-08-23",146 "notes": "ka4 GUARDIAN — RECONVERTI 2026-08-23 (ancien bot V2 archivé). Même plateforme ka-guardian que ka2 (voir notes ka2). Périmètre: autoka, foodka, sortika. | 2026-08-23 (soir): bannières de partage OG par agent (/og.png + balises og:/twitter: rendues par agent dans main.py, jetons __NUM__/__DOMAIN__/__TAGLINE__) commit 810b430 ; le dir M4M36 est maintenant un REPO GIT (origin gitsrv via clé ka_guardian_ed25519) ; intégrés à administration-ka.com (chat projets ka2/4/6@M4M36 + Écosystème/actions launchd, admin-ka e379169). | 2026-08-28 : favicons corrigés — Safari n'affiche pas les SVG (onglet « ? ») → routes /favicon.ico (multi-tailles), /favicon.png 32 et /apple-touch-icon.png 180 par agent + fallbacks dans les 2 pages HTML."147 },148 {149 "app": "ka6",150 "node": "M4M36",151 "port": 8999,152 "domain": "www.ka6.bot",153 "process_manager": "launchd",154 "label_or_name": "com.ka6.guardian + com.ka6.ngrok",155 "dir": "~/cluster-projects/ka-guardian",156 "start": "launchctl load ~/Library/LaunchAgents/com.ka6.guardian.plist (AGENT=ka6) — voir ka2",157 "deployed": "2026-08-23",158 "notes": "ka6 GUARDIAN — RECONVERTI 2026-08-23 (ancien bot flagship créateurs archivé). Même plateforme ka-guardian que ka2 (voir notes ka2). Périmètre: fabrika, jobka, creaka + tout nouveau service api-ka (agent par défaut). | 2026-08-23 (soir): bannières de partage OG par agent (/og.png + balises og:/twitter: rendues par agent dans main.py, jetons __NUM__/__DOMAIN__/__TAGLINE__) commit 810b430 ; le dir M4M36 est maintenant un REPO GIT (origin gitsrv via clé ka_guardian_ed25519) ; intégrés à administration-ka.com (chat projets ka2/4/6@M4M36 + Écosystème/actions launchd, admin-ka e379169). | 2026-08-28 : favicons corrigés — Safari n'affiche pas les SVG (onglet « ? ») → routes /favicon.ico (multi-tailles), /favicon.png 32 et /apple-touch-icon.png 180 par agent + fallbacks dans les 2 pages HTML."159 },160 {161 "app": "trouve-ka",162 "node": "M2M32",163 "port": 3000,164 "domain": "www.trouve-ka.com",165 "process_manager": "pm2 (natif) + docker (PG/Redis) + colima",166 "label_or_name": "pm2: tk-web/tk-api/tk-crawler-1,2/tk-enrichment/tk-scheduler + docker: postgres,redis + com.trouveka.ngrok",167 "dir": "~/trouve-ka",168 "start": "colima démarré via brew services; cd ~/trouve-ka && docker compose up -d; ngrok via launchctl load ~/Library/LaunchAgents/com.trouveka.ngrok.plist",169 "deployed": "2026-08-13",170 "notes": "Moteur de recherche Québec-first (crawler+index OpenSearch). Web :3000 proxifie /api vers api:8080. Seeds: docker compose run --rm --entrypoint python crawler-worker -m trouveka.crawler.seed scripts/bootstrap-seeds/seeds.txt. Source: ~/Desktop/trouve-ka sur le laptop. | Workers satellites de crawl (2026-08-13) : M2M32b (pm2 trouveka-crawler), M2M32c, M4BP48, M1M32, m4mc, m4ma (nohup .venv/bin/python -m trouveka.crawler.worker, ~/trouve-ka, log ~/trouveka-crawler.log) → Postgres/Redis/OpenSearch via LAN 192.168.2.90 (ports 5432/6379/9200; ne PAS écraser le .env du node M2M32 : PG_PORT=5432, REDIS_PORT=6379). Postgres compose : max_connections=200. Relance satellites depuis session SSH (jamais launchd). | 2026-08-15 REFONTE : colima M2M32 a perdu l'accès container→LAN/host → API/web/workers/enrichment/scheduler passés en pm2 NATIF sur M2M32 (docker=PG+Redis seulement). OpenSearch migré sur M2M32b:9200 (colima démarré via SSH, heap 8G, index trouveka-docs-v2 2 shards kNN, ancien index conservé stoppé sur M2M32). Embeddings/rerank: m4mc:8091. Satellites → SEARCH_URL 192.168.2.77:9200. | 2026-08-17 harmonisation ka-ui : tk-web = Next 15 apps/web, rethémé papier/encre ACCENT AZUR #1c7ed6 (mode sombre retiré), badge+KaFooter+/contact + SSO KA ID IMPLÉMENTÉ (apps/web/lib/ka-auth.ts, cookie tk_ka_session, .env racine chargé via next.config), og/favicon. | 2026-08-18 (commit bd94129) : 13 domaines Ka en seeds, 442 échecs requeued, 29 448 URLs de sitemaps Ka enfilées (enqueue-sitemap.py), 0 parse_failed (SSR ok) — lou-ka 42→239 docs, immo-ka 1→200, indexation continue. food-ka/crea-ka = SPA sans sitemap (vides sans rendu JS). | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud."171 },172 {173 "app": "api-ka",174 "node": "M3U96b",175 "port": 8000,176 "domain": "www.api-ka.com",177 "process_manager": "pm2",178 "label_or_name": "apika-api + apika-scheduler + apika-ngrok",179 "dir": "/opt/api-ka",180 "start": "cd /opt/api-ka && pm2 start ./venv/bin/uvicorn --name apika-api --interpreter none -- src.api.main:app --host 127.0.0.1 --port 8000 ; pm2 start ./venv/bin/python --name apika-scheduler --interpreter none -- -m src.scheduler.daily_job ; pm2 start /opt/homebrew/bin/ngrok --name apika-ngrok --interpreter none -- http --domain=www.api-ka.com 8000 --log stdout",181 "deployed": "2026-08-16",182 "notes": "API-KA — plateforme centrale de l'écosystème KA. Collecte QUOTIDIENNE (02:00, APScheduler) des 5 services KA vers PostgreSQL 16 local (base apika, user apika_user, localhost only), API publique FastAPI (/api/v1/{louka,immoka,foodka,autoka,fabrika} + /runs + /health, pagination max 500, rate limit 120/min/IP), backfill auto 7 jours, backups pg_dump horodatés /opt/api-ka/data/backups (rétention 90j, cron 03:30 + backup par run). Sources via LAN inter-node (ngrok public non requis): lou-ka 127.0.0.1:8095 (même node), immo-ka/fabri-ka MacStudio-de-simon-pierre-6.local:8096/8097 (M4M64a), auto-ka/food-ka MacStudio-de-simon-pierre-4.local:8095/8097 (M4M64b) — collecteurs paginés (limit/offset, fabri-ka page/per_page). IMPORTANT: HostName kernel du node réglé à m3u96b (scutil --set HostName, 2026-08-16) car verify_node() exige hostname==m3u96b en production (LocalHostName/ComputerName inchangés). .env dans /opt/api-ka/.env (600, jamais commité). pm2 save fait. Source laptop: ~/Desktop/api-ka. Tests: 24 pytest pass. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai dans chaque fichier. | 2026-08-16: PLATEFORME WEB de documentation + playground servie sur www.api-ka.com (src/api/web/index.html, négociation de contenu sur GET /: text/html → plateforme, sinon statut JSON). Design initial éditorial REMPLACÉ le 2026-08-16 par le thème LOU-KA (demande utilisateur): Inter 700/800 serré, blanc + navy #0b1330 + orange #ff6a00 (tokens extraits du CSS lou-ka: r-card 18px, stat-chips pilule avec point pulsant orange, btn orange à lueur, pilules GET blue-soft #e9efff, terminaux code navy, footer navy), tile héros navy avec /health live colorisé, reveal on scroll, sections: héros stats live, 5 cartes services (compteurs live), référence des 7 endpoints (tables paramètres + snippets curl/Python/JS + copier), playground interactif (champs dynamiques par endpoint, statut+latence+taille), conventions. Première collecte complète réussie le jour du déploiement. | 2026-08-17 : 3 nouveaux services collectés — restoka (RESTOKA_SOURCE_URL=127.0.0.1:8115/api/restaurants, fetch surchargé : liste paginée PUIS fiche détaillée /api/restaurants/{uid} pour sauvegarder les PLATS — menus/sections/items avec options et prix ; 542 restos, 541 avec menus), sortika (SORTIKA_SOURCE_URL=MacStudio-de-simon-pierre-2.local:8120/api/events — M3U96a via LAN, 8 989 événements), creaka (CREAKA_SOURCE_URL=127.0.0.1:8160/api/creators, 2 233 créateurs). Tables restoka_data/sortika_data/creaka_data créées, première collecte OK, /api/v1/{restoka,sortika,creaka} en ligne, web docs '8 services'. 27 tests pass. Repo créé : git.spboucher.ai/api-ka (spbgit create). | 2026-08-17 design Groupe KA appliqué (site docs statique src/api/web/, accent indigo #3b5bdb, ka-ui monté sur /ka, ka-shell.js ← ecosystem.json) + SSO KA ID IMPLÉMENTÉ (src/api/routes/auth.py, cookie apika_session, client api-ka au hub), /contact, og/favicon (routes FileResponse). | 2026-08-17 (2) : page /stats (dashboard vanilla SVG + journalisation api_requests tampon 5 s + backfill logs) + PDF ; GET /api/stats/ecosystem-report (ecopdf.py — PDF consolidé des plateformes, cache 10 min, consommé par le hub). | 2026-08-17 (3) KA AGENT : assistant IA central de l'écosystème (Claude Haiku 4.5, clé ANTHROPIC_API_KEY dans le .env du nœud) — POST /api/agent/chat en SSE (deltas texte + événements outils), boucle manuelle 6 tours max, 12 outils sur les API publiques (recherche par plateforme, stats live, état des services, infos écosystème), prompt par site avec cache, CORS 13 domaines. Widget ka-ui/agent/ka-agent.js (bulle → panneau → plein écran, historique localStorage) câblé sur tous les sites. Testé bout-en-bout (vraies annonces + stats streamées). | 2026-08-18 (commit 02c0fc8) : cron backup 03:30 réparé (pg_dump chemin absolu, 8/8 testés + purge 90 j) ; pytest isolé des logs prod ; supervision centralisée des connecteurs en cours d'ajout (connector_health + /api/v1/monitoring/connectors + alertes). | 2026-08-19 KA AGENT v2 : widget ka-agent.js (les 13 sites) — plein écran à l'ouverture, clavier mobile stable (visualViewport + body fixed), Markdown streaming complet ; backend /api/agent/chat (apika-api) — 24 outils (fiche_detail par uid, comparer_prix_epicerie, rappels_vehicule, inspections_resto, menu_resto, juste_prix_logement, estimer_valeur_propriete, chercher_plats/boutiques, suggestions_recherche, facettes_plateforme) + recherche floue en cascade (accents/mots vides/singulier), max_tokens 2000, MAX_TURNS 8. | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud."183 },184 {185 "app": "crea-ka",186 "node": "M3U96b",187 "port": 8160,188 "domain": "www.crea-ka.com",189 "process_manager": "pm2",190 "label_or_name": "crea-ka-web + crea-ka-sync + crea-ka-ngrok",191 "dir": "~/apps/crea-ka",192 "start": "cd ~/apps/crea-ka && pm2 start .venv/bin/python --name crea-ka-web --interpreter none --cwd ~/apps/crea-ka -- run.py serve 8160 ; PYTHONUNBUFFERED=1 pm2 start .venv/bin/python --name crea-ka-sync --interpreter none --cwd ~/apps/crea-ka -- run.py watch 24 ; pm2 start /opt/homebrew/bin/ngrok --name crea-ka-ngrok --interpreter none -- http --url=www.crea-ka.com 8160",193 "deployed": "2026-08-17",194 "notes": "Créa-Ka — annuaire public des créateurs de contenu québécois (crea-ka.com), architecture calquée sur Lou-Ka (FastAPI+SQLite WAL+frontend statique zéro build, identité visuelle Lou-Ka marine/#2258FF/orange). Pipeline: découverte (listes-medias: dataset 376 créateurs de ~/Desktop/qc-influenceur; wikidata-qc: SPARQL Québec) → enrichissement par plateforme créateur-par-créateur (instagram-profil + tiktok-profil via Scrapfly [SCRAPFLY_KEY dans ~/apps/crea-ka/.env], youtube API/page publique, twitch Helix sauté sans clés, link-in-bio Linktree/Beacons signal 0.95) → résolution d'identité (scores §12.1) → dédup par compte fort partagé (jamais sur le nom — homonymes). 382 créateurs/605 comptes au 1er passage, enrichissement complet en cours au déploiement. Éthique §15: scrub données privées, opt-out /retrait (immédiat+persistant data/optout.json), mineurs exclus de l'annuaire public (is_minor auto via année de naissance Wikidata). Routes: / annuaire filtres niche/région/langue/plateforme/tier, /createur/{id} page dédiée par créateur, /retrait, API /api/creators|stats|taxonomies|sources|optout, /healthz. OnlyFans supporté comme plateforme (liens auto-déclarés seulement). Tests: 25 pass (pytest, aussi sur le node). Redéploiement: scripts/deploy-m3u96b.sh (⚠️ premier rsync du script n'avait rien copié — vérifier). watch 24h = cadence quotidienne. Node imposé par l'utilisateur. pm2 save fait. Source laptop: ~/Desktop/crea-ka. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai partout. | 2026-08-17 v2: refonte visuelle « éditorial sharp » Groupe KA (papier grainé #f5f3ee, encre #141814, accent VIOLET électrique #c9a3ff/#5b34a8, Space Grotesk/Inter/JetBrains Mono, bordures encre + ombres décalées, vraies icônes SVG simple-icons injectées au build par scripts/build_frontend.py depuis frontend/src/{index.template.html,icons.json}, tab bar mobile 4 onglets patron Lou-Ka, cartes photo unavatar+avatar_url avec cascade de replis, page /stats tuiles+barres). +5 connecteurs: onlyqueb (sitemap+JSON-LD, 248 profils 18+, liens auto-déclarés), youtube-recherche (~120 requêtes QC filtrées par marqueur, ~1300 chaînes/passage), balados-itunes (API officielle Apple, ~400 balados), + metrics étendues par compte (posts/likes/vues/épisodes, colonne accounts.metrics) et avatar_url capté à la source (IG hd/TikTok/artwork iTunes). ~2200+ créateurs / 2800+ comptes après 1er passage complet. ⚠️ PIÈGE openrsync macOS: 'NODE:chemin/relatif' = chemin LOCAL silencieux — le deploy script utilise désormais le chemin distant ABSOLU. Repo: https://git.spboucher.ai/crea-ka.git | 2026-08-17 v3 PROFONDEUR: youtube-recherche paginé par continuations INNERTUBE (4 pages/requête, ~5x le rendement — 607 requêtes incl. 56 villes/MRC et ~100 passe-temps/métiers ×QC pour la longue traîne nano/micro), balados-itunes 87 requêtes, plafonds enrichissement YT 1500/IG 700/TikTok 700/linkinbio 500 par passage. Fixes: parse_count lisait un handle '@…tw5bu' comme 5 G abonnés (frontières de mot + rejet des @) ; IDs de chaîne YouTube UC… casse préservée + URL /channel/ (35 comptes cassés purgés de la DB node). Commit e09cc05 poussé sur git.spboucher.ai/crea-ka. | 2026-08-17 v4 KA ID: connexion déléguée au hub groupe-ka.com — creaka/auth.py (state signé, JWT HS256 vérifié stdlib aud=crea-ka, cookie creaka_session SANS table users, /api/me enrichi par /api/sso/profile du hub signé HMAC cache 60s, logout/config), frontend bouton compte header (visible mobile) + page /compte carte de membre Groupe KA encre+lime. .env node: +KA_SSO_SECRET/SESSION_SECRET/CREAKA_BASE_URL/KA_HUB_URL. Hub: client crea-ka ajouté à src/lib/sso.ts + KA_SSO_SECRET_CREA_KA dans ~/apps/groupe-ka/.env, hub rebuildé+redémarré. Testé bout-en-bout curl en prod. Commits: crea-ka 0b6ebec, groupe-ka a656d95. | 2026-08-17 harmonisation ka-ui : ACCENT VIOLET #7048e8, tokens/ecosystem injectés au build (__KA_TOKENS__/__KA_ECO__ dans build_frontend.py), badge, footer KaFooter, /contact, og/favicon, fix débordements header (bascules 940/1040 px). | 2026-08-18 CAMPAGNE CONNECTEURS (commits 154742b + 6d3e57d) : fix 500 threads SQLite, seconds réels, SkipSource twitch ; OnlyQueb RSC (bio 15→98%, vrais noms, mym/fansly) ; avatars youtube (backfill 4 040) ; balados feed_url/dormants (223 inactive) ; archivage §13 implémenté ; NOUVEAUX : balados-rss (204 enrichis, site-web +70), podcastindex prêt (clés requises), spotify/discord, followers X via syndication timeline-profile (gotcha TLS python → curl), bio-liens ; 14 sources, 19 plateformes ; clés à fournir : YOUTUBE_API_KEY, TWITCH_*, FIRECRAWL, PODCASTINDEX ; docs générées. | VAGUE 3 SANS CLÉ (e97730b) : Twitch via Client-ID public web (21/26 chiffrés), stats YouTube via InnerTube (264 chaînes/passage, rotation 14 j), wikipedia-qc via Wikidata (+76 fiches curées, site-web 87→172), palmares-apple. BUG purgé : marqueurs QC sans frontières de mot (television→levis). 16 sources, 5 513 actifs. | 2026-08-18 VAGUE 4 EXPANSION MASSIVE (commit a4fcfae) : 5 841 → 9 437 créateurs (+3 596), 10 512 comptes. NOUVEAUX connecteurs : twitch-decouverte (GQL public searchFor 43 termes QC paginé + répertoire streams FR 20 pages, +262 streamers, avatars/partner à la source), kick-decouverte (Scrapfly ASP — kick.com 403 direct ; api/search 27 termes + fiche v2 avec LIENS SOCIAUX AUTO-DÉCLARÉS → cross_link 0.90, +119 créateurs/188 comptes, cap 120 v2/passage), region-bio (0 requête : ville DÉCLARÉE en bio via tournure locative/gentilé → région §7, ~70 villes sûres, abstention si ambigu — 1 391 fiches localisées d'un coup). EXPANSIONS : youtube-recherche 641→1 361 requêtes (bloc anglophone MTL/QC, 13 thèmes×56 villes, ~100 nouveaux passe-temps/métiers ; +3 180 chaînes, passage 2 h 17), balados-itunes 87→146 requêtes (+27), wikipedia-qc +5 catégories vérifiées (Blogueuse QC, CA Internet celebrities/women podcasters/video bloggers/gaming YouTubers ; +8, 112 enrichies). Avatars 96,5 % (9 105), régions 1 544. 19 sources, 46 tests OK. x-profil 122 erreurs (TLS/429 syndication — repli curl, à surveiller). | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud."195 },196 {197 "app": "sorti-ka",198 "node": "M3U96a",199 "port": 8120,200 "domain": "www.sorti-ka.com",201 "process_manager": "pm2",202 "label_or_name": "sorti-ka-web + sorti-ka-sync + sorti-ka-ngrok",203 "dir": "~/apps/sorti-ka",204 "start": "cd ~/apps/sorti-ka && pm2 start .venv/bin/python --name sorti-ka-web --interpreter none -- run.py web --host 0.0.0.0 --port 8120 ; pm2 start .venv/bin/python --name sorti-ka-sync --interpreter none -- run.py watch --interval 3600 ; pm2 start /opt/homebrew/bin/ngrok --name sorti-ka-ngrok --interpreter none -- http --url=www.sorti-ka.com 8120",205 "deployed": "2026-08-17",206 "notes": "Sorti-Ka — agrégateur de sorties & événements du Québec (famille ·Ka, patron Lou-Ka : paquet sortika/ = schema Event + normalize + db SQLite WAL (grâce 2 syncs, dérive, busy_timeout 60s) + connecteurs auto-découverts + FastAPI + SSR SEO + frontend SPA sans build). 15 231 événements actifs / 11 559 à venir / 3 159 gratuits / 17 régions / 428 villes. 8 connecteurs ACTIFS : lepointdevente (billetterie QC ~2 500, listes HTML, robots Allow *, hors-QC exclus), sitq (MTO Tourinsoft CC 4.0, toutes régions + enrichissement og:image des sites officiels), montreal (CKAN CC BY 4.0 ~5 600 + enrichissement og:image des fiches montreal.ca — ⚠ WAF bloque UA contenant 'bot' → UA SortiKa/1.0), evenko (~460 grands concerts — /api/search permis par robots, format PERCÉ : GET ?body=base64({params:[query,options],lang:'fr-CA'}) + filters entity_type:evenko_show ; lien billets = Ticketmaster), lavitrine (~5 100 représentations — sitemap + fiches, ⚠ le carrousel d'une fiche de tournée liste TOUTES les dates de la tournée → identifier chaque représentation par l'id de SA slide, sinon 47 doublons/spectacle), atuvu (Cloudflare → Scrapfly, cache incrémental plafonné ATUVU_MAX_FETCH=120/sync, rattrapage progressif), sherbrooke (~270 — JSON embarqué window['TRANSFER_CACHE'], images /Fichiers/3337a882…/Entities/<id>/<mainPicture>), laval (~290, external_id slug+date). Enrichissements d'images PARALLÈLES (fetch_many pool threads). Ville→région : Répertoire MAMH (MUN+ARR, 1 250 entrées, homonymes par population). Dédup affichage : title+ville+date, fiche la plus riche gagne (fenêtre SQL ROW_NUMBER). Fiches /evenement/{uid} SSR (JSON-LD Event) + sitemaps + robots. Frontend design system Groupe KA « éditorial sharp ». Watcher HORAIRE. 19 tests pytest fixtures réelles. Sources écartées (périmées) : Longueuil 2017, Saguenay 2022, Repentigny 2021. Scrapfly : SCRAPFLY_API_KEY dans .env. Repo : https://git.spboucher.ai/sorti-ka (bare ~/srv/git/sorti-ka.git + meta.json). README avec pastilles + screenshots docs/screenshots/. Node imposé par l'utilisateur malgré la règle M3U96a=staging. pm2 save fait. Source laptop : ~/Desktop/sorti-ka. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai partout. | 2026-08-17 v1.1 : connexion KA ID (« Se connecter avec KA », sortika/auth.py patron louka/auth.py — SSO hub groupe-ka.com, jeton HS256 secret partagé KA_SSO_SECRET, session cookie httpOnly, /api/me avec profil dicté par le hub, table users, bouton + puce membre dans l'en-tête). ⚠ IMPORTANT : le hub groupe-ka (M3U96b ~/apps/groupe-ka) n'avait AUCUN secret SSO en prod (.env absent → « Secret SSO non configuré » pour TOUTES les plateformes) — .env RESTAURÉ le 2026-08-17 avec les 7 secrets (lou-ka, toit-ka, immo-ka, auto-ka, food-ka, ora-ka récupérés des .env de chaque app + sorti-ka généré), client sorti-ka inscrit dans src/lib/sso.ts, rebuild + pm2 restart groupe-ka. Secrets sorti-ka dans ~/apps/sorti-ka/.env (SESSION_SECRET, KA_SSO_SECRET, SORTIKA_BASE_URL). 22 tests. | 2026-08-17 harmonisation ka-ui : ACCENT FRAMBOISE #d6336c (SPA sans build — tokens.css servi statiquement), badge, footer commun, /contact (+SSR seo.py), og/favicon (+SSR, fiches gardent leur photo), header flex-wrap (fix 768). | 2026-08-18 CAMPAGNE CONNECTEURS (commits 7d9d1b0 + 65d2d33) : venue/adresse montréal, prix billetterie lepointdevente (/plugins/rates : prix 0→124+, desc 0→129), descriptions sitq 0→87% (tél/courriel), GÉOCODEUR de salles Nominatim (405 événements géolocalisés, cache) ; colonnes start_time (3 069, TZ corrigée laval/sherbrooke UTC) + artists (348) ; NOUVEAUX : bandsintown ACTIF (+108, app_id widget), brossard (+251), ticketmaster prêt (clé requise) ; fusion doublons au barème richesse (545 groupes) ; /api/stats expose sources:10 ; docs générées. | VAGUE 3 SANS CLÉ (86b1494+e312e16) : Ticketmaster par scraping DIRECT (/discover __NEXT_DATA__, 330 évén. 100% GPS, 0 crédit, repli API auto si clé), Eventbrite (426 évén. + prix JSON-LD), longueuil (Nuxt) + cantonsdelest (Tourinsoft). +778 actifs, 20 sources. | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud. Phase 3 (2026-08-19) : expansion des sources — 9 nouveaux connecteurs (lavalweb ~470 évts vivants remplaçant Laval morte, outaouais, lanaudiere, saguenaysorties, bassaintlaurent, quebecanimee, placedesarts avec séances+prix réels, lhjmq ~380 matchs QC, sallesjsonld générique Grand Théâtre/Trident/Capitole) + annuaire de salles (table venues : auto-apprentissage + OSM Overpass + Nominatim) + déroulage des périodes multiples SITQ ; écartées consignées : mauricie/laurentides/gaspesie (WAF/JS), tuxedo (panne), clubs pros (doublons). docs/CONFORMITE.md créé. Rapport : ~/Desktop/groupe-ka-connecteurs/moine-2026-08-19/sorti-ka/06-EXPANSION-RAPPORT.md"207 },208 {209 "app": "resto-ka",210 "node": "M3U96b",211 "port": 8115,212 "domain": "www.resto-ka.com",213 "process_manager": "pm2",214 "label_or_name": "resto-ka + resto-ka-ngrok + resto-ka-sync",215 "dir": "~/apps/resto-ka",216 "start": "cd ~/apps/resto-ka && pm2 start .venv/bin/python --name resto-ka --interpreter none -- run.py serve 8115 ; pm2 start /opt/homebrew/bin/ngrok --name resto-ka-ngrok --interpreter none -- http --url=www.resto-ka.com 8115 ; pm2 start .venv/bin/python --name resto-ka-sync --interpreter none -- run.py watch 168",217 "deployed": "2026-08-17",218 "notes": "Resto·Ka — agrégateur des restaurants du Québec (menus complets + prix réels), resto-ka.com. v2 (design) puis v3 (couverture) 2026-08-17 : 542 restos / 61 330 plats (98% avec photo, 69% avec options+suppléments) / 14 régions / 15 chaînes — 19 intégrations UEAT (Sushi Shop 141, Poulet Rouge 82, Valentine 76, Normandin 44, Chocolats Favoris 41, Allô mon Coco 34, Thaïzone 26, Scores 25, Ashton 23, Pacini 20, Tutti Frutti, Mandy's, Panda Boba-T, Ryu, Impérial, Pizza Mia, Station W, Le Super Qualité, Château Frontenac). GUID des chaînes découverts via <marque>.order-online.ai (domaine marque blanche UEAT). Design v2 « éditorial sharp » Groupe KA (Space Grotesk/Inter/JetBrains Mono, papier-encre-lime, bordures encre + ombres dures) — demande utilisateur : cohérence avec toutes les apps du groupe. Recherche PAR PLAT (/api/dishes, groupée par marque), pagination numérotée, images plats/logos, options en pastilles. Backend Python/FastAPI+SQLite calqué Lou·Ka (price_context/price_source obligatoires, menus par contexte, historique prix par item, alertes dérive). resto-ka-sync = run.py watch 168 (hebdo). St-Hubert consigné 'à faire' (Akamai). Repo: https://git.spboucher.ai/resto-ka (commit initial poussé). Tests 41 pass. Port 8115 (8110=groupe-ka). Node imposé par l'utilisateur. pm2 save fait. Source laptop: ~/Desktop/resto-ka. En-tête auteur Simon-Pierre Boucher <contact@spboucher.ai> partout. | v3 MÊME JOUR (demande: « le plus grand agrégateur ») : connecteur découverte OSM/Overpass (aire 3600061549, ODbL, attribution au footer) = 13 531 fiches nommées → TOTAL 14 055 restos actifs / 79 159 plats / 17/17 régions / 738 restos avec menu complet / 24 chaînes. +10 intégrations UEAT (Boustan 65, Ben&Florentine 54, NO.900 32, Sushi Taxi 30, Cochon Dingue, Salvatoré, Belle Province, Madisons, Freddy) = 29. Dédup chaîne↔OSM (215 masqués, suffixe de succursale retranché dans _name_key, osm dernier en SOURCE_PRIORITY). Régions par ancres géographiques (17/17). UI: filtre has_menu, tri menus d'abord. 45 tests. Commit v2 poussé (git.spboucher.ai/resto-ka). | 2026-08-17 harmonisation ka-ui : ACCENT SAFRAN #f08c00 (fini le lime), tokens vendorés, badge, KaFooter, /contact (whitelist web.py), og/favicon, title suffixé. | 2026-08-18 CAMPAGNE CONNECTEURS (commits 21c54c2 + 85873e9) : anti-fausses-fermetures (7 354 miss_count reset + garde bootstrap ; CAUSE RACINE : miroir overpass.osm.ch = extrait SUISSE, retiré) ; UEAT phone 0→99,8% + GPS API 100% + 20 GUID (+113 fiches, 50 intégrations) ; OSM brand→chain 18%, services, 45 cuisines ; site-resto DÉBLOQUÉ (paquet anthropic manquant) — menus Haiku en prod ; NOUVEAU MAPAQ (2 994 condamnations, 288 liées/204 restos, /inspections) ; horaires OSM structurés 90,4% ; tél/résa des sites crawlés ; Yelp prêt (clé requise) ; Overpass 406 résolu (UA bot honnête) ; docs générées. | VAGUE 3 SANS CLÉ (a9e4fb2) : avis Yelp par scraping (cache Apollo de la page recherche, 1 page/resto, ~30 crédits — 42 notés, 80/cycle), menus livraison UberEats (index 37 087 slugs, ~1 crédit/page, 13 menus delivery), permis d'alcool RACJ croisés sur 1 924 restos (CC-BY). 9 sources. | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud."219 },220 {221 "app": "job-ka",222 "node": "M3U96a",223 "port": 8096,224 "domain": "www.job-ka.com",225 "process_manager": "pm2",226 "label_or_name": "job-ka-web + job-ka-sync + job-ka-ngrok",227 "dir": "~/apps/job-ka",228 "start": "cd ~/apps/job-ka && pm2 start '.venv/bin/python run.py serve 8096' --name job-ka-web ; pm2 start '.venv/bin/python run.py watch 60' --name job-ka-sync ; pm2 start /opt/homebrew/bin/ngrok --name job-ka-ngrok --interpreter none -- http --url=www.job-ka.com 8096",229 "deployed": "2026-08-17",230 "notes": "Job·Ka — agrégateur d'offres d'emploi québécoises du Groupe KA (Python/FastAPI + SQLite + React/Vite, architecture héritée de Lou·Ka). 135 connecteurs sur 9 plateformes ATS (Workday avec facette Québec auto-découverte, Lever, Greenhouse, SmartRecruiters, Ashby, Workable, Recruitee, Breezy, BambooHR), ~4200+ offres actives au déploiement. Salaires normalisés $/h↔$/an, géocodage Nominatim+Adresses Québec, dédup union-find, anti-dérive, expiration date limite. watch 60 = resync horaire autonome (le nœud maintient ses données lui-même, data/jobka.db jamais rsyncé). Healthcheck /health. Générateur de connecteurs: scripts/gen_connectors.py + data/feeds*.json. Nœud M3U96a imposé par le CLAUDE.md du projet (§6, dérogation staging assumée). pm2 save fait. Source laptop: ~/Desktop/job-ka (git local, 3 commits). Clé Scrapfly dans .env sur le nœud (non versionnée). Auteur: Simon-Pierre Boucher — contact@spboucher.ai. | 2026-08-17 INTÉGRATION ÉCOSYSTÈME : repo git remote-first (bare spbgit job-ka.git + git sur le nœud), 13e site d'ecosystem.json (accent CYAN #0c8599), client SSO job-ka enregistré au hub (secret dans .env), assets og/favicon générés. Harmonisation ka-ui + stats+PDF en cours par agent (badge, KaFooter, /contact, /stats, dashboard, rapport PDF). | 2026-08-18 CAMPAGNE CONNECTEURS JOB-KA (commits fd4bfc8, 5a66f48, 4917d57, f6e7571, 744cbfc, 1604ff9 + consolidation) : employeurs directs 135→~250 (probe_ats.py ~870 slugs/14 500 req + detect_ats.py sur 6 337 domaines de l'écosystème — liste /tmp/jobka-employeurs) ; percée Workday : API cxs 422 vs 404 = scan de tenants (CDPQ, Beneva, PSP, BDC, Rio Tinto, Walmart 972 offres…) ; 8 NOUVEAUX ATS (17 total) : Taleo, Njoyn (anti-Radware Scrapfly), UKG, iCIMS, SuccessFactors (Bombardier 843 !), ADP, Cegid DigitalRecruiters (Santé Québec), Workland (CSSDM) — secteur public santé/éducation/municipal débloqué (Emplois Santé MTL, CIUSSS-EMTL, Gatineau, Terrebonne, STL, RTC) ; 3 portails AGGREGATORS (Jobillico, Espresso-Jobs, Guichet-Emplois — Québec Emploi écarté : clicSÉQUR) avec dédup direct-prioritaire vérifiée ; is_direct + badge « Offre directe » + POST /api/employeurs/offres (dépôt modéré) + page /employeurs ; purge hors-QC (130 offres, _NON_QC_CITIES) + fix villes McGill ; offres actives 4 442→8 400+ (direct 7 943 / portails 461). Intégré à api-ka (commit 609d6bb) : collecteur jobka_data quotidien + supervision connector_health (9 services). | 2026-08-19 : CAMPAGNE FRONT-END MOBILE (13 sites) — menus déroulants tactiles fiabilisés (verrous de scroll, backdrops portalisés hors headers backdrop-filter, hamburgers ajoutés à job-ka/trouve-ka/auto-ka), éléments du bas stabilisés (dvh, safe-area via viewport-fit=cover, échelle z-index --z-*), anti-zoom iOS ≥16 px, cibles tactiles ≥44 px, overflow-x clip html+body ; socle mobile commun dans ka-ui/tokens.css + ka-agent v2 ; audit+régression : ka-ui/mobile-audit.mjs & regression-mobile.mjs, inventaire+rapport : ka-ui/audit/. Commit poussé par app sur son nœud. Phase 3 expansion 2026-08-19 : +30 sources (réseau Atlas Workland ~80 employeurs/1 238 offres via API, plateforme carrieresante.gouv.qc.ca ×8, familles taleo_tbe + wpjobmanager, Hydro-Québec, Deloitte, CGI, Sépaq…), pagination Njoyn (Santé Montréal 50→762), réparations lassonde/workland ; 12 496 offres publiées / 12 739 actives canoniques (10 407/10 709 avant) ; cycle 246 sources 0 échec ; 71/71 tests."231 },232 {233 "app": "admin-ka",234 "node": "M3U96a",235 "port": 3300,236 "domain": "www.administration-ka.com",237 "process_manager": "launchd",238 "label_or_name": "io.adminka.backend + io.adminka.ngrok",239 "dir": "~/apps/admin-ka",240 "start": "launchctl bootstrap gui/501 ~/Library/LaunchAgents/io.adminka.backend.plist ; launchctl bootstrap gui/501 ~/Library/LaunchAgents/io.adminka.ngrok.plist",241 "deployed": "2026-08-19",242 "notes": "Console Admin-Ka v2 (mdp app). Pilote le VRAI claude CLI (stream-json) sur le nœud de déploiement de chaque app KA (ssh + tunnel inverse pour permissions). Modèles Fable5/Opus5/Sonnet5/Haiku, modes default/acceptEdits/plan/bypass, sessions détachées+replay, monitoring Écosystème 13 sites (SQLite data/eco.sqlite, checks 45s, sweep nœuds 5min). UI identité Ka."243 },244 {245 "app": "house-ka",246 "node": "M4M64b",247 "port": 8098,248 "domain": "www.house-ka.com",249 "process_manager": "pm2",250 "label_or_name": "house-ka-web / house-ka-sync / house-ka-ngrok",251 "dir": "~/apps/house-ka",252 "start": ".venv/bin/python run.py serve 8098 (+ watch 240)",253 "deployed": "2026-08-27",254 "notes": "Agrégateur maisons à vendre Canada hors Québec (EN, Ontario d'abord) — fork immo-ka, 202k fiches DDF RealtyPress, repo gitsrv:srv/git/house-ka.git"255 },256 {257 "app": "rent-ka",258 "node": "M4M36",259 "port": 8125,260 "domain": "www.rent-ka.com",261 "process_manager": "pm2",262 "label_or_name": "rent-ka-web / rent-ka-sync / rent-ka-ngrok",263 "dir": "~/apps/rent-ka",264 "start": ".venv/bin/python run.py serve 8125 | watch 60 | ngrok http --url=www.rent-ka.com 8125",265 "deployed": "2026-08-27",266 "notes": "English rentals aggregator Canada ex-QC (fork lou-ka). Repo gitsrv:srv/git/rent-ka.git. DB data/rentka.db. 81 connecteurs (65 ON + 11 nationaux + 5 portails). pm2 startup launchd activé."267 },268 {269 "app": "uqo-eval",270 "node": "M4M36",271 "port": 8150,272 "domain": "www.uqo-eval.app",273 "process_manager": "pm2",274 "label_or_name": "uqo-eval + uqo-eval-ngrok",275 "dir": "~/apps/uqo-eval",276 "start": "cd ~/apps/uqo-eval && PORT=8150 pm2 start /opt/homebrew/bin/npm --name uqo-eval --interpreter none -- start -- -H 0.0.0.0 -p 8150 ; pm2 start /opt/homebrew/bin/ngrok --name uqo-eval-ngrok --interpreter none -- http --url=www.uqo-eval.app 8150",277 "deployed": "2026-08-28",278 "notes": "UQO Éval — laboratoire pédagogique d'évaluation immobilière (cours IMM1003 · IMM1033, Simon-Pierre Boucher, UQO). Dérivé de Vrai-Prix (copie indépendante, base SQLite 2 Go clonée le 2026-08-28, aucun lien avec la prod M3U96a). Next.js 16 + better-sqlite3 ; identité UQO officielle (bleu PMS 7469, logo officiel), mode étudiant, assistante IA Éva (/api/ka local), PDF avec logo UQO + mention des cours. EN LIGNE sur https://www.uqo-eval.app (validé bout-en-bout 2026-08-28). Source laptop : ~/Desktop/uqo-eval (branche uqo-eval, sans remote). | 2026-08-28 : /stats/marche — merge base Immo-Ka (copie data/immoka.db + table uqo_eval, jumelage spatial lat/lng, 66 072 annonces évaluées + duel des méthodes coût/rôle indexé ; pipeline scripts/run-eval-shards.sh + build-marche-stats.mjs)"279 },280 {281 "app": "maclustr-agentd",282 "node": "M4M64a",283 "port": 9210,284 "domain": null,285 "process_manager": "launchd",286 "label_or_name": "io.maclustr.agentd",287 "dir": "~/maclustr-agentd",288 "start": "launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/io.maclustr.agentd.plist",289 "deployed": "2026-08-30",290 "notes": "Backend HTTP (stdlib py, /usr/bin/python3 obligatoire cf. Local Network Privacy macOS 26) de l'app iOS MacLustr. Collecte 20 nœuds via SSH clé id_ed25519_agentd sur IP LAN 192.168.2.x (fanout, Tailscale inter-nœuds bloqué ACL). Endpoints: /health, /api/cluster, /api/history, /api/nas, /api/node/<n>/{top,ports,action}. Bearer token dans config.json (0600). Redécouverte LAN via marqueurs ~/.maclustr-node. Source: ~/Desktop/Cluster/CLUSTER_APPLE/maclustr-ios-v2/agent."291 }292 ],293 "history_note": "2026-08-05 (2) : hilmacorp (page statique smiley, M3U96b:8070, www.hilmacorp.ai) déployé puis supprimé le même jour à la demande — pm2 delete hilmacorp + hilmacorp-ngrok, pm2 save, ~/apps/hilmacorp effacé, domaine down (404 ngrok). Source locale intacte : ~/Desktop/hilmacorp-page. | 2026-07-31 (2) : NETTOYAGE COMPLET M3U96a + M3U96b. zyquo-cloud-web migré M3U96a→M2U64:8080 (www.zyquo.cloud OK). Supprimés M3U96a : zyq-bot (www.zyq.bot, DB zyqbot sauvegardée sur laptop ~/Desktop/zyq-bot-final-backup-20260731 avec .env + anciens backups), cashout100 (www.cashout100.com), influenceursqc (www.influenceursqc.com) — pm2 vidé+tué, plist pm2 retiré, postgresql@17+redis stoppés, crontab backup retirée. Supprimés M3U96b : maclustr-llm-api (llm.maclustr.io) + chat-maclustr (chat.maclustr.io) — 3 LaunchDaemons ai.maclustr.* bootout+retirés, ~/.config/maclustr-llm-api effacé, cache HF 82 Go effacé, pm2 retiré. Domaines down : www.zyq.bot, www.cashout100.com, www.influenceursqc.com, llm.maclustr.io, chat.maclustr.io. Sources locales intactes sur laptop. | 2026-07-30 (2) : spboucher-ai supprimé de M2U64 — pm2 delete spboucher + spboucher-ngrok, pm2 save, ~/spboucher-ai et logs pm2 effacés, port 3100 libre, www.spboucher.ai down. Source locale intacte : ~/Desktop/spboucher. | 2026-07-30 : M3U96a nettoyé — llm-api (llm.maclustr.io, gateway 8080 + mlx_lm 8081) et chat-web (chat.maclustr.io, 8090) arrêtés et supprimés : 7 plists launchd io.maclustr.{chat-web,chat-web-backup,chat-ngrok,llm-gateway,llm-ngrok,llm-watchdog,mlx-backend} retirés, ~/maclustr effacé (services + backups), caches modèles ~/.cache/huggingface effacés (~35 Go : Qwen3.6-35B-A3B-8bit + Qwen3-30B-A3B-Instruct-2507-4bit). Sources locales intactes : ~/Desktop/LLM-MACLUSTR et ~/Desktop/CHAT-MACLUSTR. Conservés sur le node : nasmount, caffeinate. | 2026-07-27 : macos-app (www.macos-app.dev, M2U64:8090) supprimée — pm2 delete macos-app + macos-app-ngrok, pm2 save, ~/macosapp et logs pm2 effacés. Source locale intacte : ~/Desktop/macosapp. | 2026-07-26 : nettoyage complet M3U96a/M3U96b/M4M64a/M4M64b — supprimés : zyquo (www.zyquo.ai), llm-agent (www.llm-agent.bot), hilmacorp (www.hilmacorp.ai), chat-maclustr (chat.maclustr.io), gpt-oss-120b-api (llm.maclustr.io, modèle HF cache effacé ~63 Go). PM2 vidé, plists launchd app/ngrok retirés (io.maclustr.llm-*, pm2.*, iogpu-wired-limit), redis+postgresql@17 stoppés sur M3U96a. Conservés : caffeinate, nasmount, tailscale. Apps M2U64 pré-existantes toujours actives (hors registre) : ports 3000 (console.maclustr.io), 5000 (www.vquant.ai), 5001 (cloud.spboucher.ai), 8787 (app.maclustr.io), 8003/8004 (mlx), 5432 (postgres).\n2026-09-04 : retrait de 29 apps web du cluster (M3U96a×9, M3U96b×13, M2U64×2, M4M64a×3, M4M64b×1, M4M36×1) — chacune commitée/poussée sur spbgit (~/srv/git sur M3U96a) avec bannière README « URL live hors fonction », secrets+DB sauvegardés dans ~/cluster-cleanup-backup-20260904/<app>/ sur le nœud, PM2/launchd/ngrok arrêtés, répertoires supprimés. Entrées déplacées dans `decommissioned`. Domaines ngrok réservés non touchés. PM2 de M3U96b toujours cassé (3 démons depuis pm2 update 13:52) — dump.pm2 filtré 45→18.\n2026-09-04 (soir) : passerelle déplacée sur M1M32 (spbgit + mld) ; toutes les apps redéployées via mld (voir cluster-registry.json).",294 "decommissioned": [295 {296 "app": "hfmarketdata",297 "node": "M4M64a",298 "port": 8090,299 "domain": "www.hfmarketdata.io",300 "process_manager": "pm2",301 "label_or_name": "hfmarketdata-api + hfmarketdata-ngrok",302 "dir": "~/hfmarketdata",303 "start": "pm2 start ~/hfmarketdata/run.sh --name hfmarketdata-api ; pm2 start /opt/homebrew/bin/ngrok --name hfmarketdata-ngrok --interpreter none -- http --url=www.hfmarketdata.io 8090",304 "deployed": "2026-08-10",305 "notes": "HF Market Data — API OPEN (sans auth) de données de marché haute fréquence + plateforme docs React (anglais). | 2026-08-10 v2: refonte thème CLAIR « éditorial sharp » (papier #f5f3ee, encre #141814, accent bleu signal #2f6bff, Space Grotesk/Inter/JetBrains Mono, bordures encre + ombres décalées dures, ticker marquee encre, héros uppercase outline+surligné, stat-chips) + docs sophistiquées: sidebar groupée GET, cartes endpoint numérotées, tableaux paramètres avec chips required/optional, blocs REQUEST (tabs curl/Python/JS + Copy) et RESPONSE (Example/Run live), accordéons « Response fields » documentant chaque colonne (17 champs options avec greeks), sections Conventions + Errors (codes HTTP) + Live status. | 2026-08-10 v3: l'utilisateur a rejeté le style brutaliste (« trop laid », pas de fonds noirs) → redesign éditorial raffiné: serif Fraunces italique pour titres/accents, fond #fbfaf7, hairlines, ombres douces, pilules, blocs de code CLAIRS (#f4f2ec), ticker marquee supprimé. + 2 nouveaux endpoints (demande utilisateur: fenêtres précises multi-tickers): GET /v1/bars/{asset}?tickers=A,B,C (multi-tickers, limit par ticker, ex. 4h de 1min sur une watchlist) et GET /v1/snapshot/{asset}?tickers=&at= (coupe transversale: dernière barre ≤ instant précis pour chaque ticker). Options reprioritisées en tête du download (priority 5, avant les barres). | 2026-08-10 v4: INGESTION TERMINÉE 745/745 (26,46 G lignes, 558 814 parquet, 350 Go, options 66/66) — 2 pièges de fin: zips options 2023 q1/q3 en Deflate64 → fallback 7zz (installé sur le node), FX intraday = date+heure en 2 colonnes séparées (yyyyMMdd,HH:mm:ss) → schéma SPLIT_DT dédié (les 4 jobs fx intraday étaient « done » à 0 lignes, resetés+refaits). + plateforme v4: PLAYGROUND interactif sur chaque endpoint (champs par paramètre, selects pour enums, adjustment dépendant de l'asset, URL live, Send request avec statut+latence, snippets curl/Python/JS régénérés, Copy URL/code), section « What you can do » (6 capacités), héros avec métriques finales. Repo: https://git.spboucher.ai/hfmarketdata. Relance download: ~/frd/run_download.sh (exporte FRD_USERID — plus hardcodé, api.txt gitignoré). FastAPI+DuckDB lit en place le lac Parquet zstd /Volumes/ssd/firstratedata/parquet (construit par ~/frd/frd_downloader.py — downloader FirstRate Data complet: options par trimestre 2010→auj., stock/etf/futures/crypto/index/fx en 1min→1day × tous ajustements, manifest de reprise state/manifest.json, zips/CSV bruts supprimés au fil de l'eau). Endpoints: /v1/status, /v1/{asset}/tickers, /v1/bars/{asset}/{ticker} (json/csv, 2M rows max csv), /v1/options/{quarters,tickers,chain,expirations,history}, Swagger /docs, site React servi à /. run.sh: uvicorn 2 workers :8090, HFMD_DATA_ROOT=/Volumes/ssd/firstratedata, HFMD_WEB_DIST=~/hfmarketdata/dist. La couverture API grandit automatiquement pendant que le download tourne (nohup, PID variable — relancer: cd ~/frd && nohup venv/bin/python frd_downloader.py --data-root /Volumes/ssd/firstratedata --workers 2 &). ATTENTION: fichiers FirstRate = fins de ligne mixtes LF/CRLF → duckdb read_csv exige strict_mode=false. Node imposé par l'utilisateur. pm2 save fait. Source laptop: ~/Desktop/firstratedata (downloader) + ~/Desktop/firstratedata/hfmarketdata (app: api/main.py + web/ Vite React, build dist rsyncé). En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai partout. | 2026-08-10 fix: _rows_to_response sérialise NaN/±inf en null (les vieux trimestres options ont des Greeks NaN → 500 JSON). Committé+pushé (hfmarketdata.git).",306 "decommissioned": "2026-09-04",307 "spbgit_repo": "hfmarketdata (hfmarketdata/)",308 "backup": "M4M64a:~/cluster-cleanup-backup-20260904/hfmarketdata/ (.env, *.db, data/)",309 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"310 },311 {312 "app": "draft2027",313 "node": "M3U96b",314 "port": 8100,315 "domain": "www.draft2027.com",316 "process_manager": "pm2",317 "label_or_name": "draft2027 + draft2027-ngrok",318 "dir": "~/apps/draft2027",319 "start": "cd ~/apps/draft2027 && pm2 start /opt/homebrew/bin/node --name draft2027 --interpreter none -- server.mjs 8100 ; pm2 start /opt/homebrew/bin/ngrok --name draft2027-ngrok --interpreter none -- http --url=www.draft2027.com 8100",320 "deployed": "2026-08-08",321 "notes": "DraftVision 2027 — plateforme monopage de prévision du repêchage LNH 2027 (React 18 UMD + Babel standalone ÉPINGLÉ @7.26.4 — latest = Babel 8 casse le runtime JSX classique). server.mjs zéro dépendance, healthcheck /healthz. Données réelles du pipeline de recherche 2026-08-08 (voir RECHERCHE.md dans le dir): 50 espoirs, consensus pondéré 6 sources (Wheeler 30%/DFO 25%/Tankathon 20%/THN 10%/BR 10%/Button 5%), ordre simulé sur classement 2025-26, 6 picks 1re ronde échangés avec conditions dynamiques, loterie règles 2026 (top-11, max 10 rangs, VAN 25,5%). Chat Claude + bouton MàJ appellent api.anthropic.com sans clé — fonctionnels seulement dans un env. artifact claude.ai (erreur FR propre sinon). Node imposé par l'utilisateur. pm2 save fait. Source laptop: ~/Desktop/mock. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai. | 2026-08-08 v1.1: vrais logos SVG des 32 équipes (demande utilisateur, remplace les écussons stylisés du CLAUDE.md) hotlinkés depuis assets.nhle.com (variante _dark), repli automatique vers écusson stylisé si échec de chargement; mention légale au footer. | 2026-08-08/09 v2: ajustements Hlinka-Gretzky 2026 dans le consensus (bornés ±3 rangs, sommaires officiels hlinkagretzkycup.ca — Joseph malus +1,0 → Privalov 2e/Joseph 3e; England devant Sundström) ; loterie refaite sur table NOMINALE officielle 1-16 (18,5→0,5%, transfert des points 12-16 à la pire équipe, rang 12 éligible au 2e tirage — validée 300k tirages) ; +5 gardiens avec vraies stats (Déniger/Vetrov/Nikolaev/Ņikitins/Salén Forsberg) ; +Selic et L'Italien ; 21 tirs G/D complétés, nationalités résolues (Davidson/Gordon-Carroll/Walos USA, Murata CAN) ; condition TOR→PHI corrigée SANS PROTECTION (bascule loterie 2026, PuckPedia) ; Yakunin = Spartak (pas CSKA). Docs compagnons servis: ADMIN-REPECHAGE-2027.md, COULISSES-2027.txt (intel sourcé, zéro vie privée — joueurs mineurs), RECHERCHE.md.",322 "decommissioned": "2026-09-04",323 "spbgit_repo": "draft2027 (créé)",324 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/draft2027/ (.env, *.db, data/)",325 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"326 },327 {328 "app": "qwhpi",329 "node": "M3U96a",330 "port": 3000,331 "domain": "www.indexqc.house",332 "process_manager": "pm2",333 "label_or_name": "qwhpi-api + qwhpi-web + qwhpi-ngrok",334 "dir": "~/cluster-projects/qwhpi",335 "start": "cd ~/cluster-projects/qwhpi/api && pm2 start \"python3 -m uvicorn app.main:app --host 127.0.0.1 --port 8080\" --name qwhpi-api ; cd ../web && pm2 start \"npm run start\" --name qwhpi-web ; pm2 start \"ngrok http 3000 --url=www.indexqc.house --log=stdout\" --name qwhpi-ngrok",336 "deployed": "2026-08-06",337 "notes": "QHPI — Quebec Housing Price Index (v2.1 MENSUEL depuis 2026-08-08; ex-QWHPI hebdo). Méthode robuste: RTD (fenêtres 13 mois Huber, mean splice) pour la province, time-dummy local direct pour cellules ≥40 tx/mois, Kalman hiérarchique pour cellules minces; buildingType banni (missingness backfillée par vagues régionales = marches artificielles). Canonique: data/processed/qhpi_monthly.parquet (112 séries × 67 mois, model_version 2.1.0). FastAPI :8080 (local only, champs period/monthly_pct/3m/6m/yoy) ; Next.js :3000 proxifie /v1,/docs,/health (build NEXT_PUBLIC_API_URL=\"\") ; ngrok → www.indexqc.house. Refresh: make refresh sur laptop (03→09→11) puis rsync data/processed/ (API recharge via mtime). Node imposé par l'utilisateur malgré la règle M3U96a=staging. pm2 save fait. Source laptop: ~/Desktop/QWHPI. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai partout.",338 "decommissioned": "2026-09-04",339 "spbgit_repo": "qwhpi",340 "backup": "M3U96a:~/cluster-cleanup-backup-20260904/qwhpi/ (.env, *.db, data/)",341 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"342 },343 {344 "app": "hilmacorp",345 "node": "M3U96a",346 "port": 8070,347 "domain": "www.hilmacorp.ai",348 "process_manager": "pm2",349 "label_or_name": "hilmacorp + hilmacorp-ngrok",350 "dir": "~/apps/hilmacorp",351 "start": "pm2 start ./node_modules/.bin/next --name hilmacorp --interpreter none -- start -H 0.0.0.0 -p 8070 ; pm2 start /opt/homebrew/bin/ngrok --name hilmacorp-ngrok --interpreter none -- http --url=www.hilmacorp.ai 8070",352 "deployed": "2026-08-06",353 "notes": "Site corporatif Hilmacorp.ai reconstruit from scratch (Next.js 15 App Router, TS strict, Tailwind v4, bilingue FR/EN via segment [locale], 7 pages, formulaire /api/contact avec validation — messages persistés dans ~/apps/hilmacorp/data/contact-messages.jsonl tant que RESEND_API_KEY absent du .env). En-tête auteur Simon-Pierre Boucher dans chaque fichier (règle CLAUDE.md projet). Node imposé par l'utilisateur malgré la règle M3U96a=staging. pm2 save fait. Source laptop: ~/Desktop/hilmacorp. Tests: npm test (8 pass). | 2026-08-06 v2: refonte majeure design + contenu — thème CLAIR éditorial (fond papier #faf9f6, cartes blanches, accent vert profond #0b6b4a, titres serif Fraunces + Inter), nouvelles sections (4 engagements accueil, principes /about, déroulement des mandats /services, cartes infos /contact). Rebuild + pm2 restart OK. | 2026-08-06 v2.1: pages légales /terms + /privacy (FR/EN, droit QC/Loi 25) + gestion cookies (bandeau consentement CookieConsent, cookie hilmacorp_cookie_consent 12 mois, bouton « Préférences de cookies » au footer + /privacy, tableau des témoins). Sitemap MAJ (18 URLs). Rebuild + pm2 restart OK. | 2026-08-06 v2.2: page /apps (nav+footer, 20 URLs sitemap) — 2 plateformes web (AI Risk Index → airiskindex.io, LLM Index → llmindex.io, liens externes) + 4 apps macOS Zyquo (Agent/Cloud/Local/Router) avec DMG servis depuis public/downloads/ (~31 Mo, sources ~/Desktop/macos/zyquo/*/dist). Rebuild + pm2 restart OK, 4 DMG vérifiés 200.",354 "decommissioned": "2026-09-04",355 "spbgit_repo": "hilmacorp (créé)",356 "backup": "M3U96a:~/cluster-cleanup-backup-20260904/hilmacorp/ (.env, *.db, data/)",357 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"358 },359 {360 "app": "voyage2026",361 "node": "M3U96b",362 "port": 8060,363 "domain": "www.voyage2026toronto.com",364 "process_manager": "pm2",365 "label_or_name": "voyage2026 + voyage2026-ngrok",366 "dir": "~/apps/voyage2026",367 "start": "pm2 start /opt/homebrew/bin/node --name voyage2026 --interpreter none -- server.mjs 8060 ; pm2 start /opt/homebrew/bin/ngrok --name voyage2026-ngrok --interpreter none -- http --url=www.voyage2026toronto.com 8060",368 "deployed": "2026-08-05",369 "notes": "Page statique — itinéraire road trip Québec→Toronto 17-24 août 2026 (concert Ed Sheeran LOOP Tour, Rogers Centre 20 août). server.mjs zéro dépendance, healthcheck /healthz. Design sombre v2 (countdown live, scroll reveal, nav collante). Photos hotlinkées depuis Wikimedia Commons. Source laptop: ~/Desktop/voyage. pm2 save fait.",370 "decommissioned": "2026-09-04",371 "spbgit_repo": "voyage2026 (créé)",372 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/voyage2026/ (.env, *.db, data/)",373 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"374 },375 {376 "app": "zyquo-cloud-web",377 "node": "M2U64",378 "port": 8080,379 "domain": "www.zyquo.cloud",380 "process_manager": "pm2",381 "label_or_name": "zyquo-cloud-web + zyquo-cloud-ngrok",382 "dir": "~/zyquo-cloud-web",383 "start": "pm2 start server.mjs --name zyquo-cloud-web -- 8080 dist ; pm2 start ngrok --name zyquo-cloud-ngrok -- http --url=www.zyquo.cloud 8080",384 "deployed": "2026-07-31",385 "notes": "Zyquo Cloud Web (browser edition) — static React/Vite bundle, zero-dep server.mjs (/healthz). MIGRÉ de M3U96a vers M2U64 le 2026-07-31 (demande explicite malgré M2U64=prod). pm2 save fait. Source: laptop ~/Desktop/zyquo-cloud-web. Apex zyquo.cloud toujours sans DNS.",386 "decommissioned": "2026-09-04",387 "spbgit_repo": "zyquo-cloud-web",388 "backup": "M2U64:~/cluster-cleanup-backup-20260904/zyquo-cloud-web/ (.env, *.db, data/)",389 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"390 },391 {392 "app": "immbot-ai",393 "node": "M3U96b",394 "port": 3070,395 "domain": "www.immbot.ai",396 "process_manager": "pm2",397 "label_or_name": "immbot-ai + immbot-ngrok",398 "dir": "~/apps/immbot-ai",399 "start": "pm2 start ./node_modules/.bin/next --name immbot-ai --interpreter none -- start -p 3070 ; pm2 start ngrok --name immbot-ngrok --interpreter none -- http --url=www.immbot.ai 3070",400 "deployed": "2026-08-04",401 "notes": "Immbot AI — plateforme pédagogique IA pour IMM1003/IMM1033 (UQO). Next.js 15 + node:sqlite (FTS5) + embeddings locaux multilingual-e5-small + OpenRouter (clé dans ~/apps/immbot-ai/.env). Health: /api/health. Cours sources rsyncés dans ~/apps/IMM1003-20 et ~/apps/IMM1033-20 (+ ~/apps/output/course-analysis). Base: ~/apps/immbot-ai/data/immbot.db (2063 fragments, seed 129 questions/140 cartes/6 examens). Admin initial admin/admin123 avec changement forcé. ATTENTION: `pnpm build/start` plante sur ce node (bug pnpm runDepsStatusCheck) — utiliser ./node_modules/.bin/next directement. Redéploiement: immbot-ai/scripts/deploy-m3u96b.sh depuis le laptop. pm2 save fait. Source laptop: ~/Desktop/UQO/UQO_PREPARATION_COURS/immbot-ai.",402 "decommissioned": "2026-09-04",403 "spbgit_repo": "immbot-ai (créé)",404 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/immbot-ai/ (.env, *.db, data/)",405 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"406 },407 {408 "app": "airiskindex",409 "node": "M3U96b",410 "port": 3000,411 "domain": "www.airiskindex.io",412 "process_manager": "pm2",413 "label_or_name": "airiskindex-web + airiskindex-ngrok",414 "dir": "~/apps/airiskindex",415 "start": "./run-web.sh (next start -p 3000) / ./run-ngrok.sh (ngrok http 3000 --url=https://www.airiskindex.io)",416 "deployed": "2026-08-05",417 "notes": "AI Risk Index (Next.js monorepo). Postgres@16 + Redis via brew services on node. Worker (BullMQ rater) NOT started yet. Demo dataset seeded; preview banner on site.",418 "decommissioned": "2026-09-04",419 "spbgit_repo": "airiskindex",420 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/airiskindex/ (.env, *.db, data/)",421 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"422 },423 {424 "app": "llmindex",425 "node": "M3U96b",426 "port": 3100,427 "domain": "www.llmindex.io",428 "process_manager": "pm2",429 "label_or_name": "llmindex-web + llmindex-worker + llmindex-ngrok (+ llmindex-benchmark one-shot)",430 "dir": "~/apps/llmindex",431 "start": "pm2 startOrReload infra/ecosystem.config.cjs (web: Next standalone server.js PORT=3100; worker: tsx src/index.ts BullMQ; ngrok http 3100 --url=https://www.llmindex.io)",432 "deployed": "2026-08-05",433 "notes": "LLM Index (llmindex.io) — IRT-based LLM ranking platform. pnpm+turbo monorepo (web Next 14, worker BullMQ, psychometrics Python/numpy sous apps/psychometrics/.venv). Postgres@16 natif (DB llmindex, role llmindex, mdp dans ~/apps/llmindex/.env) + Redis brew (redis.conf réparé: loadmodule redisbloom/etc commentés le 2026-08-05). OPENROUTER_API_KEY dans .env. Seed: 338 modèles OpenRouter, run demo_seed (bannière DEMO). Redéploiement: rsync depuis laptop ~/Desktop/llmindex puis APP_DIR=~/apps/llmindex bash infra/deploy.sh. Health: /api/v1/health. ATTENTION pnpm run bugué sur ce node → utiliser binaires directs (./node_modules/.bin/next etc.). pm2 save fait. MAJ 2026-08-05: refonte frontend responsive (logo SVG + favicon app/icon.svg, LiveLeaderboard polling 5s), benchmark live: pm2 llmindex-benchmark (tsx src/cli/benchmark-run.ts --n 30 --k 2, no-autorestart) évalue les 16 modèles ranked un à la fois (6 domaines IRT), refit après chaque modèle → leaderboard se remplit graduellement; progression publique: /api/v1/benchmark/progress (Redis). | v0.2.0 (2026-08-05): 12 domaines (agentic simulé + context-load, terminal simulé, svg_design jugé 3 juges BT, vision_ocr multimodal via resvg), extraction cascade robuste, refit filtré par version, 135 modèles RANKED_MODELS, JUDGE_MODELS=gpt-5.2/opus-4.8/gemini-3.1-pro. Benchmark ~27h en cours. Page modèle = transparence totale (réponses+duels). Méthodo détaillée + refs sur /methodology.",434 "decommissioned": "2026-09-04",435 "spbgit_repo": "llmindex",436 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/llmindex/ (.env, *.db, data/)",437 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"438 },439 {440 "app": "coinexplorer",441 "node": "M3U96b",442 "port": 8090,443 "domain": "www.coinexplorer.io",444 "process_manager": "pm2",445 "label_or_name": "coinexplorer-indexer + coinexplorer-api + coinexplorer-ngrok",446 "dir": "~/apps/coinexplorer",447 "start": "pm2 start .venv/bin/python --name coinexplorer-indexer -- run_indexer.py (EXPLORER_BACKFILL_DAYS=1) ; pm2 start .venv/bin/python --name coinexplorer-api -- -m uvicorn api.main:app --host 0.0.0.0 --port 8090 ; pm2 start ngrok --name coinexplorer-ngrok --interpreter none -- http --url=www.coinexplorer.io 8090",448 "deployed": "2026-08-05",449 "notes": "Stablecoin block explorer (free public RPCs only, aucune cle API). 23 chaines indexees (21 EVM + Tron + Solana), FastAPI + WebSocket + dashboard sur /, /docs OpenAPI, /metrics Prometheus. Stockage SQLite WAL (~/apps/coinexplorer/explorer.db) — passer a Postgres via DATABASE_URL si besoin. ATTENTION pm2+python: lancer uvicorn via .venv/bin/python -m uvicorn (le script console uvicorn est parse par node sinon). Source laptop: ~/Desktop/explorer. pm2 save fait.",450 "decommissioned": "2026-09-04",451 "spbgit_repo": "coinexplorer",452 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/coinexplorer/ (.env, *.db, data/)",453 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"454 },455 {456 "app": "influenceursqc",457 "node": "M3U96a",458 "port": 3010,459 "domain": "www.influenceursqc.com",460 "process_manager": "pm2",461 "label_or_name": "influenceursqc + influenceursqc-ngrok",462 "dir": "~/apps/influenceursqc",463 "start": "PORT=3010 pm2 start /opt/homebrew/bin/node --name influenceursqc --interpreter none -- server.js ; pm2 start /opt/homebrew/bin/ngrok --name influenceursqc-ngrok --interpreter none -- http --url=www.influenceursqc.com 3010",464 "deployed": "2026-08-06",465 "notes": "Plateforme de classement des influenceurs du Québec (376 profils, 6 plateformes sociales). Express SSR zéro-build, thème clair moderne, routes: / (global), /plateforme/:p, /categorie/:c, /categories, /influenceur/:slug, /api/influenceurs, /health. Données embarquées: qc_influenceurs.json (copie de ~/Desktop/qc-influenceur/data/, regénérer via scripts/merge.py puis re-rsync). Node imposé par l'utilisateur malgré la règle M3U96a=staging. pm2 save fait. Source laptop: ~/Desktop/qc-influenceur/app. | 2026-08-06 v2: galerie photo par profil (gallery.json, 3732 images pour 376 profils via Firecrawl image search, grille masonry, images liées à leur source) + vrais avatars via unavatar.io (IG/TikTok/X/YT) avec repli initiales. pm2 restart OK. | 2026-08-06 v3: dossiers éditoriaux par profil (dossiers.json — 1464 faits sourcés dont 888 datés + 1053 actualités, extraits de 376 recherches web+news Firecrawl par 13 agents) : sections Parcours-chronologie (timeline datée), Faits saillants et Dans l'actualité, chaque fait/news lié à sa source. pm2 restart OK. | 2026-08-06 v4: moteur de recherche avancé /recherche (filtres plateforme/catégorie/tier/audience min, tri, recherche plein-texte incluant faits+actualités web) + valeur nette estimée en $ CAD par profil (modèle documenté sur /methodologie: taux par plateforme × multiplicateurs tier/catégorie × années actives dérivées de la chronologie, fourchette 20-45% de capitalisation) affichée sur profils et résultats de recherche. pm2 restart OK.",466 "decommissioned": "2026-09-04",467 "spbgit_repo": "qc-influenceurs (app/)",468 "backup": "M3U96a:~/cluster-cleanup-backup-20260904/influenceursqc/ (.env, *.db, data/)",469 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"470 },471 {472 "app": "valoplex",473 "node": "M3U96a",474 "port": 8091,475 "domain": "www.valoplex.com",476 "process_manager": "pm2",477 "label_or_name": "valoplex + valoplex-ngrok",478 "dir": "~/apps/valoplex",479 "start": "cd ~/apps/valoplex && pm2 start ./node_modules/.bin/next --name valoplex --interpreter none -- start -H 0.0.0.0 -p 8091 ; pm2 start /opt/homebrew/bin/ngrok --name valoplex-ngrok --interpreter none -- http --url=www.valoplex.com 8091",480 "deployed": "2026-08-09",481 "notes": "Petit frère de vrai-prix, spécialisé PLEX (CUBF 1000, 2+ logements — tous les plex): 393 867 plex / 1 733 744 portes / 91 060 ventes. Modèle hédonique avancé dédié (LightGBM monotone sur aire/portes/valeur rôle, features par porte, quantiles P10-P90 calibrés par méthode conforme — couverture 79,6% vérifiée ≈ cible 80%): MdAPE 13,97% (triplex 12,8%), test temporel 2026 13,8%. Moteur comparables avec ajustement PORTES (50% du prix/porte, cap ±30%) + filtre ±1 porte. Valeur totale plex QC: 337,5 G$. Source laptop: ~/Desktop/valoplex (app/ + scripts/ hedonic_plex.py, build_valoplex_db.py; modèles models/valoplex_lgb.joblib). DB SQLite 162 Mo. Même design éditorial sharp que vrai-prix, textes/menus/rapports PDF rebrandés ValoPlex. Node imposé par l'utilisateur. pm2 save fait. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai partout. | 2026-08-09 v2: (1) fix marque header (« Prix » multi-ligne échappait au sed → affichait ValoPrix). (2) MODÈLE v2 EN RATIO : cible log(prix/valeur_role) au lieu du prix brut — corrige l'écrasement des gros immeubles (tour 3100 portes au rôle 704,8M$ : estimée 5,6M$ avant → 575,8M$ après, ratio 0,82; tous les 15M$+ désormais à ratio 0,81-1,20). Monotonicité retirée (non pertinente sur ratio), conforme recalibrée (79,9%). MdAPE inchangé 13,96%. Valeur totale plex: 388,5 G$ (était 337,5 — gros multis écrasés). (3) Pondération dynamique du moteur: écart moyen de portes des comps >1,5 → modèle 75%, >3 → 85% (tour sans comparables = 100% modèle). (4) Présentation plex partout: Portrait du plex, rôle par porte, parc de plex, méthodo section « modèle en ratio », rapports PDF. Re-prédictions 6 millésimes + DB + stats regénérées. | v3: refonte fiche 100% plex — badge Duplex/Triplex/Quadruplex/…/Multi N portes rotaté lime, frise DoorsRow (une porte SVG dessinée par logement, max 10 + badge +N, ≈$/porte), section « L'économie du plex » (4 tuiles par porte: estimé/rôle/aire/terrain par porte) + benchmark vs marché local (médiane $/porte et $/m² des comps avec delta%), Prix au m² au panneau, Portrait du plex enrichi (âge, mixité commerciale, chambres locatives, emprise au sol %, bâtiment $/m², rôle/porte), $/porte dans l'historique et sur chaque comparable (badge gabarit). FIX comparables vides: état explicite « Aucun plex comparable » (transparence + section comps) au lieu du radar/tableau vides quand nCompsUsed=0 (tours hors gabarit). | v4: (1) AUDIT du ratio — vérifié: dénominateur = rôle en vigueur à la vente (98% même millésime, 93,4% égal à l'évaluation portée par l'acte); audit production ratio médian 1,005. (2) Feature anciennete_role_mois (mois entre dat_cond_mrche du rôle et la vente — LA variable d'un modèle en ratio): holdout 13,84% (vs 13,96), test 2026 13,75% (vs 14,21), couverture 80,0% pile, biais annuels resserrés (2022: 1,018→1,014). (3) Adresses de CHAQUE porte extraites de b05v_adr_unite_evaln (adresses_json en DB, cartes chips « Les portes officielles du plex » + note honnête: le rôle public ne détaille pas l'intérieur des logements). Valeur totale plex recalée: 385,0 G$. | v5: (1) PRO FORMA investisseur interactif (lib/proforma.ts + Proforma.tsx, 15 tests): loyer implicite en forme fermée RB=(V·TGA+F)/(1−vac−v), état des résultats complet (taxes ≈1,1% du rôle, assurances, entretien, gestion, déneigement, énergie communs, réserve), RNE, TGA implicite, MRB, hypothèque canadienne (composition semestrielle), cashflow/porte/mois, DSCR, cash-on-cash, droits de mutation (barème QC + barème bonifié Montréal), liquidités totales; 4 sliders live (taux/mise/amort/TGA); section 5.1 dans le rapport pro PDF. (2) MODÈLE v5 gros immeubles — fix cas Grandjean 165 portes (était 15,4M/−20%/fourchette ×4,7): shrinkage vers ancre empirique par bande hors domaine 13+ portes (w=0,55/0,35/0,20) + calibration conforme Mondrian par bande + intervalles = dispersion empirique de bande recentrée → Grandjean: rôle 19,3M → 21,2M (ratio 1,10), fourchette 11,2-31,9M. Masse intacte (MdAPE 13,84). Total plex: 400,6 G$. | v6: pro forma COMPLET (proforma.ts +soldeApresMois, capital/intérêts an 1, rendement global an 1, projection 5 ans avec appréciation paramétrable — équité, gain total, multiple sur liquidités —, loyer de point mort + marge de sécurité, taux de point mort par bissection, sensibilité taux ±1% ; 33 tests) + 5e slider appréciation + 2 cartes UI (Création de richesse 5 ans / Marges & sensibilité). PDF tous mis à niveau : rapport standard → 3 PAGES (gabarit + valeur/porte en p.1, ligne portes officielles, p.3 = pro forma 2 colonnes + liquidités sur encre + méthodo ratio/Mondrian), rapport pro 5.1 enrichi (capital an1, équité 5 ans, point mort), rapport parc = portes·$/porte par propriété. | v7: identité ORANGE (accent #ff9f45, ocre #b25f16 — l'utilisateur a rejeté le vert). README détaillé. Repo GitHub PUBLIC: https://github.com/spboucher-ai/valoplex (racine = app/ + scripts/, exclus: app/data, data/, models/). | 2026-08-09 v8: agent IA « Ka » (page /ka + API /api/ka) — Claude Haiku 4.5 en streaming SSE, 12 outils plex (chercher_plex, evaluer_plex avec économie par porte + adresses des portes, PROFORMA_INVESTISSEUR complet paramétrable — taux/mise/amort/TGA/appréciation, cashflow par porte, DSCR, liquidités tout le kit, projection 5 ans, points morts, sensibilité —, comparables avec ajust portes, indice_marche_plex, stats par gabarit, evaluer_parc, comparer_plex, chercher_plex_secteur portes/budget, estimation_manuelle, liens_rapports), prompt caching. ANTHROPIC_API_KEY dans ~/apps/valoplex/.env.local sur le node. Lien Ka dans header+footer. | v8.1: Ka renforcé — recherche approximative, outil dossier_investisseur (éval+pro forma condensé+benchmark $/porte municipal+tendance+comps+synthèse en 1 appel), tableaux HTML, fil à défilement interne, mobile refait, 12 tours/2200 tokens.",482 "decommissioned": "2026-09-04",483 "spbgit_repo": "valoplex (app/)",484 "backup": "M3U96a:~/cluster-cleanup-backup-20260904/valoplex/ (.env, *.db, data/)",485 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"486 },487 {488 "app": "earth-now",489 "node": "M3U96b",490 "port": 8080,491 "domain": "www.earth-now.co",492 "process_manager": "pm2",493 "label_or_name": "earthnow-api + earthnow-web + earthnow-proxy + earthnow-ngrok",494 "dir": "~/apps/earth-now",495 "start": "cd ~/apps/earth-now && PORT=4000 pm2 start /opt/homebrew/bin/node --name earthnow-api --interpreter none -- apps/api/dist/server.js ; cd apps/web && API_URL=http://127.0.0.1:4000 pm2 start ./node_modules/.bin/next --name earthnow-web --interpreter none -- start -H 127.0.0.1 -p 4100 ; cd ../.. ; PROXY_PORT=8080 API_PORT=4000 WEB_PORT=4100 pm2 start /opt/homebrew/bin/node --name earthnow-proxy --interpreter none -- infra/proxy.mjs ; pm2 start /opt/homebrew/bin/ngrok --name earthnow-ngrok --interpreter none -- http --url=www.earth-now.co 8080",496 "deployed": "2026-08-09",497 "notes": "earth-now.co — dashboard planétaire temps réel (successeur robuste de Worldometer). Monorepo pnpm/Turborepo (~/Desktop/earth-now, git local) : packages/counter (contrat CounterModel + runtime pur value(model,t)), packages/models (PCHIP/Fourier/Holt-Winters/Kalman + garde-fous), packages/registry (40 métriques YAML + fixtures, tous les 🥇 MVP + top-10 pays), apps/api (Fastify :4000 — REST/SSE/badges SVG + pollers RT USGS & open-notify), apps/web (Next 14 :4100 — thème CLAIR défaut, layout live-first: héros population, grille « En direct » triée par vitesse de tick calculée, strip session, classement 10 pays, bande référence), infra/proxy.mjs (:8080 zéro-dép route /api|/v1|/sse|/badge→4000, reste→4100). Redéploiement: pnpm deploy:m3u96b depuis le laptop (rsync + build sur nœud + PM2 + health checks obligatoires /api/health + /sse/health≥10s). Build web avec NEXT_PUBLIC_API_URL='' (fetchs same-origin). v0.1 sans Postgres/Redis (modèles fit en mémoire depuis le registre; compose Docker prêt dans infra/ pour la suite). SSE: /sse/health paddé 2Ko (ngrok bufferise les mini-chunks). 139 tests verts. pm2 save fait. En-tête auteur Simon-Pierre Boucher partout.",498 "decommissioned": "2026-09-04",499 "spbgit_repo": "earth-now",500 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/earth-now/ (.env, *.db, data/)",501 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"502 },503 {504 "app": "khaelor-sh",505 "node": "M3U96b",506 "port": 8790,507 "domain": "www.khaelor.sh",508 "process_manager": "pm2",509 "label_or_name": "khaelor-sh + khaelor-sh-ngrok",510 "dir": "~/apps/khaelor-sh",511 "start": "cd ~/apps/khaelor-sh && PORT=8790 pm2 start /opt/homebrew/bin/node --name khaelor-sh --interpreter none -- server.mjs ; pm2 start /opt/homebrew/bin/ngrok --name khaelor-sh-ngrok --interpreter none -- http --url=www.khaelor.sh 8790",512 "deployed": "2026-08-09",513 "notes": "KHAELOR — site de documentation + distribution du CLI khaelor (agent terminal autonome Anthropic-only, TypeScript/Node>=22). server.mjs zero-dep, healthcheck /health, 9 pages docs (dark/light), install.sh one-liner (curl -fsSL https://www.khaelor.sh/install.sh | sh) qui installe via npm depuis le tarball servi A LA RACINE du site (https://www.khaelor.sh/khaelor.tgz — PAS de GitHub, demande explicite). Tarball = npm pack du repo laptop ~/Desktop/khaelor (v0.1.0, dist/ + README, 287 fichiers, zero secret). MAJ du tarball: npm run build && npm pack dans le repo puis scp khaelor-X.Y.Z.tgz M3U96b:apps/khaelor-sh/artifacts/khaelor.tgz (server no-cache sur tarball+install.sh). Node impose par l'utilisateur. pm2 save fait. Install one-liner teste avec succes depuis M4M36 (2026-08-09). En-tetes auteur Simon-Pierre Boucher — contact@spboucher.ai partout.",514 "decommissioned": "2026-09-04",515 "spbgit_repo": "khaelor (website/)",516 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/khaelor-sh/ (.env, *.db, data/)",517 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"518 },519 {520 "app": "spbdrive",521 "node": "M3U96b",522 "port": 7430,523 "domain": "drive.spboucher.ai",524 "process_manager": "pm2",525 "label_or_name": "spbdrive-server + spbdrive-tunnel",526 "dir": "~/srv/drive/app",527 "start": "pm2 startOrReload ~/srv/drive/app/deploy/ecosystem.config.cjs",528 "deployed": "2026-08-10",529 "notes": "SPB Drive — personal cloud (Fastify+SQLite CAS blobs, data ~/srv/drive, nightly backup cron 02:30, source ~/Desktop/drive) | v2.0.0 deployed 2026-08-10: versioning, editor, file requests (/r/<token>), storage insights",530 "decommissioned": "2026-09-04",531 "spbgit_repo": "drive",532 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/spbdrive/ (.env, *.db, data/)",533 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"534 },535 {536 "app": "hfchart",537 "node": "M4M64b",538 "port": 8130,539 "domain": "www.hfchart.io",540 "process_manager": "pm2",541 "label_or_name": "hfchart-web + hfchart-ngrok",542 "dir": "~/hfchart",543 "start": "pm2 start /opt/homebrew/bin/python3 --name hfchart-web -- ~/hfchart/server.py 8130 ; pm2 start ~/bin/ngrok --name hfchart-ngrok --interpreter none -- http --url=www.hfchart.io 8130",544 "deployed": "2026-08-10",545 "notes": "HFChart — plateforme-catalogue de charts haute fréquence, rendu canvas 100% from scratch (zéro lib de charts). 14 types (chandelles, creuses, OHLC, ligne/escalier/aire/baseline, Heikin-Ashi, Renko, Three-Line Break, Range Bars, Kagi, Point & Figure, Comparaison % avec rebasage sur 1re barre visible) + indicateurs SMA/EMA/Bollinger/VWAP session/profil volume/RSI/MACD/ATR, thème CLAIR par défaut + sombre, schéma hausse/baisse vert-rouge ou bleu-rouge (CVD-validé), vue table, galerie live, vues partageables par URL (?group=&symbol=&tf=&type=&inds=&compare=&theme=&panel=gallery). DONNÉES: API https://www.hfmarketdata.io interrogée directement par le navigateur (CORS ouvert) — timeframes dérivés client (1h→4h, 1J→1S, 5min→15m) et boutons TF auto-activés via /v1/status quand le lac se remplit. server.py = hôte statique stdlib pur. Source laptop: ~/Desktop/hfchart (server.py + web/). ATTENTION M4M64b: (1) les binaires cask Homebrew fraîchement installés pendent à l'exec via SSH (Gatekeeper/syspolicyd, RSS 32Ko) — le ngrok utilisé est ~/bin/ngrok copié depuis M4M64a (3.39.5), PAS /opt/homebrew/bin/ngrok; (2) curl du nœud timeout même sur 127.0.0.1 (python urllib OK) — healthcheck local via python3. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai partout. pm2 save fait. Node imposé par l'utilisateur. | 2026-08-10 v2: (1) responsive smartphone — sidebar en drawer (hamburger ☰ + backdrop), topbar compacte scrollable, pinch-zoom tactile 2 doigts sur canvas (touch-action:none), largeur d'axe des prix dynamique (mesurée sur le dernier prix); (2) bouton « Exporter » : snippet HTML autonome avec données intégrées (barres visibles ≤3000, transforms/indicateurs/réglages inclus, graphe interactif sans réseau) via /embed.js (bundle concaténé transforms+indicators+renderers+engine+embed-boot, cache mtime, CORS *) + variante iframe live (?embed=1 masque topbar/sidebar/footer); (3) passe qualité rendu: filigrane symbole·tf, marge droite 6%, ombres sur chips, titres de panes (Volume/RSI/MACD/ATR), grille verticale atténuée, volume en dégradé, graduations d'axe temps, légende blur/backdrop-filter, priorité année>mois sur les ticks temps. NOTE headless-test: Chrome headless a une largeur min de fenêtre 500px — tester le mobile via une page hôte avec iframe 390px. | 2026-08-10 v3: Options Lab (options.html) — chaîne d'options historique datée (2010→auj., calls/puts côte à côte, filtres |Δ| / ± spot, ITM ombré, lazy par échéance + cache LRU), builder multi-jambes (clic bid/mid/ask → acheter/vendre) + presets (covered call, CSP, verticals, iron condor, straddle, strangle), payoff canvas (échéance + T+0 Taylor bornée ±6% du spot), breakevens/max exacts (module PUR options-math.js, 10 tests node --test), replay mark-to-market RÉEL jour par jour via /v1/options/history. Spot en UNADJUSTED pour stock/etf (strikes as-traded !). Vues partageables: options.html?ticker=&date=&expiry=&preset=&replay=1. Fix API hfmarketdata déployé sur M4M64a en même temps: NaN Greeks → null (500 sur /v1/options/history).",546 "decommissioned": "2026-09-04",547 "spbgit_repo": "hfchart",548 "backup": "M4M64b:~/cluster-cleanup-backup-20260904/hfchart/ (.env, *.db, data/)",549 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"550 },551 {552 "app": "tendril",553 "node": "M3U96a",554 "port": 8092,555 "domain": "www.ten-dril.com",556 "process_manager": "pm2",557 "label_or_name": "tendril-api + tendril-ngrok",558 "dir": "~/apps/tendril",559 "start": "cd ~/apps/tendril && TENDRIL_DIR=$HOME/apps/tendril TENDRIL_PORT=8092 pm2 startOrReload deploy/ecosystem.config.cjs --update-env",560 "deployed": "2026-08-10",561 "notes": "Tendril — plateforme d ingestion web (scrape/crawl/map/search) macOS Apple Silicon, alternative Firecrawl auto-hébergée. Monorepo pnpm/TS strict (packages: shared/router/egress/fetcher-http/extract/frontier + apps/api Fastify). Phase 1+ LIVRÉE (86 tests): Tier 0 undici (ordre en-têtes Safari, redirections manuelles + re-validation SSRF par saut, épinglage IP anti-rebinding, gzip/br), extraction DÉTERMINISTE (JSON-LD/OG/Twitter, Readability+fallback densité, règles Turndown GFM), SSRF (resolve-then-validate §16.5), taxonomie erreurs §15 source unique, respect robots.txt (RFC9309), endpoints POST /v1/scrape, POST /v1/map (sitemaps+robots+homepage+llms.txt), GET /v1/status, /healthz + Playground UI interactif & docs servis à / (@fastify/static, page auto-suffisante: hero thème botanique, playground scrape/map/status avec preview markdown/liens/snippets curl-python-js, référence API + table erreurs §15). API bind 127.0.0.1:8092 (loopback), ngrok = seule ingress. Tiers 1 (WKWebView Swift) & 2 (Safari) PAS ENCORE construits (nécessitent session GUI) → pages exigeant escalade échouent en ERR_TARGET_BLOCKED sous tier:auto (forcer tier:http pour sortie Tier 0). ⚠️ BLOQUANT ngrok: réserver www.ten-dril.com dans dashboard.ngrok.com/domains/new (CNAME DNS déjà en place → ngrok-cname; tendril-ngrok en restart-loop ERR_NGROK_319 jusqu à réservation, se connectera seul ensuite). ⚠️ Ce node ne résout PAS example.com (Tailscale MagicDNS split-DNS) — utiliser de vrais domaines (iana.org, etc.) pour tester. Déploiement: scripts/deploy.sh (rsync+install+build+pm2+health). Repo: https://git.spboucher.ai/tendril. Source laptop: ~/Desktop/tren-dril. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai sur chaque fichier de code. Node M3U96a imposé par le CLAUDE.md du projet (§16 production host) malgré règle staging. pm2 save fait.",562 "decommissioned": "2026-09-04",563 "spbgit_repo": "tendril",564 "backup": "M3U96a:~/cluster-cleanup-backup-20260904/tendril/ (.env, *.db, data/)",565 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"566 },567 {568 "app": "svgarden",569 "node": "M3U96b",570 "port": 4321,571 "domain": "www.svgarden.dev",572 "process_manager": "pm2",573 "label_or_name": "svgarden-web + svgarden-tunnel",574 "dir": "~/apps/svgarden",575 "start": "cd ~/apps/svgarden && pm2 startOrRestart ecosystem.config.cjs && pm2 save",576 "deployed": "2026-08-10",577 "notes": "SVGarden — banque searchable d'animations SVG+CSS (24 snippets seed, 7 catégories), Astro statique + server.mjs Express (:4321, /healthz = build timestamp + snippet count). Tunnel ngrok nommé 'svgarden' défini dans ~/Library/Application Support/ngrok/ngrok.yml du node (ngrok start svgarden --log=stdout sous pm2). Node imposé par le CLAUDE.md du projet. Redéploiement: ./scripts/deploy.sh depuis ~/Desktop/svgarden (laptop) — rsync (pas encore de remote git), npm ci, npm run build (validation snippets incluse, FAIL si header/frontmatter/scoping invalide), pm2 startOrRestart, healthchecks local+public. Lighthouse 100/100 perf+a11y (home et détail). Source laptop: ~/Desktop/svgarden. En-tête auteur Simon-Pierre Boucher obligatoire dans CHAQUE fichier (règle projet). pm2 save fait. | 2026-08-10 phase 2: +50 snippets « next-level » (74 total, 14 catégories — nouvelles: buttons, filters, scroll, motion-path, text-fx, charts, interactive) via 8 sous-agents parallèles; limite passée à 150 lignes/snippet (directive utilisateur, remplace le ~120 du CLAUDE.md); champ frontmatter optionnel `support` (caveat navigateur, exigé si @supports présent) rendu sur la page détail; badge « New » (≤14 jours, calculé au build); facette technique (top 18) sur la galerie; fix v1 card-lift-border (non-scaling-stroke + pathLength cassait le dash en espace écran). Lighthouse 100/100 maintenu. Redéployé, healthz=74.",578 "decommissioned": "2026-09-04",579 "spbgit_repo": "svgarden",580 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/svgarden/ (.env, *.db, data/)",581 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"582 },583 {584 "app": "localvm-web",585 "node": "M3U96b",586 "port": 8120,587 "domain": "www.localvm.dev",588 "process_manager": "pm2",589 "label_or_name": "localvm-web + localvm-web-ngrok",590 "dir": "~/localvm-web",591 "start": "PORT=8120 pm2 start server.js --name localvm-web ; pm2 start /opt/homebrew/bin/ngrok --name localvm-web-ngrok -- http --url=www.localvm.dev 8120",592 "deployed": "2026-08-12",593 "notes": "Research showcase for ~/Desktop/localvm-research (English, light theme, mobile menu, public comments). Update: run web/sync-content.sh, then rsync -az --delete --exclude node_modules --exclude data web/ M3U96b:~/localvm-web/ && pm2 restart localvm-web. IMPORTANT: data/ holds comments.json — never delete.",594 "decommissioned": "2026-09-04",595 "spbgit_repo": "localvm-research (web/)",596 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/localvm-web/ (.env, *.db, data/)",597 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"598 },599 {600 "app": "modelmap-web",601 "node": "M3U96b",602 "port": 8140,603 "domain": "www.modelmap.io",604 "process_manager": "pm2",605 "label_or_name": "modelmap-web + modelmap-web-ngrok",606 "dir": "~/modelmap-web",607 "start": "PORT=8140 pm2 start server.js --name modelmap-web ; pm2 start /opt/homebrew/bin/ngrok --name modelmap-web-ngrok --interpreter none -- http --url=www.modelmap.io 8140",608 "deployed": "2026-08-12",609 "notes": "modelmap.io — living research atlas for ~/Desktop/modelmap (internal cartography of local LLMs). English, light theme, violet accent; same Express architecture as localvm-web (sister project, www.localvm.dev): server renders the content/ snapshot of the research repo. Pages: Home (phases 1-11 + confidence ladder L0-L3), Research, Experiments (micro A-H), Atlas (confidence-labeled map entries), Results, Code, About. Update: run site/sync-content.sh in the repo, rsync site/ (exclude node_modules) to M3U96b:~/modelmap-web/, pm2 restart modelmap-web. Apex modelmap.io has no DNS record — only www. is routed via ngrok. | 2026-08-12 v2: refonte éditoriale (Fraunces/Inter/JetBrains Mono, logo SVG contour-lines = favicon, hero gradient, footer 4 colonnes), responsive mobile complet (menu hamburger <880px, breakpoints 560px), page /comments (formulaire visiteurs, honeypot + rate-limit/IP, store persistant HORS du dossier app: ~/.modelmap-web/comments.json sur M3U96b — survit aux rsync --delete). | 2026-08-12 v3: cartes SVG live (probes réel-vs-jumeau, bande causale, stockage warm/cold, overhead capture — palette validée dataviz) + onglet /publications (rapports techniques officiels, figures injectées {{fig:*}}, bloc citation) — TR-2026-01 publié. Miroir git: https://git.spboucher.ai/modelmap (push SSH M3U96a:srv/git/modelmap.git).",610 "decommissioned": "2026-09-04",611 "spbgit_repo": "modelmap (site/)",612 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/modelmap-web/ (.env, *.db, data/)",613 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"614 },615 {616 "app": "anomaly-atlas",617 "node": "M3U96b",618 "port": 8150,619 "domain": "www.anomaly-atlas.io",620 "process_manager": "pm2",621 "label_or_name": "anomaly-atlas + anomaly-atlas-ngrok",622 "dir": "~/apps/anomaly-atlas",623 "start": "cd ~/apps/anomaly-atlas && pm2 start /opt/homebrew/bin/node --name anomaly-atlas --interpreter none -- server.js ; pm2 start /opt/homebrew/bin/ngrok --name anomaly-atlas-ngrok --interpreter none -- http --url=www.anomaly-atlas.io 8150",624 "deployed": "2026-08-12",625 "notes": "Plateforme publique du projet de recherche anomaly-atlas (découverte+validation rigoureuse d'anomalies statistiques dans les données HF ouvertes de hfmarketdata.io — source unique). Node imposé par l'utilisateur. Node/Express (comme localvm-web): server.js lit un snapshot du repo dans content/ (généré par web/sync-content.sh sur le laptop, source: ~/Desktop/anomaly-atlas). Pages: Home (doctrine d'honnêteté §2.1 en bannière sur CHAQUE page, taxonomie de confiance Level 0-3, phases), Atlas (findings atlas/<id>/<ver>/finding.json — vide tant que rien n'atteint Level>=1, état vide honnête), Research (docs markdown + LOG timeline), Experiments (expA-H + candidats), Results, Code, About. /health OK. PORT par défaut 8150 dans server.js. Redéploiement: ./web/sync-content.sh puis rsync -a --delete --exclude node_modules web/ M3U96b:apps/anomaly-atlas/ puis pm2 restart anomaly-atlas. pm2 save fait. AUCUN conseil financier — bannière « not investment advice » partout.",626 "decommissioned": "2026-09-04",627 "spbgit_repo": "anomaly-atlas (web/)",628 "backup": "M3U96b:~/cluster-cleanup-backup-20260904/anomaly-atlas/ (.env, *.db, data/)",629 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"630 },631 {632 "app": "search-box",633 "node": "M3U96a",634 "port": 3020,635 "domain": "www.search-box.ai",636 "process_manager": "pm2",637 "label_or_name": "search-box-web / search-box-ngrok",638 "dir": "~/apps/search-box",639 "start": "PORT=3020 pm2 start pnpm --name search-box-web -- start (cwd ~/apps/search-box); pm2 start /opt/homebrew/bin/ngrok --name search-box-ngrok -- http --url=www.search-box.ai 3020",640 "deployed": "2026-08-12",641 "notes": "Agentic research engine (Next.js 15 + Claude Opus 5 + Firecrawl). PostgreSQL 17 local db 'searchbox' (brew services postgresql@17). Secrets in ~/apps/search-box/.env.",642 "decommissioned": "2026-09-04",643 "spbgit_repo": "search-box",644 "backup": "M3U96a:~/cluster-cleanup-backup-20260904/search-box/ (.env, *.db, data/)",645 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"646 },647 {648 "app": "worthdoing",649 "node": "M3U96a",650 "port": 3001,651 "domain": "www.worthdoing.ai",652 "process_manager": "pm2",653 "label_or_name": "worthdoing-web + worthdoing-ngrok",654 "dir": "~/apps/worthdoing",655 "start": "pnpm start (next start -p 3001); ngrok http --url=www.worthdoing.ai 3001",656 "deployed": "2026-08-12",657 "notes": "WorthDoing.ai — autonomous investigation agent (Claude Opus 5 + Firecrawl). PostgreSQL db 'worthdoing' local on node. Repo: https://git.spboucher.ai/worthdoing",658 "decommissioned": "2026-09-04",659 "spbgit_repo": "worthdoing",660 "backup": "M3U96a:~/cluster-cleanup-backup-20260904/worthdoing/ (.env, *.db, data/)",661 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"662 },663 {664 "app": "chat-spboucher",665 "node": "M4M64a",666 "port": 3000,667 "domain": "chat.spboucher.ai",668 "process_manager": "launchd",669 "label_or_name": "ai.spboucher.chat.app + ai.spboucher.chat.ngrok + ai.spboucher.chat.backup",670 "dir": "~/apps/chat.spboucher.ai",671 "start": "launchctl load ~/Library/LaunchAgents/ai.spboucher.chat.{app,ngrok}.plist",672 "deployed": "2026-08-12",673 "notes": "Universal chat UI over OpenRouter (409 models). Next.js 16 + SQLite. Auth: user spboucher. Nightly DB backup 03:30 via launchd. Source: ~/Desktop/chat-spboucher on laptop.",674 "decommissioned": "2026-09-04",675 "spbgit_repo": "chat-spboucher",676 "backup": "M4M64a:~/cluster-cleanup-backup-20260904/chat-spboucher/ (.env, *.db, data/)",677 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"678 },679 {680 "app": "forma-ka",681 "node": "M3U96a",682 "port": 8110,683 "domain": "www.forma-ka.com",684 "process_manager": "pm2",685 "label_or_name": "forma-ka + forma-ka-sync + forma-ka-ngrok",686 "dir": "~/apps/forma-ka",687 "start": "cd ~/apps/forma-ka && pm2 start \".venv/bin/python run.py serve 8110\" --name forma-ka ; pm2 start \".venv/bin/python run.py watch 360\" --name forma-ka-sync ; pm2 start /opt/homebrew/bin/ngrok --name forma-ka-ngrok --interpreter none -- http --url=www.forma-ka.com 8110",688 "deployed": "2026-08-12",689 "notes": "Forma-Ka — agrégateur québécois de formations (mécanisme lou-ka adapté : connecteurs → schéma Formation riche en détails avec prix OPTIONNEL → diff SQLite hash+grâce → FastAPI /api/formations → React 18 Vite PWA thème clair accent ambré #ffd54d). Backends de fetch : requests direct → Scrapfly (asp/render_js, SCRAPFLY_API_KEY) → Firecrawl (FIRECRAWL_API_KEY) en repli auto ; clés dans ~/apps/forma-ka/.env. Fiches détail en cache BD avec clé hebdo ISO. forma-ka-sync = run.py watch 360 (sync toutes les 6 h). Node imposé par l'utilisateur malgré la règle M3U96a=staging. pm2 save fait. Source laptop : ~/Desktop/forma-ka. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai partout. Connecteurs livrés progressivement par agents (ETS Formation 297 fiches + universitaire/pro/collégial/séminaires en cours) — re-rsync + pm2 restart forma-ka forma-ka-sync après chaque vague.",690 "decommissioned": "2026-09-04",691 "spbgit_repo": "forma-ka",692 "backup": "M3U96a:~/cluster-cleanup-backup-20260904/forma-ka/ (.env, *.db, data/)",693 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"694 },695 {696 "app": "ora-ka",697 "node": "M4M64a",698 "port": 8200,699 "domain": "www.ora-ka.com",700 "process_manager": "pm2",701 "label_or_name": "ora-ka-web + ora-ka-sync + ora-ka-ngrok",702 "dir": "~/apps/ora-ka",703 "start": "pm2 start .venv/bin/python --name ora-ka-web --interpreter none --cwd ~/apps/ora-ka -- run.py serve 8200 ; pm2 start .venv/bin/python --name ora-ka-sync --interpreter none --cwd ~/apps/ora-ka -- run.py watch ; pm2 start /opt/homebrew/bin/ngrok --name ora-ka-ngrok --interpreter none -- http --url=www.ora-ka.com 8200",704 "deployed": "2026-08-13",705 "notes": "ORA-KA — plateforme unifiée des 5 agrégateurs Ka (~362k inscriptions). Les 5 apps reproduites FIDÈLEMENT (backends non modifiés) et montées sous préfixes: /immo (Immo-Ka, source ~/Desktop/agent-courtage), /lou (Lou-Ka, ~/Desktop/lou-ka), /fabri (Fabri-Ka, ~/Desktop/qc-store), /auto (Auto-Ka, ~/Desktop/auto), /food (Food-Ka, ~/Desktop/food-ka). Arborescence: apps/<alias>/{<pkg>/, data/, frontend/} — chaque app garde data/ et frontend/dist frères du package (chemins __file__ intacts). Frontends React/Vite rebuildés avec base '/<alias>/' + basename react-router + API_BASE (seuls changements). Landing / = BARRE DE RECHERCHE unifiée ultra-épurée (liseré conic-gradient animé 5 couleurs, chips de portée, grille mixte avec pastille d'univers) + /api/search HYBRIDE: exact (LIKE/FTS5 dans les 5 SQLite, entrelacé par univers) puis SÉMANTIQUE (embeddings OpenAI text-embedding-3-small 256d float16, index npz data/semantic/<app>.npz, brute-force numpy, seuil 0.32, hot-reload sur mtime). OPENAI_API_KEY + FIRECRAWL + SCRAPFLY(_KEY et _API_KEY) dans .env. Rebuild index: run.py index [app...] (incrémental par uid — relancer après grosses syncs). run.py watch = 5 threads aux cadences natives (immo 180min, lou 60 incl. geocode/poi/quartier, auto 120, fabri/food 360). ora-ka-sync et les apps individuelles (immo-ka M4M64a, lou-ka M3U96b, auto-ka/food-ka M4M64b, fabri-ka M4M64a) scrapent les MÊMES sources en parallèle — doublon de charge assumé. Source laptop: ~/Desktop/ora-ka. pm2 save fait. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai. | 2026-08-13: LOGIN KA ID au niveau plateforme — oraka/auth.py (JWT HS256 stdlib aud=ora-ka, users SQLite data/oraka-users.db keyed ka_id, cookie oraka_session path=/ valide sur tout le domaine incl. /immo//lou/…), router inclus avant les montages (vérifié: /api/auth servi par la racine), landing.py: pilule noire « KA ID » en topbar fixe (visible mobile) + menu compte verre dépoli (avatar/nom/courriel/KA-ID/chip rôle/lien groupe-ka.com/compte/déconnexion, JS vanilla via /api/auth/me). Env node .env: + KA_SSO_SECRET/KA_HUB_URL/ORAKA_BASE_URL/SESSION_SECRET. Testé bout-en-bout (ka_id partagé OK) + non-régression: landing 200, /api/search sémantique OK, 5 montages 200. Client enregistré côté hub (KA_SSO_SECRET_ORA_KA, redirects www.ora-ka.com/). | 2026-08-13 v2: « MON UNIVERS KA » sur la landing — oraka/hubfav.py (hub_list_all scope=all, cache 30s), GET /api/favorites (session, 401 sinon), section #kafavs sous la barre de recherche (visible si connecté ET ≥1 favori, masquée pendant une recherche, pastilles d'univers réutilisées .rcard/.rtag, lien gérer sur groupe-ka.com/compte). Testé bout-en-bout (♥ lou-ka visible sur ora-ka). | 2026-08-13 v3: README complet (badges shields, tableau métriques prod 400 498 inscriptions, 9 captures Playwright docs/screenshots/ régénérables via scripts/screenshots.mjs). Repo poussé sur https://git.spboucher.ai/ora-ka (spbgit, branche main). Rsync M4M64a (data/ et dist/ préservés) + pm2 restart ora-ka-web + healthz OK.",706 "decommissioned": "2026-09-04",707 "spbgit_repo": "ora-ka",708 "backup": "M4M64a:~/cluster-cleanup-backup-20260904/ora-ka/ (.env, *.db, data/)",709 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"710 },711 {712 "app": "toit-ka",713 "node": "M3U96a",714 "port": 8097,715 "domain": "www.toit-ka.com",716 "process_manager": "pm2",717 "label_or_name": "toit-ka-web + toit-ka-etl + toit-ka-ngrok",718 "dir": "~/apps/toit-ka",719 "start": "pm2 start .venv/bin/python --name toit-ka-web --interpreter none --cwd ~/apps/toit-ka -- run.py serve 8097 ; pm2 start .venv/bin/python --name toit-ka-etl --interpreter none --cwd ~/apps/toit-ka -- run.py watch 30 ; pm2 start /opt/homebrew/bin/ngrok --name toit-ka-ngrok --interpreter none -- http --url=www.toit-ka.com 8097",720 "deployed": "2026-08-15",721 "notes": "TOIT-KA — FUSION Lou-Ka × Immo-Ka : plateforme unifiée louer + acheter (85 503 annonces : 22 881 locations + 62 622 ventes). NE SCRAPE RIEN : toit-ka-etl tire toutes les 30 min des snapshots LECTURE SEULE des BD de prod via LAN (ssh 192.168.2.82 lou-ka louka.db + 192.168.2.83 immo-ka immoka.db, sqlite3 .backup puis rsync -> data/replicas/), puis ETL -> data/toitka.db (table listings unifiée, colonne transaction_type louer|acheter ; règles de visibilité héritées : dédup Centris dup_hidden=0 + prix non nul côté vente ; annonces disparues -> active=0 -> fiche 410). NORMALISATION VILLES : toitka/villes.py (règles déterministes + élection par slug, ~3 300 variantes brutes -> table city_map auditable via run.py villes — corrige « Brossard ) », « Gatineau (Gatineau) », arrondissements collés 2 ordres, St-/Saint-, Québec City, Montrã©al…). Types unifiés toitka/typologie.py (décodage '). Backend FastAPI (toitka/web.py) + SSR SEO (seo.py : /louer/{ville}[/{type}], /acheter/{ville}[/{type}], /{tx}/type/{type}, /annonce/{uid}/{slug} 301+410, sitemaps, robots). Frontend React18+Vite+TS BI-ACCENT (html[data-mode] : lime=louer, rouge=acheter, terracotta=marque ; toggle central sur l'accueil), carte Ka Maps 3D (markers rent lime / sale encre), SSO KA ID (client toit-ka enregistré au hub groupe-ka.com — KA_SSO_SECRET_TOIT_KA dans .env.local du hub sur M3U96b, commit 9888039) + favoris hub. .env node chmod 600 : TOITKA_BASE_URL, KA_SSO_SECRET, AUTH_SECRET, TOITKA_REPLICA_SOURCES. Logs : ~/.pm2/logs/toit-ka-*.log. Node imposé par l'utilisateur (règle M3U96a=staging assouplie). pm2 save fait. Source laptop : ~/Desktop/toit-ka. Repo : https://git.spboucher.ai/toit-ka. En-tête auteur Simon-Pierre Boucher — contact@spboucher.ai partout. lou-ka.com et immo-ka.com INTACTS (lecture seule).",722 "decommissioned": "2026-09-04",723 "spbgit_repo": "toit-ka",724 "backup": "M3U96a:~/cluster-cleanup-backup-20260904/toit-ka/ (.env, *.db, data/)",725 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"726 },727 {728 "app": "qc-election",729 "node": "M2U64",730 "port": 8140,731 "domain": "www.qc-election.com",732 "process_manager": "pm2",733 "label_or_name": "qc-election / qc-election-ngrok",734 "dir": "~/apps/qc-election",735 "start": "pm2 start ~/apps/qc-election/ecosystem.config.js",736 "deployed": "2026-08-30",737 "notes": "Forecast électoral QC 2026 v3.1.0 « 127 » « Au-delà des sondages » : Kalman/alr + prior de fondamentaux (satisfaction Léger via Firecrawl, w(t) décroissant) + votes réels des 4 partielles dans le filtre + nudge médias ±0,35 pp + ensemble 88/12 Polymarket sur P(1er) + veille Firecrawl continue (radar sondages/satisfaction/presse, clé dans backend/.env) + page /signaux + décomposition /api/beyond. Monte Carlo 25k + 4×8k (décomposition), backtest 2022 comparatif. ADMIN_TOKEN + FIRECRAWL_API_KEY dans backend/.env (chargé par config.py). Pipeline auto 6 h. Repo gitsrv à jour (03c9ead); source laptop: ~/Desktop/qc-election. v2.1 : attention Wikipédia (turbulence → variance ×≤1,45), sondage synthétique LLM (96 strates, expérimental poids nul), page /aujourdhui (Le point du jour, /api/today). v3 : Social Intelligence (actor Apify qc-social-pulse, APIFY_TOKEN+SERPER_API_KEY dans backend/.env), validation/ablation, battlegrounds, /circonscriptions, API v3, design system QC Signal. v3.1 : replay LOEO 6 élections (/api/replay), σ_industrie appris 0,22, next-poll prediction, frontend QC Signal (hémicycle 127, strip).",738 "decommissioned": "2026-09-04",739 "spbgit_repo": "qc-election",740 "backup": "M2U64:~/cluster-cleanup-backup-20260904/qc-election/ (.env, *.db, data/)",741 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"742 },743 {744 "app": "home-ka",745 "node": "M4M36",746 "port": 8099,747 "domain": "www.home-ka.com",748 "process_manager": "pm2",749 "label_or_name": "home-ka-web + home-ka-sync + home-ka-ngrok",750 "dir": "~/apps/home-ka",751 "start": "cd ~/apps/home-ka && pm2 start .venv/bin/python --name home-ka-web --interpreter none -- run.py serve 8099 ; pm2 start .venv/bin/python --name home-ka-sync --interpreter none -- run.py watch 60 ; pm2 start /opt/homebrew/bin/ngrok --name home-ka-ngrok --interpreter none -- http --url=www.home-ka.com 8099",752 "deployed": "2026-08-28",753 "notes": "⏸ EN PAUSE depuis le 2026-08-28 (demande utilisateur) : pm2 stop home-ka-web/sync/ngrok (pm2 save fait — ne redémarreront pas au reboot), jobs nohup tués, dossier ~/apps/home-ka INTACT sur M4M36 (1,3 Go, data/homeka.db incluse). État gelé : 182 327 annonces actives (125 420 publiées), 352 848 propriétés, 85 sources (backend Firecrawl, clé dans .env), 630 brokerages. REPRISE : ssh M4M36 puis `pm2 start home-ka-web home-ka-sync home-ka-ngrok && pm2 save` — le domaine ngrok www.home-ka.com se rattache tout seul. | Home·Ka — agrégateur immobilier US (version américaine d'Immo-Ka), EN LIGNE sur https://www.home-ka.com (healthcheck 200 le 2026-08-28). Même architecture qu'Immo-Ka : FastAPI + SQLite WAL (data/homeka.db), pipeline SOURCE→connector→normalisation→property matching→dédup→canonique. Schéma aligné RESO Data Dictionary, séparation PROPERTY (table properties, clé APN/adresse normalisée) vs LISTING. Familles de connecteurs config-driven via table sources : reso (Web API OData — MLS Grid/Trestle/Bridge), rets, xml, json, jsonld (sites REW server-rendered), csv, sftp, arcgis (parcelles county→properties) + customs auto-découverts. Sources live v1 : michael_saunders + john_r_wood (jsonld, FL). Géocodage US Census batch gratuit + Nominatim budgété. Pipeline brokerages : seed 630 brokerages US réels, discovery.py inspecte (fingerprints IDX kvCORE/iHomefinder/REW/Delta…, RESO, contacts) et score (feed_probability, priority) ; admin /admin/sources /admin/connectors /admin/brokerages (token HOMEKA_ADMIN_TOKEN dans .env du nœud, header X-Admin-Token). Anti-bot : direct d'abord, escalade _resilient Oxylabs→Scrapfly→BrightData si bloqué (clés Scrapfly/Firecrawl copiées d'immo-ka). Frontend React/Vite forké d'immo-ka : anglais/USD, palette rouge/blanc/bleu US (accent bleu #1e4fd8, rouge Old Glory #b31942, fond blanc — changé du vert le 2026-08-28, commit 1e56b86), ka-maps vendorisé (vendor/ka-maps, preserveSymlinks). watch 60 min = sync + geocode + imgaudit + discovery (15/cycle). Git origin gitsrv:srv/git/home-ka.git (commit initial bb09ddb). NOTE: og.png/favicon encore l'artwork Immo-Ka; jeton Mapbox pk partagé — ajouter www.home-ka.com aux restrictions d'URL Mapbox si la carte ne charge pas.",754 "decommissioned": "2026-09-04",755 "spbgit_repo": "home-ka",756 "backup": "M4M36:~/cluster-cleanup-backup-20260904/home-ka/ (.env, *.db, data/)",757 "status": "retirée du cluster — processus arrêtés, répertoire supprimé, README « URL live hors fonction » ; source de vérité = repo spbgit"758 }759 ],760 "superseded_by": "cluster-registry.json (copie de M1M32:~/dispatch/registry.json, orchestrateur maclustr-dispatch `mld`) — depuis le 2026-09-04 ce fichier n'est plus alimenté ; il garde l'historique et la section decommissioned."761}