SPB Git forge

spb/job-ka

Public
229commits 1branches 0releases
38.1 MBsize
maindefault branch
7 h agolast push
HTML 82.1% Python 14.6% TypeScript 1.9% CSS 1% JavaScript 0.5%

page 6

  1. 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 committed 1 mo ago · 9 files +2,072 −73
    2. Simon-Pierre Boucher committed 1 mo ago · 239 files +2,823 −2,146
    3. Simon-Pierre Boucher committed 1 mo ago · 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 committed 1 mo ago · 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 committed 1 mo ago · 5 files +259 −19
  2. Tue, Aug 18, 2026 8

    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 committed 1 mo ago · 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 committed 1 mo ago · 243 files +26,369 −18
    3. Simon-Pierre Boucher committed 1 mo ago · 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 committed 1 mo ago · 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 committed 1 mo ago · 4 files +348 −2
    6. 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics et grands employeurs QC
      …
      - Secteur public : Santé Québec (emplois.sante.quebec), Emplois Santé Montréal
        (njoyn), CIUSSS de l Est-de-l Île-de-Montréal (taleo), CSSDM (workland),
        villes de Gatineau et Terrebonne, STL, RTC (njoyn via Scrapfly anti-Radware)
      - Grands employeurs : Bombardier, Cascades, Domtar (SuccessFactors sitemap
        RSS/urlset + microdonnées), Agnico Eagle, Bell Textron, Bayshore (Taleo REST
        + repli anglophone), Messer Canada (UltiPro), Lassonde, Mitsubishi HC
        Capital, MSI (ADP WFN + repli en_US), CAPREIT, McCarthy Tétrault, Omni,
        EDF Renouvelables (iCIMS + JSON-LD)
      - gen_connectors : EXTRA_ATTRS multi-attributs pour les nouveaux ATS
      - jobka/connectors/_jsonld.py : extraction schema.org/JobPosting partagée
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 34 files +2,093
    7. Expansion ×: 59 nouveaux employeurs connectés via sondage massif d ATS + détection de pages carrières
      …
      - scripts/probe_ats.py : sonde 800+ slugs candidats sur les 9 ATS (timeout 6 s,
        throttle 0,3 s/domaine, 8 threads) ; confirmé = ≥1 offre ET ≥1 offre QC
        (is_quebec_location du projet). Découverte Workday sans page HTML (bloquée
        406) : cxs 422=tenant absent / 404=hôte bon, puis devinette du site.
      - scripts/detect_ats.py : visite 6 337 domaines d employeurs QC (accueil +
        /carrieres|/careers|/emplois|/jobs|/fr/carrieres + liens carrières),
        reconnaît l ATS par motifs URL/DOM ; ATS non supportés (taleo 11,
        successfactors 6, adp 5, icims 4, njoyn 4, ukg 3) consignés dans
        data/detected-other-ats.jsonl pour traitement séparé.
      - data/feeds-expansion.json : 59 flux vérifiés -> 59 connecteurs générés
        (workday 22, smartrecruiters 10, bamboohr 12, greenhouse 6, lever 4,
        workable 2, ashby 1, recruitee 1, breezy 0) dont Vidéotron, CDPQ, BDC,
        Beneva, Intact, PSP, Investissement Québec, Rio Tinto, Alcoa, Airbus,
        Walmart Canada, Canadian Tire, RCGT, Lightspeed, Behaviour, Cirque du
        Soleil, Gameloft, Canam, QSL, Promutuel, EXFO…
      - 2 107 offres actives ajoutées, 100 % villes QC ; faux positif retiré
        (genetec smartrecruiters, doublon faible de genetec_inc workable)
      - normalize.py : villes hors-QC supplémentaires (Las Vegas, Orlando…)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 65 files +3,728 −2
    8. Qualité lieux : rejet des villes canadiennes/monde hors Québec + bâtiments McGill mappés vers Montréal
      …
      - normalize.py : _NON_QC_CITIES (villes CA hors QC + grandes villes monde) —
        parse_location ne prend plus ces libellés pour des villes et
        is_quebec_location les rejette explicitement ; purge BD : 127 offres
        actives hors-QC désactivées (Toronto 50, etc.)
      - mcgill.py : les lieux Workday de McGill sont des bâtiments (Bronfman
        Building, Currie Gymnasium…) -> ville forcée Montréal (Outaouais ->
        Gatineau) ; 182 offres corrigées en BD
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +44 −2
  3. Mon, Aug 17, 2026 3

    1. Intégration complète à l'écosystème Groupe KA
      …
      - Design : ka-ui vendoré (tokens.css importé avant le CSS local), accent
        officiel cyan #0c8599 (fin du lime hérité), socle dédupliqué, badge
        « Un service Groupe KA » au header (desktop + mobile, zéro débordement
        à 360/768/1440), prefooter local + KaFooter commun, page /contact
        (ecosystem.json), title « Job-Ka — Un service Groupe KA », assets
        og.png/favicon.svg/apple-touch-icon + meta OG/Twitter absolues.
      - SSO KA ID : jobka/auth.py (client job-ka, cookie jobka_session, table
        users), bouton « Se connecter avec KA » au header, testé bout-en-bout
        jusqu'au hub (307 → /connexion, client reconnu).
      - Stats : /api/stats/dashboard (contrat SPEC, cache 5 min, salaires
        bornés 25–400 k$, série date_posted réelle) + /api/stats/report (PDF
        fpdf2 via jobka/kapdf.py, complet + synthèse), page /stats refaite sur
        ka/stats/kacharts.tsx ; /api/stats historique conservé pour le hub.
      - KA Agent : widget ka-agent.js câblé (site job-ka).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 24 files +3,546 −132
    2. Création massive : 135 connecteurs employeurs québécois sur 9 plateformes ATS
      …
      - 4 nouvelles classes de plateforme : Ashby (salaires structurés natifs),
        Workable (widget v1), Recruitee (offres complètes en liste), Breezy
        (verbose=true), BambooHR (détail + atsLocation)
      - Générateur en série scripts/gen_connectors.py (idempotent) + flux vérifiés
        data/feeds*.json — chaque flux validé par requête HTTP réelle avant génération
      - 124 connecteurs générés : Circle K, TD, BMO, CIBC, Autodesk, Manuvie, CIMA+,
        Transat, Reitmans, Rodeo FX, TEHORA, MaintainX, Hopper, Xsolla, dcbel,
        Robotiq, Toon Boom, BIXI, LG2, Framestore, NOVIPRO, etc.
      - Corrections : pagination Workday avec facette (total absent après la page 1),
        lieux « N Locations » résolus via la page détail, canonicalisation des villes,
        timeout iA à 90 s
      - 2 796 offres actives, 104 sources productives au moment du commit
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 602 files +14,306 −10
    3. Fondation Job·Ka : socle backend, 5 connecteurs pilotes, frontend, tests
      …
      - Schéma JobPosting + normalisation (salaires $/h↔$/an, dates ISO, villes
        canoniques, catégories) — 25 tests unitaires
      - Pipeline hérité de Lou·Ka : diff par content_hash, délai de grâce,
        anti-dérive, expiration sur date limite, dédup union-find, géocodage
        Nominatim + Adresses Québec avec cache
      - Plateformes ATS : Workday (facette Québec auto-découverte), Lever,
        Greenhouse, SmartRecruiters — connecteurs pilotes CAE, Desjardins, Poka,
        Mistplay, Ubisoft (442 offres QC)
      - API FastAPI (/api/jobs, geojson, facets, sources, stats, /health) +
        frontend React/Vite (liste, fiche, carte MapLibre, stats)
      - Fixtures HTTP enregistrées/rejouées hors ligne + hook pre-commit
        d'en-tête d'auteur (section 17)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 54 files +7,657