SPB Git

spb/job-ka

Public
page 1
  1. Mon, Aug 24, 2026 4

    1. Simon-Pierre Boucher · 1 file +103 −30
    2. Simon-Pierre Boucher · 3 files +90 −264
  2. Sun, Aug 23, 2026 9

    1. Vague C — +620 connecteurs employeurs directs (350 -> 968)
      …
      Campagne de découverte massive en 3 angles : éclaireur Serper élargi
      (60 termes x 10 ATS x 3 pages), reprise des 266 flux confirmés le 22-08
      jamais intégrés, et sondage par nom de 182 grands employeurs QC sur 10 ATS.
      Fusion/nettoyage (scripts/merge_confirmed.py : dédoublonnage multi-vagues,
      filtre des faux positifs Québec hors province, nettoyage des noms issus des
      titres Google, exclusion des babillards de démo) puis secteurs attribués par
      lots (scripts/classify_sectors.py).
      
      - Workday +148, SmartRecruiters +118, Dayforce +96, Greenhouse +93,
        Breezy +50, Workable +40, Lever +32, Ashby +25, Recruitee +12, BambooHR +3
      - SuccessFactors +4 vérifiés main : TELUS, Énergir, VIA Rail, Canada Vie
      - prises notables : Thales, Fiera Capital, Fednav, Wolseley, Cominar, Ludia,
        Granit Design, Vortex Structures Aquatiques, Warner Bros. Discovery
      - 973 sources au registre ; docs/connecteurs régénérées (995 fiches) ;
        docs/CONFORMITE.md : section Vague C + écartés (Air Canada -> Phenom, TÉLUQ,
        Valero, faux QC)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1,621 files +94,809 −2,405
    2. Favoris unifies « Mon univers Ka » (hub KA ID) : coeur sur cartes et fiche, page /favoris
      …
      - jobka/hubfav.py : client du magasin central de favoris du hub Groupe KA
        (HMAC signe, toggle synchrone, lecture cachee 30 s, zero stockage local)
      - jobka/web.py : GET /api/favorites + POST /api/favorites/toggle (session
        KA ID requise, 401 sinon) ; route SPA /favoris
      - jobka/auth.py : parametre next (chemin local, transporte dans le state
        signe) pour revenir a la page courante apres la connexion KA ID
      - frontend : favorites.tsx (FavProvider + FavButton), coeur sur JobCard et
        la fiche /emploi/:uid, page /favoris + liens nav et prefooter, CSS fav-btn
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 9 files +427 −15
    3. Simon-Pierre Boucher · 1 file +1 −1
    4. stats v3 : rapports PDF personnalisés (catalogue, rendu au choix, ReportBuilder)
      …
      - kapdf.py v3 partagé (catalog, mode personnalise, heatmap calendrier)
      - web.py : GET /api/stats/catalog + POST /api/stats/report/custom
      - kacharts.tsx : composant ReportBuilder intégré à PdfButton (modal,
        ordre, rendus, modèles localStorage) — SPEC.md §3bis
      Simon-Pierre Boucher · 4 files +715 −11
    5. SEO : villes groupées par slug (variantes de casse fusionnées, libellé majoritaire)
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file +51 −43
    6. SEO : pages programmatiques /villes + /ville/{slug} rendues en HTML (pattern lou-ka)
      …
      - jobka/seo.py : slugify, cache slug→ville, SSR /villes et /ville/{slug}
        (contenu dans #root, ItemList + BreadcrumbList), API /api/seo/villes et
        /api/seo/ville/{slug}, sitemap-villes.xml, liens internes accueil/fiche
        vers les nouvelles pages
      - frontend : pages React VillesPage/VillePage, routes, lien pied de page
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 4 files +324 −7
    7. scripts: éclaireur Serper + support Dayforce dans probe_ats (campagne connecteurs du 2026-08-22)
      …
      Outils laissés non commités par la session précédente : serper_scout.py
      (requêtes site:<ATS> × termes québécois → slugs candidats JSONL) et
      probe_ats.py étendu à 10 ATS (ajout dayforce).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +301 −3
    8. connecteurs: retrait de projevia (Laval… en France)
      …
      Le tenant Recruitee « projevia » est une entreprise française (Laval,
      Pays de la Loire, country_code FR — offres « Chauffeur SPL ») ajoutée par
      erreur : le filtre Québec la vidait à juste titre (0 offre publiée, source
      marquée brisée par la supervision). Données associées purgées.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file −16
    9. taleo_tbe: secours og:title (retrait du JSON-LD par la plateforme) + fenêtre syncs_since_h
      …
      - Taleo TBE a retiré le JSON-LD JobPosting de requisition.jsp : les offres
        sans cache de détail étaient toutes différées par le filtre Québec →
        kruger publiait 0 offre depuis des jours (72 items RSS). Secours : lieu
        extrait du og:title (« … – Ville, RÉGION, PAYS »). Kruger retrouve 54
        offres QC ; sepaq/hec/exo tenaient encore grâce à leurs caches.
      - base.detail() : ne met plus en cache les payloads vides ({} cadenassé par
        clé stable = connecteur gelé) ; 89 caches vides purgés de la base.
      - /api/stats : paramètre optionnel syncs_since_h pour la supervision api-ka
        (fenêtre complète du sync_log au lieu des 20 dernières entrées).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +49 −7
  3. Sat, Aug 22, 2026 7

    1. apparence : classes métier alignées sur la signature « éditorial sharp » Groupe KA
      …
      - job-card/sheet/tile/table : bordures encre 1,5 px + ombres décalées
        (--shadow-off-*), hover translate signature, tuiles avec liseré accent.
      - badges → chips du groupe (mono 10,5 px, uppercase, pilule bordée) ;
        salaire (vert bordé) et « offre directe » (accent) conservent leur sens.
      - filtres du héros : champs sharp (bordure encre, focus 3px 3px 0 accent,
        case « Salaire affiché » cochée = fond accent-soft).
      - héros : kicker signature « Pages carrières · Zéro intermédiaire » +
        surligné d'accent incliné (.hl) sur « à la source ».
      - pagination et titres de section en font-display 700 ; identité propre à
        l'emploi conservée (header encre, accent cyan, transparence salariale).
      - Vérifié Playwright : accueil desktop/mobile + fiche (localhost:8096),
        build Vite OK, pm2 job-ka-web redémarré, www.job-ka.com 200.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +81 −51
    2. Vague B — 110 nouvelles sources (26 Dayforce nouvelle famille + 84 sur familles existantes)
      …
      - Nouvelle famille Dayforce HCM (jobs.dayforcehcm.com, API JSON du frontal Next.js,
        csrf anonyme + recherche paginée, détail PayClass/PayType avec cache et budget) :
        26 employeurs dont Groupe Maurice, Groupe CH, La Vie en Rose, Eidos-Montréal,
        Air Canada Rouge, Port de Québec, Soprema, BPA…
      - Ajouts sur familles existantes : Workday +17 (Simons, Cineplex, TJX, FedEx, Abbott…),
        Greenhouse +17 (Coveo, KRAFTON, Lyft, AutoTrader…), SmartRecruiters +13,
        Workable +11, Breezy +8, Recruitee +7, Lever +6, Ashby +5.
      - sources.json : 244 → 354 sources ; docs/connecteurs régénérées (376 fiches).
      - docs/CONFORMITE.md : bases d'accès vérifiées 2026-08-22, 20+ sources écartées
        avec raisons (agences, agrégateurs, babillards vides, faux positifs français).
      - Sync validé : 110/110 sources OK, 2 102 offres ajoutées (total BD 25 280).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 505 files +23,122 −5,957
    3. SEO : SSR léger (accueil, fiches JobPosting, pages statiques), robots.txt et sitemaps
      …
      - jobka/seo.py : pattern Lou-Ka — head unique (title, description, canonical,
        hreflang fr-ca, og:locale fr_CA, twitter) + contenu HTML dans #root que
        React remplace au montage
      - accueil : title avec le nombre d'offres, JSON-LD WebSite/Organization,
        h1 + listes de liens (villes, dernières offres)
      - fiche emploi : JSON-LD JobPosting (baseSalary CAD, jobLocation QC/CA,
        employmentType, validThrough, TELECOMMUTE) + BreadcrumbList ; 404 inconnue,
        410 retirée, noindex quarantaine, canonical vers l'offre maîtresse (doublons)
      - robots.txt (Disallow /api/) + sitemap index + sitemap-pages +
        sitemap-emplois-N chunkés (10 000 URL, lastmod)
      - web.py : include_router(seo) avant le rattrape-tout SPA
      - index.html : lang fr-CA
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +506 −1
    4. connecteurs: chaine de fetch anti-bot resiliente (Oxylabs->Scrapfly->Bright Data)
      …
      Auto-escalade de BaseConnector.get() sur blocage (403/429/503/challenge CF)
      ou coupure reseau, via connectors/_resilient.py. Cles lues de l env avec repli
      sur ~/.claude/.env (accepte SCRAPFLY_KEY et SCRAPFLY_API_KEY). Reponse
      compatible requests.Response; coupe-circuit par hote. Aucun connecteur modifie.
      
      Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
      Simon-Pierre Boucher · 2 files +386
  4. Wed, Aug 19, 2026 15

    1. Famille Workland réécrite sur l'API JSON publique du frontal Atlas (jobs-prod published-external + default-profiles) : descriptions complètes fr/en, lieux géocodés, dates, mode de travail — 2 requêtes par cycle pour TOUT le réseau. Nouveau connecteur réseau atlas_workland (~80 employeurs QC : CSS scolaires, cégeps, CIUSSS Ouest-de-l'Île, Santé Québec Côte-Nord, ICM, STQ, UQTR, INRS… ; 1 238 offres QC). Connecteur cssdm retiré (couvert par le réseau), fixture remplacée par atlas_workland (sous-ensemble rejouable). Corrige la limite « workland description 0 % ».
      …
      Dans le même train : famille Njoyn paginée (rejeu du formulaire public Inp_ItemsPerPage/pn — Santé Montréal passe de 50 offres lues à 762 —, habillage tableau 5 colonnes titre/catégorie/ville/pays, filtre Québec optionnel, budget détail par classe, POST via Scrapfly pour les babillards Radware) ; famille UltiPro : hôte paramétrable (recruiting.ultipro.ca) ; lassonde réparé (l'ADP WFN ne sert plus que les postes américains — connecteur réécrit sur le site maison lassonde.com/fr/emplois, 31 offres QC).
      Simon-Pierre Boucher · 9 files +2,072 −73
    2. Simon-Pierre Boucher · 239 files +2,823 −2,146
    3. Simon-Pierre Boucher · 1 file +4 −1
    4. Stats v2 : dashboard ultra complet + 5 rapports PDF (module commun ka-ui v2)
      …
      - jobka/kapdf.py + frontend/src/ka/stats/{kacharts.tsx,SPEC.md} : canoniques v2
      - statsdash.py : 10 KPI (sparklines actives/nouvelles/retraits), 4 jauges de
        complétude (salaire, mode, géoloc, catégorie), série des retraits,
        multi-courbes top secteurs (date de publication affichée), barres empilées
        ajouts par source (sync_log), 3 distributions (salaires annuels, taux
        horaires, âge des offres), heatmap horaire 7x24 des observations, tableaux
        secteurs + sources & connecteurs, 11 records ; deltas seulement si la
        période précédente est couverte (rien d'inventé)
      - /api/stats/report : 5 modes (complet/synthese/tendances/repartitions/
        donnees), mode inconnu -> complet, filename(..., mode)
      - Stats.tsx : sections v2 dans l'ordre du SPEC (jauges, StatSummary,
        MultiLineChart, StackedBarChart, Histogram, HourHeatmap, PdfButton 5 modes)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 6 files +1,399 −237
    5. Correctifs front-end mobile : menu hamburger, carte calee sur la vraie hauteur du header, viewport-fit=cover, socle mobile ka-ui
      …
      - App.tsx : menu mobile hamburger sous 700px (bouton 44x44 aria-expanded, panneau deroulant sous le header, backdrop fixe HORS du header, verrou de scroll body + cleanup, fermeture route/Escape/backdrop) ; ResizeObserver sur header.site qui pose --header-h sur <html>
      - styles.css : .map-wrap = calc(100vh/100dvh - var(--header-h,58px)) (fini le saut de barre navigateur et le 58px faux sur header 2 lignes) ; styles .menu-btn/.mobile-menu/.mm-backdrop avec var(--z-modal)/var(--z-overlay) ; header.site a var(--z-header) ; champs filtres a 16px sous 700px (anti-zoom iOS) ; extension tactile ::after -8px sur a.logo
      - index.html : meta viewport avec viewport-fit=cover (safe-area iOS)
      - src/ka/tokens.css : section SOCLE MOBILE OBLIGATOIRE (z-index unifies, --vh100 dvh, verrous de scroll, filet anti-zoom 16px, extension tactile gk-badge)
      - public/ka-agent.js : agent corrige (safe-area, textarea 16px, plein ecran <=640px + verrou scroll)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 5 files +259 −19
  5. Tue, Aug 18, 2026 5

    1. docs/connecteurs : snapshot post-cycle complet (220 sources, 42 min)
      …
      Régénération des fiches sur l état stable après le premier cycle horaire
      complet à 220 sources (12:46-13:28) : 8 862 offres actives.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 239 files +1,542 −1,537
    2. Documentation connecteurs (standard Groupe-KA) + registre de conformité
      …
      - scripts/gen_connector_docs.py : générateur rejouable (ast + sources.json +
        BD live en lecture seule + sync_log + git) -> docs/connecteurs/ :
        INDEX.md + 17 fiches plateformes ATS (mécanique, endpoints, budgets,
        tableau des tenants) + 217 fiches employeurs + 3 fiches portails +
        fiche dépôt direct (239 fichiers, sections fixes standardisées)
      - docs/CONFORMITE.md : registre de conformité par famille (base d accès,
        attribution/lien candidature vérifié -> offre originale, zéro donnée
        personnelle de candidat, Québec Emploi écarté clicSÉQUR, vérifié 2026-08-18)
      - README : section Connecteurs (17 ATS, 217 employeurs directs, 3 portails,
        badge Offre directe, dépôt direct), structure/env/API à jour
      - data/sources.json : _meta enrichi (compteurs, liste ATS, pointeurs docs)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 243 files +26,369 −18
    3. Simon-Pierre Boucher · 7 files +12,893 −4
    4. Badge « Offre directe » + stats directes/portails + canal de dépôt direct employeurs
      …
      - is_direct (source hors AGGREGATORS) exposé sur /api/jobs, /api/jobs/{uid}
        et jobs.geojson ; badge sobre sur les cartes d offres (frontend rebuild)
      - /api/stats : direct_jobs, direct_employers, direct_sources, portal_jobs,
        duplicates_hidden ; KPI « Offres directes employeur » au tableau de bord
      - POST /api/employeurs/offres : dépôt direct validé (pydantic + pot de miel),
        normalisé par JobPosting.finalize(), stocké source=depot-direct INACTIF en
        attente de modération ; page /employeurs (formulaire + explications)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 7 files +311 −1
    5. Portails agrégateurs : Guichet-Emplois, Jobillico, Espresso-Jobs — l offre directe gagne toujours la canonique
      …
      - guichet_emplois : recherche HTML fprov=QC fenêtre glissante (fage),
        Crawl-delay 5 s respecté, description via page offre (cache + budget)
      - jobillico : sitemaps job_postings (~30 k), fenêtre des plus récentes,
        JSON-LD JobPosting sur page détail (cache + budget)
      - espresso_jobs : ItemList JSON-LD paginé + détail JobPosting (TI/créatif QC)
      - dedup.AGGREGATORS = {guichet_emplois, jobillico, espresso_jobs} :
        autorité 10 contre 0 pour les pages carrières — les doublons
        portail↔direct sont masqués côté portail (dup_of)
      - sources.json : entrées portails (aggregator: true) + dépôt direct
      
      Québec Emploi (quebecemploi.gouv.qc.ca) sondé mais non retenu : SPA React
      avec API interne authentifiée (clicSÉQUR), pas d accès public propre.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 4 files +348 −2
Menu

Theme