SPB Git forge

spb/job-ka

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

page 5

  1. Wed, Aug 26, 2026 7

    1. Simon-Pierre Boucher committed 29 days ago · 1 file +8 −2
    2. Simon-Pierre Boucher committed 29 days ago · 2 files +116 −3
    3. Simon-Pierre Boucher committed 29 days ago · 1 file +7 −2
  2. Tue, Aug 25, 2026 12

    1. Refonte visuelle majeure du front-end : design editorial premium
      …
      - Hero : halo cyan, pastille « marche en direct », recherche centrale
        (barre blanche a ombre decalee cyan) + chiffres live (offres,
        employeurs, % salaire affiche)
      - Filtres : rail de selecteurs discrets sur desktop (pilules, etat
        actif encre/cyan), panneau bas coulissant sur mobile, puces de
        filtres actifs retirables + « Tout effacer »
      - Offres : fini les cartes bordees — rangees editoriales a filets
        fins, titre Space Grotesk, salaire en exergue cyan a droite avec
        equivalent annuel, metadonnees calmes en mono, barre d'accent au
        survol ; favoris alignes sur la meme structure
      - Fiche : mise en page ouverte (plus de grosse boite), metriques en
        blocs a filet superieur, CTA « Postuler » en accent
      - Tableau employeurs allege (filets fins), pagination sobre en mono,
        menu mobile avec entree en cascade, prefers-reduced-motion respecte
      - Bulle KA Agent masquee quand un panneau plein ecran est ouvert
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 6 files +768 −245
    2. Nav v2 correctif : le ✕ de fermeture vit DANS le panneau (fixe, toujours visible)
      …
      Le ✕ était le burger du header ; si le header n'est pas épinglé (bas de page),
      il défilait hors écran alors que le panneau fixed restait affiché. Ajout d'un
      .mm-close position:fixed en haut à droite du panneau et burger masqué à
      l'ouverture.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 2 files +22 −1
    3. Nav mobile v2 : le dropdown 480px devient un panneau plein écran fixed
      …
      Standard KA 2026-08-25 : .mobile-menu passe de position:absolute top:100%
      (max-height 480px) à position:fixed inset:0 — le menu est visible peu importe
      la position de scroll. Liens numérotés font-display, rang du header (marque +
      burger→✕) maintenu au-dessus du panneau.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1 file +26 −15
    4. Phase 3 — enrichissement des 1050+ connecteurs (exigences, séniorité) + refonte du display des offres avec métriques claires
      …
      Backend (enrichissement central via finalize() -> tous les connecteurs) :
      - normalize.py : extract_requirements() (années d'expérience, scolarité,
        langues exigées, FR/EN, bornes de plausibilité), parse_seniority()
        (stage/junior/intermédiaire/senior/direction : titre, libellés ATS,
        années d'expérience), en-têtes d'avantages élargis
      - schema.py : champ seniority + branchement des extracteurs (setdefault,
        jamais d'écrasement des valeurs ATS)
      - db.py : colonne seniority (migration auto) dans insert/update
      - web.py : filtre + facette séniorité, salary_context (médiane/quartiles
        de la catégorie + écart % de l'offre, cache 10 min), employer_jobs,
        median_salary_year dans /api/stats
      - scripts/backfill_enrich.py : backfill exécuté — 23 680 offres scannées,
        16 606 exigences ajoutées (26 % -> 77 %), 10 966 séniorités (0 -> 46 %)
      - tests/test_enrich.py : 27 nouveaux tests (101 au total, tous verts)
      
      Frontend (display + métriques claires) :
      - JobCard : badge Nouveau (≤3 j), salaire avec équivalent annuel, badges
        séniorité/exigences/bilingue, pied fraîcheur · avantages · plateforme
      - Fiche : panneau « En un coup d'œil » (salaire vs marché avec barre
        interquartile P25-P75, expérience, scolarité, langues, fraîcheur, date
        limite), volume d'offres de l'employeur, historique du salaire affiché
      - Accueil : filtre séniorité ; api.ts : types + helpers (compactMoney,
        yearlyEquiv, daysSince)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 11 files +819 −37
    5. Vague E — 3 nouvelles familles ATS (JazzHR, Teamtailor, Zoho Recruit) + 60 connecteurs, ~547 offres QC
      …
      - Nouvelles classes de plateforme : jazzhr.py (liste /apply/ + JSON-LD),
        teamtailor.py (sitemap + JSON-LD), zoho_recruit.py (flux RSS public) —
        filtre QC au détail avec report si budget épuisé (doctrine taleo_tbe/adp).
      - serper_scout.py : 5 nouveaux motifs (jazzhr, teamtailor, zohorecruit,
        talentnest, njoyn avec CLID/CL/hôte) + CLID dans le dédoublonnage.
      - 60 connecteurs : 31 JazzHR (Optel 13, Playground 21, Ultium CAM,
        Altitude Aérospatiale, FortNine, XTL 21, Valnet 22…), 17 Zoho Recruit
        (Mallette Saguenay 26, DRB 22, dentago 20, Carnaval de Québec, FÉRIQUE,
        Altitude Sports, Excavations Lafontaine…), 9 Teamtailor (Norda Stelo 50,
        Workin Group 34, Humanise 13, CAM Mécanique, Synertek…), 3 Njoyn
        (IR-CUSM 37, RTL 17, Groupe Master 17).
      - njoyn.py : correctif _keep — certains habillages mettent la date dans la
        colonne pays (Groupe Master 0 -> 17) ; n'exclure que les pays reconnus.
      - sources.json : 1 108 sources, 23 familles ATS ; docs/connecteurs
        régénérées (1 133 fiches) ; rapport docs/prospection-vagueE.md
        (écartés motivés + reliquats vague F : TalentNest, ENPQ/APCHQ, CUSM).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1,200 files +13,772 −4,752
    6. Vague D implémentée — 75 nouveaux connecteurs (968 -> 1044 employeurs), ~768 offres QC
      …
      - 55 connecteurs générés depuis feeds-vagueD.json (gen_connectors), tous
        synchronisés sans échec (333 offres). Sandvik re-pointé sur le babillard
        public sandvik-jobs.
      - 20 connecteurs manuels sur familles existantes (435 offres) : ADP ×12
        (Nordik, Uniboard, Richelieu, UV Assurance, Strathmore, H2O, Cook It,
        Canadian Royalties, Niobec, Nemaska, Abritek, Triple Boris), Alstom
        SuccessFactors (227 offres, La Pocatière/MTL), Kiewit-Ganotec (50),
        Groupe Bellemare Njoyn (27), Ville de Mirabel, Sel Windsor, Global Excel,
        Graymont TBE, IAMGOLD Taleo.
      - Correctifs de familles : adp.py FORCE_CITY (mono-sites QC sans
        requisitionLocation) ; taleo_tbe.py secours og:title variante
        « - Canada - QC - Ville » (Graymont 0 -> 4) ; successfactors.py slug
        « -queb » final + garde-fou is_quebec_location contre les faux « QC »
        (quality control, 3 offres US interceptées ; Kiewit 3 -> 50).
      - 9 pistes écartées avec raison (babillards US/vides, iCIMS SPA) —
        détail dans docs/prospection-vagueD.md.
      - sources.json : 1 048 sources ; docs/connecteurs régénérées (1 070 fiches).
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 1,151 files +37,534 −21,599
    7. Prospection vague D — 55 nouveaux flux ATS confirmés + 34 pistes autres ATS
      …
      Scout Serper (1 920 requêtes, 96 termes inédits : 61 villes/régions + 35 métiers)
      et découverte sectorielle (910 employeurs QC visités par detect_ats) :
      - data/feeds-vagueD.json : 55 flux confirmés ≥1 offre QC (workday 27,
        smartrecruiters 14, dayforce 6, bamboohr 3, greenhouse 2, ashby/lever/workable 1)
        — dont Loblaw/Provigo, Best Buy Canada, AMF, Chanel, Carrier, Equisoft,
        Groupe Meloche, Téléfilm, Le Massif, Scandinave Spa
      - data/detected-other-ats.jsonl : +34 pistes sur familles existantes
        (adp 17, ukg 5, successfactors 4, taleo 3, njoyn 3, icims 2) — filon minier
        Abitibi/Nord (IAMGOLD, Hecla, Wesdome, Nemaska, Niobec…), Alstom La Pocatière,
        Richelieu, Logistec, villes de Mirabel/Terrebonne
      - rapport complet : docs/prospection-vagueD.md (méthode, tables, suites)
      Prochaine étape sur validation : gen_connectors.py data/feeds-vagueD.json
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 1 mo ago · 3 files +870
  3. Mon, Aug 24, 2026 5

    1. Simon-Pierre Boucher committed 1 mo ago · 1 file +11
    2. Simon-Pierre Boucher committed 1 mo ago · 1 file +109 −44
    3. Simon-Pierre Boucher committed 1 mo ago · 1 file +103 −30
    4. Simon-Pierre Boucher committed 1 mo ago · 8 files +193 −1
    5. Simon-Pierre Boucher committed 1 mo ago · 3 files +90 −264
  4. 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 committed 1 mo ago · 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 committed 1 mo ago · 9 files +427 −15
    3. Simon-Pierre Boucher committed 1 mo ago · 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 committed 1 mo ago · 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 committed 1 mo ago · 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 committed 1 mo ago · 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 committed 1 mo ago · 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 committed 1 mo ago · 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 committed 1 mo ago · 3 files +49 −7
  5. 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 committed 1 mo ago · 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 committed 1 mo ago · 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 committed 1 mo ago · 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 committed 1 mo ago · 2 files +386