SPB Git forge

spb/job-ka

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

page 1

  1. Thu, Sep 24, 2026 1

    1. [ka6] fix connecteur omni_hotels_gestion: migration du tenant iCIMS 'externalmanager-omnihotels' → 'canada-omnihotels' — l'ancien portail « manager » renvoie 500 Internal Server Error avec un corps window.top.location.href='null' (portail iCIMS désactivé, redirection de tout le trafic vers une cible nulle) depuis le sync de 2026-09-23 ~23:48 (2 échecs consécutifs → stale), sur TOUTES ses URLs (/jobs/search, /jobs/intro, avec ou sans in_iframe/hub) alors que les autres tenants iCIMS du repo (careers-capreit, externalhourly-omnihotels, careers-globalexcel) répondent 200 — problème tenant-spécifique, pas plateforme. La page carrières officielle omnihotels.com/careers (403 Akamai en direct, lue via Scrapfly asp+render_js) pointe désormais vers le portail iCIMS consolidé https://canada-omnihotels.icims.com/jobs/intro (+ un portail Dayforce jobs.dayforcehcm.com/en-US/ohmc pour les autres postes), et ce nouveau tenant expose EXACTEMENT les 5 mêmes offres montréalaises avec les MÊMES IDs (133511 Gestionnaire des ventes groupes, 133508 Chef tournant, 133506 Serveur(euse) service aux chambres, 133505 Commis à la réception, 133503 Préposé(e) aux comptes recevables) — même pattern liste iframe (pr=0, page unique) + JSON-LD au détail, aucun changement du connecteur de base icims.py requis. Fix minimal : SUB='canada-omnihotels' dans jobka/connectors/omni_hotels_gestion.py (docstring mise à jour) + careers_url dans data/sources.json. Sync isolé rejoué : found=5 (= médiane 5.0), updated=5 (URLs des offres migrées vers le nouveau domaine, vérifiées en base), ok=1 en 1,4 s. NB: le portail jumeau externalhourly-omnihotels (connecteur omni_hotels_horaire, ok) répond encore 200 et liste les 5 mêmes offres — s'il est désactivé à son tour, appliquer la même migration vers canada-omnihotels. Fiches docs/connecteurs/ omni_hotels_gestion.md + ats-icims.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1129 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher committed 15 h ago · 5 files +279 −271
  2. Wed, Sep 23, 2026 2

    1. [ka6] fix connecteur qohash: faux positif de supervision (0 offre QC légitime — Qohash n'a plus de poste au Québec) — aucun défaut du connecteur, correction d'un artefact sources.json (url vide) — le statut stale vient de la définition de succès de la supervision : le board Greenhouse qohash n'a AUCUNE offre QC depuis la dépublication le 2026-09-23 (sync de 12:10, found 1→0 ; sync rejoué 14:21, miss_count=2 → active=0) de l'unique offre montréalaise « Ingénieur(e) en solutions, bilingue (En, Fr) » 4722050005 (parue le 2026-08-12, détail API live 404 confirmé), donc les syncs horaires rendent ok=1 found=0 (médiane 1.0) et sont comptés comme non-succès — même profil que kodify c952fcc, goalcast a731f01, trupanion1 2cf5c9c, capintel f80c8d4, cliniqued 51913fe, canderel 32f1e24, coorstek 2c4caea, altusgroup f092997 : tenant à volume QC temporairement nul (12e cas du pattern). Le connecteur est INTACT et re-vérifié live : l'API boards-api.greenhouse.io répond (200, 4 offres publiées : Bilingual Fullstack Developer node/react, Senior Full Stack Developer React/Java, Senior Software Developer Go, Senior Strategic Account Executive Western Canada — toutes en lieu « Remote » SANS province, correctement exclues par is_quebec_location, cohérent avec la doctrine capintel « remote-first surveillé via le lieu du poste »), zéro lieu montréal/québec/laval/gatineau/sherbrooke dans le flux content=true (l'unique occurrence « quebec » est une préférence de résidence dans les Nice to Haves d'une offre Remote, pas un lieu), et l'endpoint /offices confirme que le bureau « Quebec Remote Work » (Quebec, Canada) existe mais n'a AUCUN poste rattaché (les 4 postes live sont au bureau générique « Remote ») — pas d'angle mort multi-bureaux ni de partition par langue (Greenhouse n'est pas partitionné par culture, contrairement à Dayforce). Correction au passage de l'artefact du générateur vague C dans data/sources.json : url vide → https://qohash.com (site officiel confirmé via Serper — qohash.com/fr « Sécurité des données et surveillance sans compromis », cybersécurité québécoise du CAMP ; curl direct 403 Cloudflare mais Scrapfly asp confirme 200 « Qohash - No Compromise Data Security and Monitoring » ; la fiche affichait « Site : [Qohash]() »). Docstring du connecteur mise à jour (re-vérif 2026-09-23). Fiches docs/connecteurs/ qohash.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1129 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). Sync isolé rejoué : found=0 en 0,1 s, ok=1, removed=1 (l'offre dépubliée passée active=0) — 0 reste le volume légitime tant que Qohash ne republie pas au Québec ; les offres reviendront d'elles-mêmes si republiées (filtre client is_quebec_location opérationnel, « Remote - Quebec » serait gardé). 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed yesterday · 5 files +177 −171
    2. [ka6] fix connecteur kodify: faux positif de supervision (0 offre QC légitime — Kodify n'a plus de poste au Québec) — aucun défaut du connecteur, correction d'artefacts sources.json + EMPLOYER (nom = titre de poste) — le statut stale vient de la définition de succès de la supervision : le tenant Recruitee kodify n'a AUCUNE offre QC depuis la dépublication le 2026-09-23 (sync de 12:00, found 1→0 ; sync rejoué 14:01, miss_count=2 → active=0) de l'unique offre montréalaise « Video Ad Designer » 2717647 (parue le 2026-08-20, détail live https://kodify.recruitee.com/o/video-ad-designer 404 confirmé), donc les syncs horaires rendent ok=1 found=0 (médiane 1.0) et sont comptés comme non-succès — même profil que goalcast a731f01, trupanion1 2cf5c9c, capintel f80c8d4, cliniqued 51913fe, canderel 32f1e24, coorstek 2c4caea, altusgroup f092997 : tenant à volume QC temporairement nul (11e cas du pattern). Le connecteur est INTACT et re-vérifié live : l'API kodify.recruitee.com/api/offers/ répond (200, 5 offres publiées : Senior Data Engineer, Full-Stack Developer, Senior System Administrator, Senior Full-Stack Developer — Barcelone ES remote ×4 — et Junior Set Designer — Los Angeles US), zéro occurrence de montréal/québec/laval/gatineau/sherbrooke/qc dans le JSON complet, et les 5 offres sont toutes correctement exclues par _keep (country_code ES/US ≠ CA) ; Recruitee n'est pas partitionné par langue (contrairement à Dayforce), une seule requête liste tout — pas d'angle mort. Corrections au passage des artefacts du générateur vague C : (1) data/sources.json name « Video Ad Designer » → « Kodify Media Group » et url vide → https://kodify.io (vérifié 200, titre « Kodify Media Group | Careers » — producteur de contenu vidéo/sites à fort trafic, hub montréalais ; kodify.com est une autre entreprise, KODE Associates ; la fiche affichait « Site : [Video Ad Designer]() ») ; (2) jobka/connectors/kodify.py EMPLOYER « Video Ad Designer » → « Kodify Media Group » (le générateur avait pris le TITRE du poste pour le NOM de l'employeur — company_name de l'API : « Kodify » ; toute future offre QC sera attribuée au bon employeur). Docstring du connecteur mise à jour (re-vérif 2026-09-23). Fiches docs/connecteurs/ kodify.md + ats-recruitee.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1129 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). Sync isolé rejoué : found=0 en 0,2 s, ok=1, removed=1 (l'offre dépubliée passée active=0) — 0 reste le volume légitime tant que Kodify ne republie pas au Québec ; les offres reviendront d'elles-mêmes si republiées. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed yesterday · 5 files +277 −298
  3. Tue, Sep 22, 2026 1

    1. [ka6] fix connecteur goalcast: faux positif de supervision (0 offre légitime — Goalcast n'a plus aucun poste ouvert) — aucun défaut du connecteur, correction d'un artefact sources.json (url vide) — le statut stale vient de la définition de succès de la supervision : le board Greenhouse goalcast n'a AUCUNE offre depuis la dépublication le 2026-09-22 (sync de 12:24, miss_count=2 → active=0 à 16:52) des 2 offres montréalaises « Administrative Coordinator - Coordonnateur(trice) Administratif(ive) | 2026 » 7801506003 (parue le 2026-07-10) et « Video Editor - Monteur Video | Unseen » 7759066003 (parue le 2026-06-01), détails live 404 confirmés, donc les syncs horaires rendent ok=1 found=0 (médiane 1.0) et sont comptés comme non-succès — même profil que trupanion1 2cf5c9c, capintel f80c8d4, cliniqued 51913fe, canderel 32f1e24, coorstek 2c4caea, altusgroup f092997 : tenant à volume QC temporairement nul (10e cas du pattern). Le connecteur est INTACT et re-vérifié live : l'API boards-api.greenhouse.io répond (200, jobs total=0 — board entièrement vide, pas seulement côté QC), l'endpoint /offices confirme un office unique « Goalcast HQ » (Montréal, Quebec, Canada) et /departments liste 12 départements TOUS à 0 poste (pas d'angle mort multi-bureaux ni de partition par langue — Greenhouse n'est pas partitionné par culture, contrairement à Dayforce), la page HTML job-boards.greenhouse.io/goalcast est 200 avec branding complet et message explicite « no current openings », et goalcast.com/careers reste en ligne (200, page Next.js) — pas de migration d'ATS. Goalcast étant un employeur 100 % montréalais (office unique QC), toute republication future sera re-capturée telle quelle. Correction au passage de l'artefact du générateur vague C dans data/sources.json : url vide → https://www.goalcast.com (vérifié 200 ; la fiche affichait « Site : [Goalcast]() »). Docstring du connecteur mise à jour (re-vérif 2026-09-22). Fiches docs/connecteurs/ goalcast.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1129 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). Sync isolé rejoué : found=0 en 0,1 s, ok=1 — 0 reste le volume légitime tant que Goalcast ne republie pas. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 2 days ago · 5 files +392 −414
  4. Mon, Sep 21, 2026 5

    1. [ka6] fix connecteur trupanion1: faux positif de supervision (0 offre QC légitime — Trupanion n'a plus de poste au Québec) — aucun défaut du connecteur, correction d'un artefact sources.json (url vide) — le statut stale vient de la définition de succès de la supervision : le tenant SmartRecruiters trupanion1 n'a AUCUNE offre QC depuis la dépublication le 2026-09-21 (sync de 17:38, miss_count=2 → active=0 à 19:09) des 2 offres montréalaises « Agent(e) de vente en assurance agréé(e) – Québec (bilingue) » 744000147096689 et « Licensed Insurance Sales Agent - Québec, Bilingual » 744000147096629 (parues le 2026-09-03, détail live 200 mais active=false confirmé — SmartRecruiters garde le détail consultable après dépublication), donc les syncs horaires rendent ok=1 found=0 (médiane 1.0) et sont comptés comme non-succès — même profil que capintel f80c8d4, cliniqued 51913fe, canderel 32f1e24 (volet dépublication), coorstek 2c4caea, altusgroup f092997 : tenant à volume QC temporairement nul (9e cas du pattern). Le connecteur est INTACT et re-vérifié live : l'API api.smartrecruiters.com répond (totalFound=54, une seule page, offres US/CA/CZ/DE/CH mélangées — l'API postings n'est PAS partitionnée par langue ou pays, pas d'angle mort type Dayforce), zéro occurrence de montréal/québec/laval/gatineau/sherbrooke/qc dans le JSON complet, et les 6 offres canadiennes live (Vancouver BC, Winnipeg MB, Edmonton AB, Calgary AB, London ON, Ottawa ON) sont toutes correctement exclues par _keep/is_quebec_location. Particularité du tenant : Trupanion republie CYCLIQUEMENT les 2 mêmes offres QC avec de nouveaux IDs (3 paires en base : 22/08 → 27/08 → 02/09), elles reviendront donc probablement d'elles-mêmes et le connecteur les re-capturera. Preuve du connecteur : fetch sans filtre QC = 54 offres lues (Seattle ×10, New York ×3, Prague, Berlin…). Correction au passage de l'artefact du générateur vague B dans data/sources.json : url vide → https://www.trupanion.com (site officiel confirmé via Serper — trupanion.com/fr-ca « Assurance pour animaux nº 1 au Canada » ; curl direct 403 Cloudflare mais Scrapfly asp confirme 200 ; la fiche affichait « Site : [Trupanion]() »). Docstring du connecteur mise à jour (re-vérif 2026-09-21). Fiches docs/connecteurs/ trupanion1.md + ats-smartrecruiters.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1129 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). Sync isolé rejoué : found=0 en 0,5 s, ok=1 — 0 reste le volume légitime tant que Trupanion ne republie pas au Québec. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 2 days ago · 5 files +207 −227
    2. [ka6] fix connecteur cliniqued: faux positif de supervision (0 offre QC légitime — Clinique D n'a plus de poste ouvert) — aucun défaut du connecteur, correction d'artefacts sources.json (url vide, secteurs vides) — le statut stale vient de la définition de succès de la supervision : le compte JazzHR cliniqued est ACTIF (marqueur « resumator » présent, pas d'« Inactive Career Page » type derumarketcatering) mais la page liste affiche « no open positions at this time » depuis la dépublication de l'unique offre « Concierge Esthétique / Technicienne en laser – Laval » 0CYFU0oxZp (Laval, first_seen 2026-08-25 ; détail live 410 Gone confirmé ; found passé de 1 à 0 au sync de 16:50, miss_count=2 → active=0), donc les syncs horaires rendent ok=1 found=0 (médiane 0.5) et sont comptés comme non-succès — même profil que capintel f80c8d4, canderel 32f1e24 (volet dépublication), coorstek 2c4caea, altusgroup f092997 : tenant à volume QC temporairement nul. Le connecteur est INTACT et re-vérifié live : page liste 200 avec structure jobboard valide (le garde-fou anti-faux-zéro de jazzhr.py — marqueur resumator + détection compte fermé — fonctionne), zéro lien /apply/<id>/ dans le HTML complet, mention explicite « no open positions at this time. » ; JazzHR n'est pas partitionné par langue (contrairement à Dayforce), pas d'angle mort. Correction au passage des artefacts du générateur vague E dans data/sources.json : url vide → https://www.cliniqued.com (vérifié 200, titre « Clinique D | Dermatologie esthétique et photothérapie à Laval », retrouvé via Serper — la fiche affichait « Site : [Clinique D]() ») et sectors [] → [Santé, Esthétique] (secteurs déjà au vocabulaire — 58 et 1 sources ; la fiche affichait « Secteurs : n/d »). Docstring du connecteur ajoutée (re-vérif 2026-09-21). Fiches docs/connecteurs/ cliniqued.md + ats-jazzhr.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1129 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). Sync isolé rejoué : found=0 en 0,2 s, ok=1 — 0 reste le volume légitime tant que Clinique D ne republie pas ; les offres reviendront d'elles-mêmes si republiées (liste + filtre Québec au détail opérationnels). 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher committed 2 days ago · 5 files +71 −57
    3. [ka6] fix connecteur capintel: faux positif de supervision (0 offre QC légitime — CapIntel n'a plus de poste au Québec) — aucun défaut du connecteur, correction d'un artefact sources.json (url vide) — le statut stale vient de la définition de succès de la supervision : le board Greenhouse capintel n'a AUCUNE offre QC depuis la dépublication le 2026-09-21 (sync de 16:41, miss_count=2 → active=0 à 18:14) de l'unique offre montréalaise « Context Engineer » 5111380007 (parue le 2026-04-16, détail live 404 confirmé), donc les syncs horaires rendent ok=1 found=0 (médiane 0.5) et sont comptés comme non-succès — même profil que canderel 32f1e24 (volet dépublication), coorstek 2c4caea, altusgroup f092997, quadreal ef41976 : tenant à volume QC temporairement nul. Le connecteur est INTACT et re-vérifié live exhaustivement : l'API boards-api.greenhouse.io répond (3 offres : Senior Account Executive « US (Remote) » 5234414007, Strategic Account Development Associate Toronto 5210626007 et NYC 5210627007, toutes correctement exclues par is_quebec_location), zéro occurrence de montréal/québec/laval/gatineau/sherbrooke/qc dans le JSON complet content=true, et l'endpoint /offices vérifié bureau par bureau : CapIntel a bien des bureaux « Gatineau office (QC) » et « Montreal office (QC) » dans Greenhouse mais 0 poste rattaché à chacun (les 3 postes live : 1 au bureau US NY, 2 sans bureau) — pas d'angle mort multi-lieux, pas de partition par langue (Greenhouse n'est pas partitionné par culture, contrairement à Dayforce). Correction au passage de l'artefact du générateur vague C dans data/sources.json : url vide → https://capintel.com (vérifié 200, titre « CapIntel | Investment Presentations for Wealth Firms » — fintech de présentations de placements, cohérent avec les secteurs Finance/Données déjà en place ; la fiche affichait « Site : [CapIntel]() »). Docstring du connecteur mise à jour (re-vérif 2026-09-21). Fiches docs/connecteurs/ capintel.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1129 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). Sync isolé rejoué : found=0 en 0,1 s, ok=1 — 0 reste le volume légitime tant que CapIntel ne republie pas au Québec ; les offres reviendront d'elles-mêmes si republiées (filtre client is_quebec_location opérationnel, remote-first canadien surveillé via le lieu du poste). 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher committed 2 days ago · 5 files +162 −184
    4. [ka6] fix connecteur canderel: bascule en balayage double fr-CA + en-CA (le tenant Dayforce ne publie plus rien en français) + correction artefacts sources.json — le statut stale combinait deux choses : (1) la dépublication NORMALE des 2 offres QC (« Coordonnateur/trice RH et recrutement » 3674/3628, même jobReqId 864, Montréal, parues les 2026-08-10/2026-07-16) confirmée à la source (absentes du search live toutes cultures ; le board en-CA liste 3 offres : Calgary 3709, Edmonton 3698, Toronto 3676), qui a fait tomber found de 2 à 0 au sync de 16:41 (miss_count=2 → active=0 à 18:14), et (2) un VRAI défaut d'aveuglement du connecteur : la recherche Dayforce est PARTITIONNÉE par culture de publication (constat harrisrebar 2026-09-10) et le search fr-CA du tenant canderel renvoie désormais maxCount=0 (vérifié live, 200 JSON valide) alors que en-CA/en-US renvoient les 3 offres du board, toutes publiées en anglais seulement — même défaut que g3canada 77813e5 et stateindustrial. Aucune offre QC live (les 3 offres sont AB/AB/ON, correctement exclues par _is_qc) : 0 reste le volume légitime tant que Canderel ne republie pas au Québec, mais le connecteur n'est plus aveugle et les offres reviendront d'elles-mêmes. Correction dans canderel.py : fetch() balaie fr-CA PUIS en-CA et déduplique par jobPostingId, la version française gagne (pattern harrisrebar, choisi plutôt que la simple bascule CULTURE=en-CA de g3canada car Canderel — promoteur immobilier montréalais — publiait ses offres QC en français : le double balayage garde le fr quand il existe). Preuve du correctif : fetch sans filtre QC = 3 offres lues (Calgary/Edmonton/Toronto), CULTURE restaurée à fr-CA après passage. Correction des artefacts vague C dans data/sources.json : url vide → https://canderel.com (vérifié 200, titre « Home | Welcome to Truly Invested | Canderel ») et secteurs « Agroalimentaire, Fabrication » (confusion du générateur avec l'édulcorant britannique Canderel) → « Immobilier » (déjà au vocabulaire, 30 sources ; les offres historiques — entretien d'immeuble Place Ville Marie, RH — sont bien l'immobilier montréalais). Fiches docs/connecteurs/ canderel.md + ats-dayforce.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1129 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). Sync isolé rejoué : found=0 en 5,2 s, ok=1 — cohérent avec la médiane 1.0 sur un tenant à volume QC temporairement nul. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 2 days ago · 5 files +256 −256
  5. Sat, Sep 19, 2026 2

    1. [ka6] fix connecteur coorstek: faux positif de supervision récurrent (0 offre QC toujours légitime — les seules offres historiques étaient à East Granby, CONNECTICUT) + échec nocturne transitoire de maintenance Workday — aucun défaut du connecteur, correction d'artefacts sources.json (url vide, region « East Granby » = ville du Connecticut) et de l'employer en base — le statut stale vient de la définition de succès de la supervision : le tenant Workday coorstek.wd1 n'a AUCUNE offre QC depuis le retrait le 2026-08-27 des 2 faux positifs « Production Operator II » R-114260/R-114269 (East Granby CT mappé par homonymie sur Granby/Estrie, fix générique f4038e4), donc les syncs horaires rendent ok=1 found=0 (médiane 0.0) et sont comptés comme non-succès depuis 560 h — même profil que altusgroup f092997, quadreal ef41976, cpab e498c30, drop_genie 8a53793. Le seul échec réel (sync de 03:37 cette nuit : « Workday non-JSON après 3 essais, HTTP 200 text/html ») est la fenêtre de maintenance nocturne Workday ~03 h EDT documentée dans workday.py (retry+backoff déjà en place), non reproduite au matin. Le connecteur est INTACT et re-vérifié live sous l'angle multi-lieux (angle mort type quadreal) : 91 offres sur 5 pages, zéro occurrence de quebec/montréal/laval/gatineau/sherbrooke dans le JSON complet des listes, recherche serveur searchText Quebec/Montréal → total 0 (Canada → 1, Ottawa ON), et les 4 offres « N Locations » (jusqu'à 29 lieux, dont AI Deployment Engineer R-113714-1) vérifiées UNE À UNE au détail cxs : 38 localisations cumulées, toutes US (Golden CO, Oak Ridge TN, Houston TX…), aucune canadienne. Correction au passage de deux artefacts du générateur vague C dans data/sources.json : url vide → https://www.coorstek.com (vérifié 200, titre « CoorsTek | Global Leader in Engineered Technical Ceramics ») et region « East Granby » → «» (East Granby est au Connecticut — la source n'a jamais eu de localité QC légitime ; 29 sources ont déjà une region vide), avec UPDATE en base de l'employer « Production Operator II » → « CoorsTek » des 2 offres inactives (le générateur avait mis le titre du poste comme employeur ; unifié avec l'EMPLOYER du connecteur). Docstring du connecteur mise à jour (re-vérif 2026-09-19, multi-lieux couverts). Sync isolé rejoué : found=0 en 7,6 s, ok=1 — 0 reste le volume légitime tant que CoorsTek ne publie pas au Québec ; les offres reviendront d'elles-mêmes si publiées (filtre client is_quebec_location + repli facette serveur opérationnels, le garde-fou _NON_QC_REGION_RE continue d'exclure East Granby CT). 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher committed 5 days ago · 2 files +8 −3
    2. [ka6] fix connecteur altusgroup: faux positif de supervision récurrent (0 offre QC toujours légitime) + échec nocturne transitoire de maintenance Workday — aucun défaut du connecteur, ajout du secteur manquant dans sources.json — le statut stale vient de la définition de succès de la supervision : le tenant Workday altusgroup.wd3 n'a AUCUNE offre QC depuis la dépublication fin août de l'unique offre montréalaise « Cost Consultant/Conseiller(ère) en analyse de coûts » R0013818 (active=0 depuis le 2026-08-26), donc les syncs horaires rendent ok=1 found=0 (médiane 0.0) et sont comptés comme non-succès depuis 565 h — même profil que quadreal ef41976, cpab e498c30, drop_genie 8a53793, et déjà diagnostiqué sur CE connecteur les 2026-08-26, 2026-09-12 et 2026-09-18. Le seul échec réel (sync de 02:43 cette nuit : « Workday non-JSON après 3 essais, HTTP 200 text/html ») est la fenêtre de maintenance nocturne Workday ~03 h EDT documentée dans workday.py (retry+backoff déjà en place), non reproduite au matin. Le connecteur est INTACT et re-vérifié live sous un angle NOUVEAU (l'angle mort multi-lieux type quadreal) : 42 offres sur 3 pages, zéro occurrence de quebec/montréal/laval/gatineau/sherbrooke/rougemont dans le JSON complet des listes, recherche serveur searchText Quebec/Montréal → total 0, et les 8 offres « N Locations » (jusqu'à 21 lieux) vérifiées UNE À UNE au détail cxs : 41 localisations cumulées, toutes US/UK (Texas, New York, Illinois, London, Manchester…), aucune canadienne hors Ontario/Alberta déjà exclues. Correction au passage du dernier artefact vague D dans data/sources.json : sectors [] → [Immobilier] (Altus Group = intelligence en immobilier commercial ; secteur déjà au vocabulaire, 29 sources ; la fiche affichait « Secteurs : n/d »). Docstring du connecteur mise à jour (re-vérif 2026-09-19, multi-lieux couverts). Sync isolé rejoué : found=0 en 3,9 s, ok=1 — 0 reste le volume légitime tant qu'Altus ne republie pas au Québec ; les offres reviendront d'elles-mêmes si republiées (filtre client is_quebec_location + repli facette serveur opérationnels). 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher committed 5 days ago · 2 files +6 −3
  6. Fri, Sep 18, 2026 8

    1. [ka6] fix connecteur quadreal: faux positif de supervision (0 offre QC légitime — QuadReal n'a plus de poste au Québec) — aucun défaut du connecteur, correction d'artefacts sources.json (url vide, graphie « Quadreal », région) — le statut stale vient de la définition de succès de la supervision : le tenant Workday quadreal.wd10 n'a AUCUNE offre QC depuis la dépublication aujourd'hui (2026-09-18, dernier sync à 1 : 15:26) de l'unique offre montréalaise « Property Administrator/Administrateur immobilier » R0006871 (ajoutée lors de la mission du 2026-09-10, détail live 404, recherche par ID → 0, miss_count=2 → active=0 déjà appliqué), donc les syncs horaires rendent ok=1 found=0 (médiane 0.5) et sont comptés comme non-succès depuis 4,5 h. Le connecteur est INTACT et re-vérifié live sur les DEUX sites du tenant (balayage double instauré le 2026-09-10, commit précédent) : Parkbridge = 8 offres (facette provinces AB 3 / ON 3 / BC 2), QuadReal = 69 offres (ON 31 / BC 29 / AB 6 / NY 5 / CA 3) — zéro valeur Québec dans les facettes, zéro occurrence de quebec/montréal/laval/gatineau/magog dans le JSON des listes, et les 6 offres multi-lieux (« 2/3 Locations », angle mort potentiel du filtre client) vérifiées une à une au détail : toutes Vancouver/Calgary/Toronto. Même profil que cpab e498c30, drop_genie 8a53793, altusgroup 2fc9e63 : tenant à volume QC nul compté non-succès par la supervision. Correction au passage de trois artefacts du générateur vague C dans data/sources.json : nom « Quadreal » → « QuadReal (QuadReal Property Group) » (graphie officielle, titre du site « QuadReal Property Group | QuadReal »), url vide → https://quadreal.com (vérifié 200 ; la fiche affichait « Site : [Quadreal]() »), region « Magog » (lieu de la seule offre Parkbridge historique) → « Montréal, Magog » (les deux localités QC ayant eu des offres), avec UPDATE en base de la graphie employer « Quadreal » → « QuadReal » de l'offre inactive R0006877 (unifiée avec l'EMPLOYER du connecteur). Docstring du connecteur mise à jour (re-vérif 2026-09-18, 0 offre QC sur les deux sites). Sync isolé rejoué : found=0 en 5,0 s, ok=1 — 0 est le volume légitime tant que QuadReal ne republie pas au Québec ; les offres reviendront d'elles-mêmes si republiées (le double balayage couvre déjà tout le tenant). 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher committed 5 days ago · 2 files +11 −5
    2. [ka6] fix connecteur cpab: faux positif de supervision (0 offre QC légitime — le CPAB n'a plus de poste au Québec) — aucun défaut du connecteur, correction d'artefacts sources.json (url vide, nom « Cpab », secteur « Conseil » erroné) — le statut stale vient de la définition de succès de la supervision : le tenant Dayforce cpab n'a AUCUNE offre QC depuis la dépublication aujourd'hui (2026-09-18, sync de 16:24) de son unique offre montréalaise « Adjoint, Affaires juridiques et conseil d'administration » 1159 (parue le 2026-05-27, absente du search live, miss_count=2 → active=0 déjà appliqué au sync de 18:18), donc les syncs horaires rendent ok=1 found=0 (médiane 0.5) et sont comptés comme non-succès depuis 5,1 h. Le connecteur est INTACT et re-vérifié live : le search Dayforce répond 200 en fr-CA/en-CA/en-US avec maxCount=1 — l'unique offre du board est « Directeur, Inspections (Vancouver) » 1173, Vancouver BC, correctement exclue par le filtre Québec (l'aveuglement fr-CA type g3canada/stateindustrial est exclu : le fr-CA sert bien le board, mêmes résultats que en-CA). Même profil que drop_genie 8a53793, altusgroup 2fc9e63, autotradercanada 77020a3 : tenant à volume QC nul compté non-succès par la supervision. Correction au passage de trois artefacts du générateur vague C dans data/sources.json : l'employeur est le Conseil canadien sur la reddition de comptes (CPAB/CCRC, régulateur de l'audit des sociétés ouvertes, bureaux Toronto/Montréal/Vancouver — l'offre « Directeur, Inspections » = inspections de cabinets comptables) — nom « Cpab » → « CPAB (Conseil canadien sur la reddition de comptes) », url vide → https://cpab-ccrc.ca (vérifié 200, version fr /fr, footer « Conseil Canadien Sur La Reddition De Comptes »), secteur « Conseil » (confusion du générateur avec le mot « Conseil » du nom) → « Comptabilité » (déjà au vocabulaire), avec UPDATE du champ employer de l'offre inactive 1159 en base et EMPLOYER du connecteur aligné. Docstring du connecteur mise à jour (1 offre live hors QC, re-vérif 2026-09-18). Sync isolé rejoué : found=0 en 3,9 s, ok=1 — 0 est le volume légitime tant que le CPAB ne republie pas au Québec ; les offres reviendront d'elles-mêmes si republiées. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher committed 5 days ago · 2 files +11 −7
    3. [ka6] fix connecteur drop_genie: faux positif de supervision (0 offre légitime — DropGenie n'a plus aucun poste ouvert) — aucun défaut du connecteur, correction d'artefacts sources.json (url vide, secteur erroné) — le statut stale vient de la définition de succès de la supervision : le tenant Breezy drop-genie n'a AUCUNE offre depuis la fermeture de son unique poste « Test Engineer - Microfluidics » 0cec9ddfa30d (Montréal, paru le 2026-06-08, page détail live = « Position Closed », miss_count=2 → active=0 déjà appliqué), donc chaque sync horaire rend ok=1 found=0 (médiane 1.0) et est compté comme non-succès depuis 4,8 h. Le connecteur est INTACT et re-vérifié live : l'API https://drop-genie.breezy.hr/json?verbose=true répond 200 avec un tableau vide [], et la page carrières affiche NO_POSITIONS (l'aveuglement type stateindustrial est exclu : zéro offre sur le board, toutes langues confondues). Même profil que altusgroup 2fc9e63, autotradercanada 77020a3, altom_transport ea13137 : tenant à volume nul compté non-succès par la supervision. Correction au passage de deux artefacts du générateur vague C dans data/sources.json : url vide → https://www.dropgenie.com (vérifié 200, titre « DropGenie – Making Personalized Possible » ; la fiche affichait « Site : [DropGenie]() ») et secteur « Logistique » → « Biotechnologie » (DropGenie automatise l'édition génique — « automate gene editing » sur son board —, son unique offre était un poste de microfluidique ; secteur déjà présent dans le vocabulaire, 7 sources). Docstring du connecteur mise à jour (0 offre, re-vérif 2026-09-18). Sync isolé rejoué : found=0 en 0,1 s, ok=1 — 0 est le volume légitime tant que DropGenie ne republie pas ; les offres reviendront d'elles-mêmes si republiées. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher committed 6 days ago · 2 files +6 −4
    4. [ka6] fix connecteur awc: ajout de Rougemont (Montérégie) au dictionnaire _QC_CITIES — le connecteur était aveugle aux offres du vignoble québécois d'Arterra — le statut broken combinait trois éléments : (1) une NameResolutionError DNS transitoire le 18/09 12:53 sur awc.wd3.myworkdayjobs.com (même vague que altusgroup/autotradercanada à 12:51, non reproduite), (2) la dépublication NORMALE de l'unique offre suivie « Représentant des ventes (SAQ/licenciés) Montréal/Brossard » R-13270 (absente du board live, miss_count=2 → active=0), qui a fait tomber found de 1 à 0, et (3) un VRAI défaut : le tenant Workday awc.wd3 n'expose qu'une facette de lieux plate au niveau ville, et sa seule localisation QC restante est « Rougemont » (Montérégie, vignoble d'Arterra) — absente du dictionnaire curé _QC_CITIES de normalize.py, donc invisible à la fois pour le filtre client is_quebec_location ET pour le repli facette-serveur de _find_qc_facet (qui agrège les valeurs de facette via la même fonction). Résultat : 2 offres QC réelles ignorées, dont « Électromécanicien - syndiqué (Qc) » R-13064 parue le 2026-08-19 (aveuglement d'un mois) et « Partenaire d'affaires en ressources humaines » R-13556 parue le 2026-09-10. Correction minimale dans normalize.py : entrée « rougemont » → « Rougemont » dans _QC_CITIES (regions-qc.json connaissait déjà rougemont → Montérégie ; le garde-fou _NON_QC_REGION_RE continue d'exclure « Rougemont, NC »). Bénéficie aussi au connecteur lassonde (Industries Lassonde, Rougemont). Sync isolé rejoué : found=2, added=2 en 4,6 s — R-13556 et R-13064 en base, actives, ville Rougemont, région Montérégie, volume 2 ≥ médiane 1.0. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 6 days ago · 1 file +2 −1
    5. [ka6] fix connecteur g3canada: bascule CULTURE fr-CA → en-CA (le tenant Dayforce ne sert plus rien en fr-CA) + correction artefacts sources.json — le statut stale combinait deux choses : (1) la dépublication NORMALE de l'unique offre QC (« Journalier » 3773, Québec, parue le 2026-07-30) confirmée à la source (404 sur l'API détail), qui a fait tomber found de 1 à 0 (miss_count=2 → active=0), et (2) un VRAI défaut d'aveuglement du connecteur : le search Dayforce du tenant g3canada en cultureCode fr-CA renvoie désormais maxCount=0 (vérifié live, 200 JSON valide) alors que le même search en en-CA/en-US renvoie les 13 offres du board — même défaut que stateindustrial d478a07 (le fr-CA n'est pas cassé globalement chez Dayforce : lavieenrose fr-CA = 154 offres ; c'est ce tenant qui a désactivé/vidé sa culture fr-CA). Aucune offre QC live sur le board (Winnipeg ×3, Alberta ×2, Saskatchewan ×5, North Vancouver, Thunder Bay ×2 — l'unique occurrence de « quebec » dans le JSON complet est « excluding Quebec » dans une description) : 0 reste le volume légitime tant que G3 ne republie pas au Québec (terminal au Port de Québec), mais le connecteur n'est plus aveugle et les offres reviendront d'elles-mêmes. Correction minimale dans g3canada.py : CULTURE='en-CA' (le filtre Québec reste côté client via _is_qc) + correction des artefacts vague C : EMPLOYER/name « Électricien industriel » (titre de poste pris pour un nom d'employeur) → « G3 Canada » (site officiel https://www.g3.ca vérifié 200, titre « G3 - G3 Canada Limited »), url vide → https://www.g3.ca, region « G3 Québec » (nom d'élévateur) → « Québec », avec UPDATE du champ employer de l'offre inactive en base. Sync isolé rejoué : found=0 en 2,9 s, ok=1 — 13 offres lues, 0 QC après filtre, cohérent avec la médiane 0.5. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 6 days ago · 2 files +13 −7
    6. [ka6] fix connecteur autotradercanada: faux positif de supervision (0 offre QC légitime — AutoTrader n'a plus de poste au Québec) + échec DNS transitoire ponctuel — aucun défaut du connecteur — le statut stale vient de la définition de succès de la supervision : le board Greenhouse autotradercanada n'a AUCUNE offre QC depuis la dépublication des 2 offres de Montréal/Longueuil (7799193003 et 7820524003, 404 confirmés sur l'API détail, déjà constatée le 2026-09-14), donc chaque sync horaire rend ok=1 found=0 (médiane 0.0) et est compté comme non-succès depuis le 2026-09-14 (97 h). Le connecteur est INTACT et re-vérifié live : l'API boards-api.greenhouse.io répond 200 avec 23 offres, toutes hors Québec (22 Toronto, 1 Remote-Canada Maritimes) — zéro occurrence de quebec/montréal/longueuil/laval/gatineau/sherbrooke dans le JSON complet content=true (l'aveuglement type stateindustrial est exclu ; is_quebec_location validé sur les libellés live, Remote (Canada) correctement exclu). L'unique sync en échec (18/09 12:52) est une NameResolutionError DNS transitoire sur boards-api.greenhouse.io, non reproduite (API OK en live). Même profil que altusgroup 2fc9e63, altom_transport ea13137, earthrated f7b1c35, canadasmotorcycle 175b215 : tenant à volume QC nul compté non-succès par la supervision. L'entrée sources.json est déjà propre (url https://www.autotrader.ca présente depuis la mission du 14/09) — seule la docstring du connecteur est mise à jour (23 offres, re-vérif 2026-09-18). Sync isolé rejoué : found=0 en 0,1 s, ok=1 — 0 est le volume légitime tant qu'AutoTrader ne republie pas au Québec ; les offres reviendront d'elles-mêmes si republiées. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher committed 6 days ago · 1 file +6 −1
    7. [ka6] fix connecteur altusgroup: faux positif de supervision (0 offre QC légitime — Altus n'a plus de poste au Québec) + échec DNS transitoire ponctuel — aucun défaut du connecteur, correction d'un artefact sources.json (url vide) — le statut stale vient de la définition de succès de la supervision : le tenant Workday altusgroup.wd3 (site AltusGroup) n'a AUCUNE offre QC depuis le retrait de l'unique offre montréalaise fin août (R0013818, déjà constaté le 2026-08-26), donc chaque sync horaire rend ok=1 found=0 (médiane 0.0) et est compté comme non-succès depuis le 2026-08-26 (551 h). Le connecteur est INTACT et re-vérifié live : l'API cxs répond 200 avec 42 offres (Toronto, Calgary, Ottawa, US, UK, Paris, Sydney, Singapour, Inde…) — recherche serveur « Quebec »/« Montréal » = 0 résultat, zéro occurrence de quebec/montréal/laval/gatineau/sherbrooke dans le JSON complet des 3 pages (l'aveuglement type stateindustrial est exclu ; le hook _external_id posé le 2026-09-12 reste correct). L'unique sync en échec (18/09 12:51) est une NameResolutionError DNS transitoire sur altusgroup.wd3.myworkdayjobs.com, non reproduite (API OK en live). Même profil que altom_transport ea13137, earthrated f7b1c35, canadasmotorcycle 175b215, jsheldllc bdc5d09, psacunion 4d8080b : tenant à volume QC nul/faible compté non-succès par la supervision. Correction au passage de l'artefact du générateur vague D : url vide dans data/sources.json → https://www.altusgroup.com (vérifié 200, titre « Altus Group - Data-Powered CRE Technology & Analytics » ; la fiche affichait « Site : [Groupe Altus]() »). Le nom d'employeur « Groupe Altus » est correct. Docstring du connecteur mise à jour (42 offres, re-vérif 2026-09-18). Sync isolé rejoué : found=0 en 4,0 s, ok=1 — 0 est le volume légitime tant qu'Altus ne republie pas au Québec ; les offres reviendront d'elles-mêmes si republiées. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 6 days ago · 2 files +4 −3
    8. [ka6] fix connecteur altom_transport: faux positif de supervision (0 offre QC légitime chez ce transporteur US) + échec DNS transitoire ponctuel — aucun défaut du connecteur, correction d'un artefact sources.json (url vide) — le statut stale vient de la définition de succès de la supervision : le tenant Workable altom-transport n'a AUCUNE offre QC depuis la fermeture de « Chauffeur de Camion-Citerne Classe 1 » (Montréal) fin août, donc chaque sync horaire rend ok=1 found=0 (médiane 0.0) et est compté comme non-succès depuis le 2026-08-28 (509 h). Le connecteur est INTACT et re-vérifié live : l'API widget répond 200 avec 52 offres, TOUTES aux États-Unis — zéro lieu CA dans les tableaux locations, zéro poste en télétravail, zéro mention Québec/Montréal dans le JSON complet (l'aveuglement type stateindustrial est exclu). L'unique sync en échec (17/09 20:51) est une NameResolutionError DNS transitoire sur apply.workable.com, non reproduite. Même profil que earthrated f7b1c35, canadasmotorcycle 175b215, jsheldllc bdc5d09, psacunion 4d8080b : tenant à volume QC nul/faible compté non-succès par la supervision. Correction au passage de l'artefact du générateur vague C : url vide dans data/sources.json → https://altomtransport.com (vérifié 200, titre « Altom Transport | Petroleum and Chemical Transportation » ; la fiche affichait « Site : [Altom Transport]() »). Le nom d'employeur « Altom Transport » est correct. Docstring du connecteur mise à jour (52 offres, re-vérif 2026-09-18). Sync isolé rejoué : found=0 en 0,2 s, ok=1 — 0 est le volume légitime tant qu'Altom ne republie pas au Québec ; les offres reviendront d'elles-mêmes si republiées. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 6 days ago · 2 files +9 −7
  7. Thu, Sep 17, 2026 5

    1. [ka6] fix connecteur stateindustrial: bascule CULTURE fr-CA → en-US (le tenant Dayforce ne sert plus rien en fr-CA) + correction artefacts sources.json — le statut stale combinait deux choses : (1) la dépublication NORMALE des 2 offres QC d'août (« Représentant(e) des ventes externes - Longueuil » 11661 et « Représentant(e) des ventes B2B » 11658, absentes du board dans TOUTES les cultures) qui a fait tomber found à 0 (miss_count=2 → active=0), et (2) un VRAI défaut d'aveuglement du connecteur : le search Dayforce du tenant stateindustrial en cultureCode fr-CA renvoie désormais maxCount=0 (vérifié live, 200 JSON valide) alors que le même search en en-US renvoie 29 offres, dont une offre QC RÉELLE au titre déjà francophone (« Représentant(e) des ventes externes (français/anglais) » 11795, Québec City QC, parue le 2026-09-05, détail API OK avec PayType Salary et fourchette 45-65 k) que le connecteur ne voyait pas. Le fr-CA n'est pas cassé globalement chez Dayforce (lavieenrose fr-CA = 150 offres) : c'est ce tenant qui a désactivé/vidé sa culture fr-CA. Correction minimale dans stateindustrial.py : CULTURE='en-US' (le filtre Québec reste côté client via _is_qc), plus correction des artefacts vague C dans sources.json : url vide → https://www.stateindustrial.com (vérifié 200, titre « Home - State Industrial Products ») et name/EMPLOYER « Stateindustrial » (slug collé) → « State Industrial Products », avec UPDATE du champ employer des 2 offres inactives en base. Sync isolé rejoué : found=1, added=1 en 6,9 s — l'offre 11795 est en base, active, ville Québec, région Capitale-Nationale, volume 1 ≈ médiane 0.5. 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 7 days ago · 2 files +9 −5
    2. [ka6] fix connecteur earthrated: faux positif de supervision (dépublication de l'unique offre QC Earth Rated) — aucun défaut du connecteur, correction d'un artefact sources.json (url vide) — le statut stale vient du retrait NORMAL de la dernière offre QC du tenant Greenhouse earthrated (« Social Media Video Creator & Editor/Créateur(trice) de contenu vidéo » 4327936009, Montréal, parue le 2026-07-22) : found=1 stable pendant des semaines jusqu'au sync de 12:21 (17/09), puis found=0 à 14:37 et 16:24, offre à miss_count=2 → active=0 (removed=1). Le connecteur est INTACT et vérifié live : l'API boards-api.greenhouse.io/v1/boards/earthrated/jobs répond 200 avec jobs=[] (0 offre sur TOUT le board, tous lieux confondus — le tenant n'a plus aucun poste ouvert), et le détail API de l'offre retirée renvoie 404 « Job not found » (page publique en 302 — dépublication confirmée à la source). Tous les syncs sont ok=1 dans sync_log — même profil que canadasmotorcycle 175b215, jsheldllc bdc5d09, psacunion 4d8080b, gilead 0760e1f, samsara, delos_data, solmentalhealth, autotradercanada, hera et ogilvycanada : tenant à faible volume QC dont la dépublication fait tomber le volume à 0, compté comme non-succès par la supervision (médiane 0.5). Correction au passage de l'artefact du générateur vague C : url vide dans data/sources.json → https://www.earthrated.com (site officiel vérifié vivant, 200, titre « Earth Rated | Making life with dogs simpler and better. » ; la fiche affichait « Site : [Earth Rated]() »). Le nom d'employeur « Earth Rated » est correct (pas d'artefact titre-de-poste). Sync isolé rejoué : found=0 en 0,1 s, ok — 0 est le volume légitime tant que le tenant n'a pas de poste ouvert ; les offres reviendront d'elles-mêmes si republiées. 106 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      Simon-Pierre Boucher committed 7 days ago · 1 file +1 −1
    3. [ka6] fix connecteur canadasmotorcycle: faux positif de supervision (dépublication de l'unique offre QC FortNine) — aucun défaut du connecteur, correction d'un artefact sources.json (url vide) — le statut stale vient du retrait NORMAL de la dernière offre QC du tenant JazzHR canadasmotorcycle.applytojob.com (« Warehouse Associate - Picking / Commis d'entrepôt » woW2CH6Y9y, Montréal, parue le 2026-09-01) : found=1 stable pendant des semaines jusqu'au sync de 12:24 (17/09), puis found=0 à 16:01 et 17:09, offre à miss_count=2 → active=0 (removed=1). Le connecteur est INTACT et vérifié live : le board /apply/ répond 200 et affiche explicitement « There are no open positions at this time. » (zéro lien /apply/<id>), et la page détail de l'offre retirée renvoie HTTP 410 Gone (réponse JazzHR d'une offre dépubliée — dépublication confirmée à la source). Tous les syncs sont ok=1 dans sync_log — même profil que jsheldllc bdc5d09, psacunion 4d8080b, gilead 0760e1f, samsara, delos_data, solmentalhealth, autotradercanada, hera et ogilvycanada : tenant à faible volume QC dont la dépublication fait tomber le volume à 0, compté comme non-succès par la supervision (médiane 0.5). Correction au passage de l'artefact du générateur : url vide dans data/sources.json → https://fortnine.ca (site officiel vérifié vivant — 403 anti-bot en curl direct mais 200 via Scrapfly, titre « Canada's Motorcycle Powersport Online Store | FortNine » ; la fiche affichait « Site : [FortNine]() »). Le nom d'employeur « FortNine » est correct (pas d'artefact titre-de-poste). Sync isolé rejoué : found=0 en 0,2 s, ok — 0 est le volume légitime tant que le tenant n'a pas de poste ouvert ; les offres reviendront d'elles-mêmes si republiées. 106 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 7 days ago · 1 file +1 −1
    4. [ka6] fix connecteur jsheldllc: faux positif de supervision (dépublication des 5 offres QC Technorm) — aucun défaut du connecteur, correction d'un artefact sources.json (url vide) — le statut stale vient du retrait NORMAL des 5 offres QC du tenant SmartRecruiters JSHeldLLC (filiale Technorm : Technicien multimédia 744000138400679 Montréal, 2× Technologue en architecture codes et normes 744000137204159 Québec / 744000137204029 Montréal, 2× Architecte conseiller technique OAQ 744000137203030 Québec / 744000137201864 Montréal) : found=4 stable pendant des semaines jusqu'au sync de 08:25 (17/09), puis found=0 à 10:25 et 12:42, les 5 offres à miss_count=2 → active=0 (removed=4+1). Le connecteur est INTACT et vérifié live : l'API postings répond (200, totalFound=105 sur le board, 6 offres Canada — Burlington ON, Winnipeg MB, Halifax NS, 2× Toronto ON, Vancouver BC — AUCUNE au Québec), et le détail API des offres retirées renvoie active:false (dépublication confirmée à la source). Tous les syncs sont ok=1 dans sync_log — même profil que psacunion 4d8080b, gilead 0760e1f, samsara, delos_data, solmentalhealth, autotradercanada, hera et ogilvycanada : tenant à faible volume QC dont la dépublication fait tomber le volume à 0, compté comme non-succès par la supervision (médiane 2.0). Correction au passage de l'artefact du générateur vague C : url vide dans data/sources.json → https://www.jsheld.com (site officiel vérifié vivant — 403 anti-bot en curl direct mais 200 via Scrapfly, titre « Technical, Scientific, Financial & Strategic Consulting Expertise » ; la fiche affichait « Site : []() »). Le nom d'employeur « J.S. Held LLC » est correct (pas d'artefact titre-de-poste cette fois). Sync isolé rejoué : found=0 en 1,7 s, ok — 0 est le volume légitime tant que le tenant n'a pas de poste QC ; les offres reviendront d'elles-mêmes si republiées. 106 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      Simon-Pierre Boucher committed 7 days ago · 1 file +1 −1
    5. [ka6] fix connecteur psacunion: faux positif de supervision (dépublication de l'unique offre QC) — aucun défaut du connecteur, correction de deux artefacts de génération (url vide + titre de poste utilisé comme nom d'employeur) — le statut stale vient du retrait NORMAL des offres QC du tenant Workday psacunion.wd10/psac : après « Regional Representative, Gatineau » (JR100166) et « Regional Representative, Montreal » (JR100182), la dernière offre QC « Grievance & Adjudication Officer, Montreal » (JR100033, Montréal) a disparu du board au sync de 23:50 (16/09) → found=0, miss_count 1 puis 2 → active=0. Le connecteur est INTACT et vérifié live : l'API cxs répond (200, total=8 offres sur le board — 7 à Ottawa ON, 1 à Yellowknife NT, AUCUNE au Québec), searchText=Montreal retourne total=0, et le détail cxs de JR100033 renvoie 403 (réponse Workday d'une offre dépubliée). Tous les syncs sont ok=1 dans sync_log — même profil que gilead 0760e1f, samsara 1a3fe57, delos_data 5cf2a52, solmentalhealth fe2debf, autotradercanada e3bb827, hera 4990c80 et ogilvycanada c7adc0c : tenant à faible volume QC dont la dépublication fait tomber le volume à 0, compté comme non-succès par la supervision (médiane 1.0). Correction au passage de DEUX artefacts du générateur vague C : url vide dans data/sources.json → https://syndicatafpc.ca (site officiel FR de l'AFPC, vérifié 200 ; la fiche affichait « Site : []() »), et name/EMPLOYER = « Regional Representative, Gatineau » (un TITRE DE POSTE pris pour le nom de l'employeur) → « Alliance de la Fonction publique du Canada » dans sources.json et psacunion.py, plus UPDATE du champ employer des 3 offres psacunion en base (elles ne reviendront pas via l'upsert puisque dépubliées). Sync isolé rejoué : found=0 en 0,3 s, removed=1 (JR100033 à miss_count=2 → retrait normal), ok — 0 est le volume légitime tant que le tenant n'a pas de poste QC ; les offres reviendront d'elles-mêmes si republiées. 106 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      Simon-Pierre Boucher committed 7 days ago · 2 files +5 −5
  8. Wed, Sep 16, 2026 3

    1. [ka6] fix connecteur gilead: faux positif de supervision (dépublication de l'unique offre QC) — aucun défaut du connecteur, correction de deux artefacts de génération (url vide + titre de poste utilisé comme nom d'employeur) — le statut stale vient du retrait NORMAL de l'unique offre QC du tenant Workday gilead.wd1/gileadcareers (« Medical Scientist HIV, Quebec », R0052893, Québec) : found=1 stable depuis des semaines jusqu'au sync de 09:04 (16/09), puis found=0 à 11:24 et 13:37, offre à miss_count=2 → active=0. Le connecteur est INTACT et vérifié live : l'API cxs répond (200, total=485 offres sur le board), la facette « locations » Canada ne liste plus que Edmonton (7), Ontario (1) et Mississauga (3) — plus aucun poste au Québec —, la recherche searchText=Quebec retourne total=0, et le détail cxs de R0052893 renvoie 403 S22 « permission denied » (réponse Workday d'une offre dépubliée ; la page publique 200 n'est que le shell SPA). Tous les syncs sont ok=1 dans sync_log — même profil que samsara 1a3fe57, delos_data 5cf2a52, solmentalhealth fe2debf, autotradercanada e3bb827, hera 4990c80 et ogilvycanada c7adc0c : tenant à offre QC unique dont la dépublication fait tomber le volume à 0, compté comme non-succès par la supervision (médiane 0.5). Correction au passage de DEUX artefacts du générateur vague C : url vide dans data/sources.json → https://www.gilead.com (vérifié 200 ; la fiche affichait « Site : []() »), et name/EMPLOYER = « Medical Scientist HIV, Quebec » (un TITRE DE POSTE pris pour le nom de l'employeur) → « Gilead Sciences » dans sources.json et gilead.py — l'offre inactive en base sera renommée d'elle-même à toute republication (l'UPDATE de l'upsert rafraîchit employer). Sync isolé rejoué : found=0 en 40,5 s (scan client du board, pas de facette QC serveur), ok — 0 est le volume légitime tant que le tenant n'a pas de poste QC ; l'offre reviendra d'elle-même si republiée. 106 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 8 days ago · 2 files +5 −5
    2. [ka6] fix connecteur eq3_ltd: retrait immédiat des offres CONFIRMÉES fermées — dans la nuit du 15 au 16/09, EQ3 a réellement fermé ses 12 postes (« Position Closed » vérifié live sur chacune des 12 pages /p/, plus aucun formulaire APPLY), étape suivante du délisting du board traité en 6012d1c ; le repli « board délisté » a fonctionné exactement comme conçu (re-vérification des 12 offres, rejet des pages fermées → found=0, volume désormais légitime), mais la garde anti-dérive du moteur (found=0 vs médiane 12 → retraits suspendus) maintenait les 12 offres fermées EN LIGNE sur le site (active=1, miss_count=0) pendant que la fenêtre de médiane (DRIFT_HISTORY=5) se vidait — correct pour un connecteur cassé, injustifié quand la fermeture est PROUVÉE page par page. Correctif tenant-spécifique dans eq3_ltd.py seul (db.py intact) : le repli collecte les uid des offres dont la page /p/ affiche « Position Closed » et les désactive directement (_deactivate_closed, UPDATE active=0), fermeture vérifiée à la source — les offres injoignables ou hors QC continuent de suivre le chemin normal miss_count. Vérifié live : la page carrières officielle eq3.com pointe toujours vers eq3-ltd.breezy.hr (pas de migration d'ATS), /json toujours [], validThrough des 12 offres tous dans le passé. Test unitaire adapté (offre « Position Closed » → retrait direct capturé, vivante conservée, hors-QC simplement lâchée). Sync réel rejoué : 12 offre(s) confirmée(s) fermée(s) — retirées, 0 offre active restante en base, found=0 légitime (le tenant n'a plus aucun poste ouvert ; dès republication le chemin normal /json reprend seul). 105 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      Simon-Pierre Boucher committed 8 days ago · 2 files +52 −10
  9. Tue, Sep 15, 2026 3

    1. [ka6] fix connecteur ogilvycanada: faux positif de supervision (dépublication de l'unique offre QC) — aucun défaut du connecteur, correction d'un artefact sources.json (url vide) — le statut stale vient du retrait NORMAL de l'unique offre QC du board greenhouse ogilvycanada (« Superviseur(e) De Comptes », id 4699352005, Montréal) : found=1 stable depuis des semaines jusqu'au sync de 15:17 (15/09), puis found=0 à 17:33 et 19:47, offre à miss_count=2 → active=0 (removed=1). Le connecteur est INTACT et vérifié live : l'API Greenhouse répond (200, 1 offre restante « Account Executive » à Toronto, Canada, correctement exclue par is_quebec_location — vérifié → False), l'offre retirée renvoie 404 sur l'API détail et sa page publique redirige vers le board avec ?error=true. Tous les syncs sont ok=1 dans sync_log — même profil que samsara 1a3fe57, delos_data 5cf2a52, solmentalhealth fe2debf, autotradercanada e3bb827 et hera 4990c80 : tenant à offre QC unique dont la dépublication fait tomber le volume à 0, compté comme non-succès par la supervision (médiane 0.5). Correction au passage du même artefact de génération : url vide dans data/sources.json → https://www.ogilvy.com/ca (vérifié 200 ; la fiche affichait « Site : []() »). Sync isolé rejoué : found=0 en 0,1 s, ok — 0 est le volume légitime tant que le tenant n'a pas de poste QC ; l'offre reviendra d'elle-même si republiée. 105 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 8 days ago · 1 file +1 −1
    2. [ka6] fix connecteur eq3_ltd: repli « board délisté » — /json vide alors que les 12 offres restent EN LIGNE (re-vérification live des pages /p/) — le 2026-09-15 vers 12:07, le board Breezy eq3-ltd a cessé de lister ses postes (/json et /json?verbose=true = [] — vérifié direct, UA navigateur ET proxy résidentiel CA —, sitemap.xml sans aucune offre, HTML %LABEL_NO_POSITIONS%) alors que les 12 offres QC connues sont toutes encore en ligne et ouvertes aux candidatures (pages /p/ 200 avec JSON-LD JobPosting complet et bouton APPLY, aucune « Position Closed ») et que la page carrières officielle eq3.com/ca/en/aboutus/careers pointe toujours vers ce même board : delisting du portail côté tenant, PAS une dépublication (contrairement aux précédents hera 4990c80/autotradercanada e3bb827 où les offres retirées affichaient « Position Closed »/404). L'API Breezy est saine globalement (bellatrx 14, brandmomentum 34, recruiting 78…) ; aucun slug alternatif (eq3.breezy.hr existe mais vide) ni endpoint de rechange (embed/feed/rss → 302). Correctif tenant-spécifique dans eq3_ltd.py (breezy.py intact) : quand la liste est vide, re-vérification live de chaque offre active connue via sa page /p/ — JSON-LD JobPosting exigé, rejet des pages « Position Closed »/« no longer accepting » et hors Québec, champs frais depuis le JSON-LD (titre, description, ville, date), libellé salarial conservé du dernier état liste (8/12 avec salaire, préservés). Données réelles constatées à la source, jamais inventées ; limite assumée : pas de découverte de NOUVELLES offres tant que le board est délisté — dès que /json redevient non vide, le chemin normal reprend seul et les offres réellement fermées suivront miss_count → retrait. Correction au passage du même artefact sources.json que samsara/delos_data/solmentalhealth/hera : url vide → https://www.eq3.com. Test unitaire ajouté (offre vivante QC conservée avec salaire, « Position Closed » et hors-QC lâchées, repli jamais sollicité sur liste non vide, 0 requête si base vide). Syncs réels rejoués : found=12 (médiane exacte) ×2, updated=4 puis 0, aucune alerte, miss_count=0 partout. 105 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 9 days ago · 3 files +196 −3
  10. Mon, Sep 14, 2026 5

    1. [ka6] fix connecteur autotradercanada: faux positif de supervision (dépublication des 2 offres QC) — aucun défaut du connecteur, correction d'un artefact sources.json (url vide) — le statut broken vient du retrait NORMAL des 2 seules offres QC du board greenhouse autotradercanada (« Gestionnaire de performance/Performance Manager - Montréal » id 7799193003 et « Performance Manager, Longueuil, QC » id 7820524003) : found=2 stable depuis des semaines jusqu'au sync de 12:40, puis found=0 dès 15:05, offres à miss_count=2 → active=0 à 16:18 (removed=2). Le connecteur est INTACT et vérifié live : l'API Greenhouse répond (200, 24 offres — 23 Toronto ON, 1 Remote Canada), les 2 offres retirées renvoient 404 sur l'API détail, et les libellés restants sont correctement exclus par is_quebec_location (vérifié : « Toronto, ON (Canada) » et « Remote (Canada) » → False). Tous les syncs sont ok=1 dans sync_log — même profil que samsara 1a3fe57, delos_data 5cf2a52 et solmentalhealth fe2debf : tenant à peu d'offres QC dont la dépublication fait tomber le volume à 0, compté comme non-succès par la supervision. Correction au passage du même artefact de génération : url vide dans data/sources.json → https://www.autotrader.ca (la fiche affichait « Site : []() »). Sync isolé rejoué : found=0 en 0,1 s, ok — 0 est le volume légitime tant que le tenant n'a pas de poste QC ; les offres reviendront d'elles-mêmes si republiées. 104 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 10 days ago · 1 file +1 −1
    2. [ka6] fix connecteur solmentalhealth: faux positif du filtre Québec — « Quebec St. » (nom de rue à Denver) matchait \bquebec\b — le statut stale vient de la dépublication NORMALE de l'unique offre du tenant (Psychiatric Clinician, id 4704220005, 404 live, retirée à 16:08 miss_count=2 → active=0), mais cette offre n'aurait JAMAIS dû être publiée : son lieu réel est « 3401 Quebec St. Suite 8000, Denver, CO, 80207 » (bureau de SOL Mental Health sur Quebec Street à Denver), classé ville=Québec/Capitale-Nationale et géocodé à Québec parce que _QC_MARKERS (\bquebec\b) est évalué avant le rejet _NON_QC_REGION_RE (« , CO ») dans is_quebec_location. La médiane historique 1.0 est donc elle-même un artefact : le bon volume QC de ce tenant est 0 (vérifié live : API Greenhouse 200, 65 offres, toutes aux États-Unis — NY/VA/MD/CO/DC). Correctif : nouveau _QUEBEC_STREET_RE — « quebec » suivi d'un type de voie anglophone (st/street/ave/blvd/rd/dr/ct/ln/way/pl/hwy/pkwy…) = nom de rue, neutralisé avant tout matching dans is_quebec_location ET parse_location ; le garde (?!-) préserve les abréviations de saints des libellés QC légitimes vérifiés en base (« CAN Quebec St-Hubert/St-Laurent/St-Hyacinthe/Ste-Thérèse », agropur). Tests unitaires ajoutés (4 rues US rejetées, libellés agropur et QC classiques conservés). Correction au passage du même artefact sources.json que samsara/delos_data/findevcanada/dupont : url vide → https://www.solmentalhealth.com (la fiche affichait « Site : []() »). Sync isolé rejoué post-patch : found=0 en 0,2 s, ok — 0 est le volume légitime, l'offre Denver ne reviendra plus même si republiée. 104 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      Simon-Pierre Boucher committed 10 days ago · 3 files +27 −5
    3. [ka6] fix connecteur lassonde: faux positif de supervision (épisode Sucuri transitoire) — repli Bright Data sur la page liste — le statut stale vient d'un unique échec à 08:17 (RuntimeError explicite de la garde du 2026-09-05 : 3× « HTTP 200 via scrapfly, 4515 octets » sans le conteneur job-result-default), combiné à la panne SQLite du matin (2b01fd4) qui avait empêché tout sync entre 05:32 et 08:17 — le connecteur est INTACT : rejeu = found=35, médiane exacte. Vraie faiblesse corrigée : pendant un épisode Sucuri, TOUTE la chaîne principale (direct→oxylabs→scrapfly) sert la même page tronquée « propre en apparence » (200 sans marqueur connu — 'access denied', 'sucuri_cloudproxy' etc. déjà couverts par is_blocked) à chaque essai, et le backoff 10-20 s ne suffit pas à sortir de l'épisode ; escalate() acceptait la réponse Scrapfly et ne tentait jamais Bright Data. La liste étant rendue serveur (render_js ne sert qu'au challenge), _fetch_list tente désormais Bright Data Web Unlocker (vendeur de déblocage différent) à chaque essai raté — vérifié live : BD livre 200/110 ko/35 cartes au moment même où le direct sert le challenge Sucuri 307. L'échec reste explicite (offres conservées) si BD échoue aussi. Test unitaire ajouté (repli BD gagnant, échec explicite si BD muet, BD jamais sollicité sur liste saine). Syncs rejoués post-patch : found=35 ok ×2. 104 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 10 days ago · 2 files +77 −2
    4. [ka6] fix site down jobka: convoi de verrous SQLite (journal DELETE) — bascule en WAL — le site était muet (ReadTimeout public+local depuis 03:38) alors que pm2 affichait online : la BD data/jobka.db (740 Mo, 64 340 offres) tournait en journal_mode=delete, où lecteurs et écrivains se bloquent mutuellement. Un cycle de sync long (agropur 92 s, airbus suspendu ~03:36) a tenu le verrou d'écriture ; chaque requête web (SSR d'accueil = plusieurs agrégats sur la table jobs) restait coincée dans sqlite3_step jusqu'au busy_timeout de 30 s, les 40 slots du threadpool AnyIO de FastAPI se sont remplis (sample : ~24 threads dans sqlite3_step, /emploi statique répondait mais /, /health et toute route sync-def étaient muets), et job-ka-sync crashait en boucle sur « database is locked » (18 restarts, journal chaud data/jobka.db-journal). Le restart pm2 automatique ne réglait rien : le sync relançait aussitôt son cycle d'écritures et le convoi se reformait. Mesure à froid : COUNT(*) sur 64 k lignes = 60 s sous contention, 0,03 s BD libérée — volumétrie saine (freelist 6 pages), quick_check ok, 0 offre perdue. Correctif racine : PRAGMA journal_mode=WAL (persistant, appliqué à la BD après arrêt propre + sauvegarde data/backup-jobka-20260914.db) + synchronous=NORMAL, inscrits dans db.connect() ; .gitignore couvre désormais data/jobka.db-* (journal/wal/shm). Post-fix : /health ok (24 719 offres actives, sync live), / local 200 en 0,1 s, public 200 en 0,55 s pendant que le cycle de sync écrit — plus aucun « database is locked ». 103 tests pytest verts.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher committed 10 days ago · 2 files +8 −2
  11. Sun, Sep 13, 2026 3

    1. Simon-Pierre Boucher committed 11 days ago · 1 file +1 −1
  12. Sat, Sep 12, 2026 2