SPB Git

spb/job-ka

Public
History of docs/connecteurs Clear filter
page 1
  1. Tue, Sep 29, 2026 2

    1. [ka6] fix connecteur quenchwater: faux positif de supervision « volume QC nul » (23e cas du pattern, 1re intervention sur cette source) — le connecteur est SAIN, found=0 est le comportement CORRECT (médiane historique 0.5). Le stale de 5,0 h vient de la définition de succès de la supervision (dernier sync found>0 = 2026-09-29 08:55) : l'unique offre QC en base (1ba16442 « Field Service Technician » Montréal, parue 2026-08-17) a été dépubliée par Quench entre 08:55 et 11:11 — détail 404 sur la page publique ET sur l'API v0 (nouveau marqueur documenté : Lever détail dépublié = 404, board 200). Le sync_log local est VERT en continu (ok=1, 313/313 syncs). Re-vérification live de l'API api.lever.co/v0/postings/quenchwater : 200, 64 offres, publication ACTIVE (dernières le 2026-09-28), couvre le Canada (Woodbridge/Toronto ON, Vancouver BC) mais zéro Québec. Aucune migration d'ATS : quenchwater.com (redirige vers quench.culligan.com) → page carrières Duda quenchwater--careers.multiscreensite.com, le board Lever reste la source des offres. Tant que Quench ne publie rien au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que geox f785ff4 / gearboxquebec 0373c30 / samsara 76fd913 / novistofr 894eb9d). Au passage, artefact vague C dans sources.json comblé (pattern geox/gearboxquebec) : url employeur vide → https://quenchwater.com (vérifié 200) — édition ciblée 1 ligne, format préservé. Docstring quenchwater.py enrichie (re-vérif 2026-09-29 + chronologie). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,9 s. Fiches docs/connecteurs/ quenchwater.md + ats-lever.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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 · 3 files +258 −284
    2. [ka6] fix connecteur novistofr: faux positif de supervision « volume QC nul » (22e cas du pattern, 1re intervention sur cette source) — le connecteur est SAIN, found=0 est le comportement CORRECT (médiane historique 0.5). Le stale de 4,9 h vient de la définition de succès de la supervision (dernier sync found>0 = 2026-09-28 19:04) : l'unique offre QC en base (4649647005 « Enterprise Account Executive - Montreal » Montréal, parue 2026-01-19) a été dépubliée par Novisto entre 19:04 et 21:12 — API détail 404, page 302 → /novistofr?error=true (marqueurs Greenhouse documentés, confirmés gearboxquebec 0373c30 / samsara 76fd913). Le sync_log local est VERT en continu (ok=1, aucune erreur). Re-vérification live de l'API boards-api.greenhouse.io/v1/boards/novistofr/jobs : 200 mais board VIDE (0 offre toutes régions). Particularité inédite documentée : « novistofr » est le board MIROIR FRANCOPHONE de « novisto78 » (ids Greenhouse appariés : 4649647005 FR vs 4649646005 EN, même titre) — Novisto a vidé le miroir FR et republié l'offre uniquement sur le board principal (4738750005, vivante), déjà captée par le connecteur frère novisto78 (VERT, found=6, 6 offres QC Montréal actives en base) → AUCUN angle mort, la couverture QC de Novisto est intacte. Aucune migration d'ATS : la page carrières officielle novisto.com/company/careers/job-openings (200) intègre l'embed Greenhouse du board novisto78 uniquement ; novistofr n'est plus référencé nulle part. Tant que le board FR reste vide, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que geox f785ff4 / gearboxquebec 0373c30 / samsara 76fd913). Au passage, artefact vague C dans sources.json comblé (pattern geox/gearboxquebec) : url employeur vide → https://novisto.com (vérifié 200) — édition ciblée 1 ligne, format préservé. Docstring novistofr.py enrichie (re-vérif 2026-09-29 + chronologie + particularité board miroir). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1 s. Fiches docs/connecteurs/ novistofr.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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 · 3 files +235 −261
  2. Mon, Sep 28, 2026 3

    1. [ka6] fix connecteur samsara: faux positif de supervision « volume QC nul » (21e cas du pattern, 3e passage sur cette source après 2026-08-29 et 2026-09-13) — le connecteur est SAIN, found=0 est le comportement CORRECT (médiane historique 0.5). Le stale de 4,6 h vient de la définition de succès de la supervision (dernier sync found>0 = 2026-09-28 13:20) : l'unique offre QC en base (7926750 « Mid-Market Account Executive - French Fluent » Montréal, parue 2026-05-14) a été dépubliée par Samsara entre 13:20 et 15:33 — API détail 404, page 302 → /samsara?error=true (marqueur Greenhouse documenté, confirmé gearboxquebec 0373c30). Particularité inédite documentée : c'est la MÊME offre 7926750 déjà dépubliée les 2026-08-29 et 2026-09-13 puis REPUBLIÉE sous le même id — Samsara la fait tourner en cycle dépublication/republication, donc ce connecteur re-signalera périodiquement des stales dans les deux sens (structurel, pas une panne ; même classe que geox f785ff4 / gearboxquebec 0373c30, avec en plus la republication réversible). Le sync_log local est VERT en continu (ok=1, aucune erreur, 340+ syncs). Re-vérification live de l'API boards-api.greenhouse.io/v1/boards/samsara/jobs : 200, 237 offres mondiales, zéro QC (les 21 « Remote - Canada » sans province sont exclues par design). Aucune migration d'ATS : la page carrières officielle samsara.com/company/careers/roles (200) référence toujours gh_board=samsara. Aucun artefact sources.json restant (déjà comblé au passage du 2026-09-13). Docstring samsara.py enrichie (re-vérif 2026-09-28 + chronologie du cycle 7926750). Sync isolé rejoué ×2 : found=0 stable, ok=1, 1,3-3,3 s. Fiches docs/connecteurs/ samsara.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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 · 3 files +69 −95
    2. [ka6] fix connecteur gearboxquebec: faux positif de supervision « volume QC nul » (20e cas du pattern, 1re intervention sur cette source) — le connecteur est SAIN, found=0 est le comportement CORRECT (médiane historique 0.5). Le stale de 5,1 h vient de la définition de succès de la supervision (dernier sync found>0 = 2026-09-28 12:48) : l'unique offre QC en base (7807902003 « Directeur·rice du design / Design Director » Montréal, parue 2026-07-17) a été dépubliée par Gearbox entre 12:48 et 15:01 — page détail Greenhouse HTTP 302 → ?error=true (nouveau marqueur documenté : Greenhouse détail dépublié = 302 vers le board avec error=true). Le sync_log local est VERT en continu (ok=1, aucune erreur, 354+ syncs). Re-vérification live de l'API boards-api.greenhouse.io/v1/boards/gearboxquebec/jobs : 200, {"jobs":[],"meta":{"total":0}} — board vivant mais VIDE, zéro offre toutes régions. Aucune migration d'ATS : la page carrières officielle (gearboxquebec.com → 2k.com/fr-CA/studios/gearbox/careers/#quebec, Gearbox appartient à Take-Two/2K) pointe toujours vers greenhouse.io/gearboxquebec ; le board frère « gearbox » (siège) n'a qu'1 offre, Frisco Texas, zéro Québec — aucun angle mort. Tant que Gearbox Québec ne publie rien, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que geox f785ff4 / lifestance a4e473a). Au passage, artefact vague C dans sources.json comblé (pattern geox/lifestance) : url employeur vide → https://www.gearboxquebec.com (vérifié 200, redirige vers la page studio 2K) — édition ciblée 1 ligne, format préservé. Docstring gearboxquebec.py enrichie (re-vérif 2026-09-28 + chronologie). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1-0,9 s. Fiches docs/connecteurs/ gearboxquebec.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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 · 3 files +394 −420
    3. [ka6] fix connecteur rbc: angle mort réel « poste multi-lieux » derrière un stale volume-QC-nul (1re intervention) — contrairement aux 19 faux positifs précédents, il y avait une VRAIE offre QC manquée. Contexte : site early talent Workday rbc.wd3/RBCEARLYTALENT1 (stages/co-op, médiane QC 0.5), l'unique offre QC en base (« 2027 Capital Markets, Global Markets Program Summer Analyst » R-0000180191, Montréal) dépubliée par RBC dans la nuit → found=0 ×2, sync_log VERT en continu (ok=1, 233+ syncs). Re-vérification live du board : 200 JSON, 46 postes (Toronto/USA/Malaisie), searchText=Quebec → 1 poste VIVANT : « 2027 Winter Change Management Intern (4 months) » R-0000186549, lieu principal MONTRÉAL Quebec + secondaire Toronto, publié 2026-09-10 — mais sa ligne de liste affiche locationsText=« 2 Locations » sans nommer les villes, que le filtre client is_quebec_location rejetait ; et ce tenant n'expose AUCUNE facette de province (State_Province sans Quebec ni Ontario) donc pas de filtre serveur possible. FIX dans workday.py (_keep) : repli sur le slug de lieu de l'externalPath (…/job/MONTRAL-Quebec-Canada/…, porte le lieu PRINCIPAL) quand le libellé est vide ou « N Locations » — zéro requête additionnelle, ne touche que les tenants filtrés client ; limite assumée documentée : un poste dont seul un lieu SECONDAIRE est QC reste manqué. La page détail remplace déjà « 2 Locations » par le vrai lieu (mécanique existante) → l'offre entre en base avec city=Montréal. Au passage, artefacts vague C corrigés (pattern ci/geox) : EMPLOYER 'Rbc' → 'RBC' (rbc.py, docstring re-vérif 2026-09-28 + chronologie), name 'Rbc' → 'RBC' et url vide → https://www.rbc.com (vérifié 200) dans sources.json — éditions ciblées, format préservé. Sync isolé rejoué : found=1 (added=1 puis stable ×2), ok=1, ~14 s ; non-régression Workday : cibc found=69 ≈ médiane 73. Fiches docs/connecteurs/ rbc.md + ats-workday.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +310 −310
  3. Sun, Sep 27, 2026 1

    1. [ka6] fix connecteur geox: faux positif de supervision « volume QC nul » (19e cas du pattern, 1re intervention sur cette source) — le connecteur est SAIN, found=0 est le comportement CORRECT (médiane historique 0.5). Le stale de 5,7 h vient de la définition de succès de la supervision (dernier sync found>0 = 2026-09-27 08:16) : l'unique offre QC en base (rkgocT7cPQ « Associé(e) à la vente – temps partiel » Pointe-Claire) a été dépubliée par GEOX dans la matinée — page détail HTTP 410 Gone (nouveau marqueur documenté : JazzHR détail dépublié = 410). Le sync_log local est VERT en continu (ok=1, aucune erreur, 250+ syncs) ; le garde-fou anti-faux-zéro de jazzhr.py (marqueur resumator) écarte l'hypothèse d'une page challenge. Re-vérification live du board geox.applytojob.com/apply/ : 200, marqueur resumator présent, 2 offres publiées, TOUTES deux en Ontario (Store Manager Heartland Town Centre Mississauga, Part-Time Sales Associate Mapleview Mall Burlington), zéro Québec — aucune migration d'ATS, compte JazzHR actif. Tant que GEOX ne publie rien au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que lifestance a4e473a). Au passage, artefacts vague E dans sources.json comblés (pattern lifestance/cibc) : url employeur vide → https://www.geox.com (vérifié 200) et sectors vide → « Commerce de détail » — édition ciblée, format préservé. Docstring geox.py enrichie (re-vérif 2026-09-27 + chronologie). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1-0,2 s. Fiches docs/connecteurs/ geox.md + ats-jazzhr.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +73 −73
  4. Sat, Sep 26, 2026 9

    1. [ka6] fix connecteur lifestance: faux positif de supervision « volume QC nul » récidivant (2e passage après 25262c1 du 2026-08-27) — le connecteur est SAIN, found=0 est le comportement CORRECT (médiane 0.0). Le stale de 745.8 h vient de la définition de succès de la supervision (dernier sync found>0 = 2026-08-26, avant la purge des 6 faux positifs d'homonymie Kirkland WA) : le sync_log local est VERT en continu (ok=1 found=0 toutes les ~2 h, 239+ syncs), un seul échec transitoire à 20:41 ce soir (« Expecting value: line 1 column 1 » = réponse Lever non-JSON, non reproduite). Re-vérification live de l'API Lever api.lever.co/v0/postings/lifestance : 200 JSON, 1398 postings, TOUS aux États-Unis (top lieux Philadelphia/Naperville/Haverford…, toujours 6 à Kirkland WA rejetés par is_quebec_location), zéro Canada/Québec — aucune migration d'ATS (jobs.lever.co/lifestance 200). Tant que LifeStance ne publie rien au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne. Au passage, artefacts vague C dans sources.json comblés (pattern epwealth/cibc) : url employeur vide → https://lifestance.com (vérifié 200) et region « Kirkland » ambiguë → « Kirkland WA » — édition ciblée 2 lignes, format préservé. Docstring lifestance.py enrichie (re-vérif 2026-09-26 + chronologie). Sync isolé rejoué ×2 : found=0 stable, ok=1, 1,5-4,2 s. Fiches docs/connecteurs/ lifestance.md + ats-lever.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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 · 3 files +103 −99
    2. [ka6] fix connecteur cibc: faux positif de supervision, variante « cycle interrompu » (4e cas après childrensplace 5ed90ff, churchdwight 43ac4f4 et ci 14dfdf4) — le connecteur est SAIN (71 offres QC live ≈ médiane 73.25), rien à corriger dans le code. Le statut stale vient de la nuit : dernier succès 00:29 (found=71), échec unique à 03:14 (« Workday non-JSON après 3 essais, HTTP 200 text/html » = fenêtre de maintenance nocturne ~03 h EDT déjà documentée, non reproduite au matin), puis cycles de sync interrompus par des restarts pm2 d'autres missions (KeyboardInterrupt à 05:21, 05:37, 05:55, 06:34, 06:52, 07:06 et 07:26 au log — même paquet de stales dans la plage alphabétique c–f), si bien que le scan de supervision n'a vu aucun succès entre 00:29 et son passage ; dès la reprise du cycle, syncs de 06:10 (found=71, updated=71), 06:49 et 07:21 (found=71) ok=1. Re-vérification live du board Workday cibc.wd3/search : 200 JSON, cxs searchText=Quebec → 106 correspondances (filtre QC client is_quebec_location fait le tri → 71). Contrairement à childrensplace/ci, PAS d'artefact vague C : EMPLOYER='Banque CIBC' et name déjà corrects (connecteur vague initiale 4657429) ; seule l'url employeur était vide dans sources.json → comblée (https://www.cibc.com, vérifié 200) — édition ciblée 1 ligne, format préservé. Docstring cibc.py enrichie (re-vérif 2026-09-26 + chronologie). Sync isolé rejoué ×2 : found=71 stable, ok=1, 6,6-7,1 s. Fiches docs/connecteurs/ cibc.md + ats-workday.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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 · 3 files +75 −75
    3. [ka6] fix connecteur ci: faux positif de supervision, variante « cycle interrompu » (3e cas après childrensplace 5ed90ff et churchdwight 43ac4f4) + correction de l'artefact vague C EMPLOYER=titre de poste — le connecteur est SAIN (3 offres QC live = médiane exacte 3.0). Le statut stale vient de la nuit : dernier succès 00:29 (found=3), échec unique à 03:13 (« Workday non-JSON après 3 essais, HTTP 200 text/html » = fenêtre de maintenance nocturne ~03 h EDT déjà documentée, non reproduite au matin), puis cycles de sync interrompus par des restarts pm2 d'autres missions (KeyboardInterrupt à 05:21, 05:37, 05:55, 06:34, 06:52 et 07:06 au log — même paquet de stales dans la plage alphabétique c–f), si bien que le scan de supervision n'a vu aucun succès entre 00:29 et son passage ; dès la reprise du cycle, syncs de 06:09 (found=3, updated=2), 06:49 et 07:21 (found=3) ok=1. Re-vérification live du board Workday ci.wd3/CI_FINANCIAL_EXTERNAL_CAREER-SITE : 200 JSON, searchText=Quebec → total=3 (Adjoint(e) aux ventes Montréal, Associé(e) au service Dorval, Vice-président régional Conseils en gestion de patrimoine Montréal) = médiane historique 3.0 — aucune migration d'ATS, aucun angle mort. CORRECTION RÉELLE au passage : artefact du générateur vague C (c45c753) — EMPLOYER/'name' était le TITRE DE POSTE « Associé(e) au service » au lieu de l'employeur CI Financial (même classe que childrensplace 5ed90ff), url vide et secteurs erronés (« Services, Commerce de détail » inférés du titre) dans sources.json ; les 3 offres publiques affichaient « Postuler chez Associé(e) au service ». Fix : EMPLOYER='CI Financial' dans ci.py (docstring re-vérif enrichie), name + url (https://www.cifinancial.com, vérifié 200 direct, titre « CI Financial ») + sectors=['Finance'] (cohérent avec cibc/sunlife/fieracapital) dans sources.json — édition ciblée, format du fichier préservé. Sync isolé rejoué ×2 : found=3 stable (updated=3 puis 0), ok=1, 2,2-2,3 s, les 3 offres actives en base portent maintenant l'employeur correct. Fiches docs/connecteurs/ ci.md + ats-workday.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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 · 3 files +84 −84
    4. [ka6] fix connecteur churchdwight: faux positif de supervision, variante « cycle interrompu » (2e cas après childrensplace 5ed90ff) — le connecteur est SAIN (5 offres QC live = médiane exacte), rien à corriger dans le code ni sources.json. Le statut stale vient de la nuit : dernier succès 00:29 (found=5), échec unique à 03:12 (« Workday non-JSON après 3 essais, HTTP 200 text/html » = fenêtre de maintenance nocturne ~03 h EDT déjà documentée, non reproduite au matin), puis cycles de sync interrompus par des restarts pm2 d'autres missions (KeyboardInterrupt à 05:21, 05:37, 05:55, 06:34 et 06:52 au log — d'où le paquet de stales dans la même plage alphabétique c–f : ci, cibc, cineplex, circlek, conagrabrands, danaher…), si bien que le scan de supervision n'a vu aucun succès entre 00:29 et son passage ; dès la reprise du cycle, syncs de 06:09 (found=5, updated=2) et 06:49 (found=5) ok=1. Re-vérification live du board Workday churchdwight.wd1/chdcanadacareers : 200 JSON, 13 offres au total dont exactement 5 à Montréal QC (Superviseur Validation Qualité, Spécialiste Systèmes de la Qualité, Spécialiste Gestion d'inventaire, Chimiste-Analyste réviseur des données, Monteur-ajusteur) = médiane historique 5.0 — aucune migration d'ATS, aucun angle mort ; contrairement à childrensplace, PAS d'artefact vague C : EMPLOYER='Church & Dwight Canada' et sources.json (name/url https://churchdwight.ca) déjà corrects (connecteur vague 5a66f48). Seule la docstring est enrichie (re-vérif 2026-09-26 + chronologie documentée). Sync isolé rejoué ×2 : found=5 stable, ok=1, 1,9 s. Fiches docs/connecteurs/ churchdwight.md + ats-workday.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +65 −65
    5. [ka6] fix connecteur childrensplace: faux positif de supervision (le connecteur est sain — 27 offres QC live = médiane) + correction de l'artefact vague C EMPLOYER=titre de poste — le statut stale vient de la nuit : échec unique à 03:11 (« Workday non-JSON après 3 essais, HTTP 200 text/html » = fenêtre de maintenance nocturne ~03 h EDT déjà documentée, non reproduite au matin) suivi de cycles de sync interrompus par des restarts pm2 d'autres missions (KeyboardInterrupt à 05:55 et 06:34 dans guichet_emplois visibles au log), si bien que le scan de supervision n'a vu aucun succès entre 00:28 et son passage ; dès la reprise du cycle, syncs de 06:08 et 06:49 ok=1 found=27. Re-vérification live du board Workday childrensplace.wd1/TCP05 : 200 JSON, 171 offres au total, searchText=Quebec → total=27 = exactement la médiane historique (Place Laurier, Galeries de la Capitale, Place Versailles…) — aucune migration d'ATS, aucun angle mort. CORRECTION RÉELLE au passage : artefact du générateur vague C (c45c753) — EMPLOYER/'name' était le TITRE DE POSTE « Associé des ventes » au lieu du nom de l'employeur (même classe que x49_solutions_1 99dccba et le piège Recruitee documenté), et url vide dans sources.json ; les 27 offres publiques affichaient « Postuler chez Associé des ventes ». Fix : EMPLOYER="The Children's Place" dans childrensplace.py (docstring re-vérif enrichie), name+url (https://www.childrensplace.com, vérifié via Scrapfly asp : 200, titre « The Children's Place Canada », le direct rend 403 anti-bot retail) dans sources.json — édition ciblée 3 lignes, format du fichier préservé. Sync isolé rejoué ×2 : found=27 stable (updated=27 puis 0), ok=1, 3,4-3,6 s, les 27 offres actives en base portent maintenant l'employeur correct. Fiches docs/connecteurs/ childrensplace.md + ats-workday.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +118 −118
    6. [ka6] fix connecteur mackenzie: angle mort mono-portail iCIMS — le tenant publie sur DEUX portails par langue (careersfr-/careersen-mackenzieinvestments), le connecteur ne scannait que le FR, vide depuis cette nuit — fusion des deux portails, version FR prioritaire (pattern fnfmb) — le statut stale vient de la définition de succès de la supervision (syncs ok=1 found=0 après dépublication des 2 offres QC du portail FR, re-vérifiée live : détails 410 « L'emploi requis n'a pas été trouvé », liste FR = vraie page « aucun emploi trouvé », 200/22 Ko), MAIS contrairement aux 19 cas précédents du pattern ce n'était PAS un simple faux positif : la page carrières officielle EN (mackenzieinvestments.com/en/careers, 403 direct, lue via Scrapfly) pointe vers careersen-mackenzieinvestments.icims.com — portail jumeau JAMAIS scanné, 16 offres vivantes dont 1 QC (6009 « Summer Intern 2027 - Inside Sales - Montreal Office », JSON-LD Montreal,QC, parue 2026-09-10) invisible du connecteur mono-portail. La page FR officielle (/fr/careers) pointe toujours vers careersfr- : les deux portails sont légitimes et actuels, migration d'ATS exclue ; même espace d'IDs (5416-6020), chaque offre n'apparaît que sur le(s) portail(s) de publication — même classe d'angle mort que la partition par culture Dayforce (fnfmb 2026-08-31, challenger 28ff173). Fix minimal dans mackenzie.py : SUBS=(careersfr-, careersen-), fetch() itère les deux sous-domaines via super().fetch() et fusionne par external_id (setdefault, FR gagne) — icims.py intact, les 3 autres connecteurs iCIMS (capreit, mccarthy_tetrault, globalexcel, edf_renouvelables, omni_hotels_*) non touchés. Sync isolé rejoué ×2 : found=1 stable (added=1 puis 0), ok=1, 24,1 s puis 2,8 s (cache détail) — 1 > médiane 0.0, fiche complète (titre, Montréal, description, date_posted 2026-09-10), URL live 200. Fiches docs/connecteurs/ mackenzie.md + ats-icims.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +70 −44
    7. [ka6] fix connecteur gilead: faux positif de supervision re-confirmé sous un angle NOUVEAU — le portail carrières officiel exclut migration d'ATS et angle mort (0 offre QC légitime, 19e cas du pattern) — le statut stale vient toujours de la définition de succès de la supervision : le board Workday gilead.wd1/gileadcareers n'a AUCUNE offre QC (516 offres live re-scannées ce jour, 0 occurrence de montréal/québec/laval/gatineau/sherbrooke/longueuil/trois-rivières, facette locations Canada = Edmonton 9 + Ontario 1 + Mississauga 4, searchText=Quebec → total=0, les 59 offres multi-lieux TOUTES re-inspectées une à une au détail cxs : aucune localisation canadienne, encore moins québécoise), donc les syncs horaires rendent ok=1 found=0 (médiane 0.0) comptés comme non-succès ; le seul échec réel (03:45 cette nuit, « Workday non-JSON après 3 essais, HTTP 200 text/html ») est la fenêtre de maintenance nocturne ~03 h EDT déjà documentée, non reproduite au matin. ANGLE NEUF (jamais couvert par l'intervention précédente 0760e1f qui re-vérifiait seulement l'API cxs) : inspection de la page carrières OFFICIELLE www.gilead.com/careers (200 direct, 116 Ko) → les seuls liens ATS pointent vers CE board Workday gilead.wd1.myworkdayjobs.com/gileadcareers — patterns challenger (migration JazzHR→Dayforce) et altusgroup (façade Phenom avec cache fantôme) EXCLUS ; sondage d'autres sites de publication du tenant (External, Ext, Careers, GileadExternal, Canada, GileadCanada, KiteCareers) → tous 404 (GileadCareers 200 = même site, casse insensible, même total 516), gileadcareers est l'unique portail externe (pas d'angle mort type autodesk « uni »). Le connecteur est INTACT : rien à corriger dans le code ni sources.json (propre depuis 0760e1f), seule la docstring est enrichie (re-vérif 2026-09-26 + angle portail officiel documenté). Fiches docs/connecteurs/ gilead.md + ats-workday.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). Sync isolé rejoué ×2 : found=0 en 38,3 s, ok=1 — 0 reste le volume légitime tant que Gilead Sciences (biopharma, sites canadiens à Edmonton et Mississauga) ne publie pas au Québec ; toute publication réelle apparaîtra dans le cxs et sera capturée (filtre client is_quebec_location opérationnel). 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 · 3 files +75 −75
    8. [ka6] fix connecteur coorstek: faux positif de supervision re-confirmé sous un angle NOUVEAU — le portail carrières officiel exclut migration d'ATS et angle mort (0 offre QC légitime, 18e cas du pattern) — le statut stale vient toujours de la définition de succès de la supervision : le board Workday coorstek.wd1/CoorsTekCareers n'a AUCUNE offre QC (100 offres live re-scannées ce jour, 0 occurrence de montréal/québec/laval/gatineau/sherbrooke/longueuil/trois-rivières, seule offre canadienne = Ottawa ON R-114322, les 4 offres multi-lieux R-114408/R-113714 (29 lieux)/R-113978/R-112832 re-inspectées au détail cxs : lieux tous US dont Virtual USA), donc les syncs horaires rendent ok=1 found=0 (médiane 0.0) comptés comme non-succès ; le seul échec réel (03:24 cette nuit, « Workday non-JSON après 3 essais, HTTP 200 text/html ») est la fenêtre de maintenance nocturne ~03 h EDT déjà documentée dans workday.py, non reproduite au matin. ANGLE NEUF (jamais couvert par les 2 interventions précédentes b7ebb74/2c4caea qui re-vérifiaient seulement l'API cxs) : inspection de la page carrières OFFICIELLE www.coorstek.com/en/careers (200 direct, 104 Ko) → un SEUL lien ATS, vers CE board Workday coorstek.wd1.myworkdayjobs.com/en-US/CoorsTekCareers — patterns challenger (migration JazzHR→Dayforce) et altusgroup (façade Phenom avec cache fantôme) EXCLUS ; sondage d'autres sites de publication du tenant (External, Ext, Careers, CoorsTek, CoorsTekCanada, Canada, CoorsTekExternal, CoorsTekCareersCanada) → tous 404, CoorsTekCareers est l'unique portail externe (pas d'angle mort type autodesk « uni »). Le connecteur est INTACT : rien à corriger dans le code ni sources.json (propre depuis 2c4caea), seule la docstring est enrichie (re-vérif 2026-09-26 + angle portail officiel documenté). Fiches docs/connecteurs/ coorstek.md + ats-workday.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). Sync isolé rejoué ×2 : found=0 en 6,3-6,6 s, ok=1 — 0 reste le volume légitime tant que CoorsTek (céramiques techniques, usines US/Europe/Asie) ne publie pas au Québec ; toute publication réelle apparaîtra dans le cxs et sera capturée (filtre client is_quebec_location + garde-fou _NON_QC_REGION_RE opérationnels). 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 · 3 files +66 −66
    9. [ka6] fix connecteur altusgroup: faux positif de supervision re-confirmé sous un angle NOUVEAU — le portail carrières officiel exclut migration d'ATS et angle mort (0 offre QC légitime, 17e cas du pattern) — le statut stale vient toujours de la définition de succès de la supervision : le board Workday altusgroup.wd3/AltusGroup n'a AUCUNE offre QC (44 offres live re-scannées ce jour, 0 occurrence de montréal/québec/laval/gatineau/sherbrooke, les 8 offres multi-lieux inspectées au détail cxs : 21+9+5+2×5 localisations toutes US/UK/Canada hors QC), donc les syncs horaires rendent ok=1 found=0 (médiane 0.0) comptés comme non-succès. ANGLE NEUF (jamais couvert par les 3 interventions précédentes f092997/09-18/09-19 qui re-vérifiaient seulement l'API cxs) : inspection de la page carrières OFFICIELLE www.altusgroup.com/careers → careers.altusgroup.com = façade Phenom People (tenant AGYAGUGLOBAL, CDN phenompeople.com) — pattern challenger/autodesk d'une migration d'ATS EXCLU car chaque applyUrl Phenom pointe vers CE board Workday (altusgroup.wd3.myworkdayjobs.com/AltusGroup/.../apply). Le portail Phenom affiche 53 offres dont UNE au Québec (« Cost Consultant/Conseiller(ère) en analyse de coûts », R0013818, Montréal, 60-75 k$, parue 2026-05-12) ABSENTE du board Workday : vérification décisive au détail cxs → 403 S22 « permission denied » (les deux variantes R0013818 et R0013818-1, avec et sans cookies de session fr-CA) = posting existant mais DÉPUBLIÉ du site externe, signature démontrée par triangulation (ID bidon → 404 S21 « not found », offre vivante témoin R0013639 → 200) et confirmée sur échantillon (R0013662, R0013813 aussi 403 = fantômes ; R0013890 présent au board → 200) : Phenom sert un CACHE jamais purgé (~31 offres périmées sur 53), le board Workday cxs est la source de vérité. Hypothèse « partition par locale » (pattern Dayforce) testée et écartée : pagination complète du board en session fr-CA = mêmes 44 offres, sans R0013818 ; la page publique 200 de l'offre est une coquille SPA vide (6 Ko, 0 JSON-LD) qui rendrait « not found » via le même cxs 403. Le connecteur est INTACT : rien à corriger dans le code (sources.json déjà propre depuis 09-18), seule la docstring est enrichie (re-vérif 2026-09-26 + signature 403 S22 documentée). Fiches docs/connecteurs/ altusgroup.md + ats-workday.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). Sync isolé rejoué : found=0 en 4,0 s, ok=1 — 0 reste le volume légitime tant qu'Altus ne republie pas au Québec ; toute republication réelle apparaîtra dans le cxs et sera capturée (filtre client + facette serveur opérationnels). 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 · 3 files +398 −398
  5. Fri, Sep 25, 2026 4

    1. [ka6] fix connecteur x49_solutions_1: faux positif de supervision (0 offre QC légitime — 49 Solutions 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 : l'org Workable 49-solutions-1 n'a plus AUCUNE offre QC depuis la dépublication le 2026-09-25 (sync de 17:43, found 1→0) de l'unique offre québécoise « Senior Labour Relations Consultant for CIRNAC - Government of Canada » 99BCF80902 (Québec, parue 2026-07-27) — détail live 301 → ?not_found=true confirmé (signature Workable d'une offre dépubliée), 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 liferaft c4cd79d, csncollision be10fa5, sangoma_3, qohash, kodify, goalcast, trupanion1, capintel, cliniqued, canderel, coorstek, altusgroup : tenant à volume QC temporairement nul (16e cas du pattern). Le connecteur est INTACT et re-vérifié live : l'API widget apply.workable.com/api/v1/widget/accounts/49-solutions-1?details=true répond (200, nom « 49 Solutions », 2 offres publiées, toutes deux à Ottawa, Ontario — mandats fédéraux DND et SSC, correctement exclues par is_quebec_location), zéro occurrence de montréal/québec/laval/gatineau/sherbrooke dans le JSON complet (5 757 octets) ; le widget Workable v1 liste TOUT en une requête (pas de partition par langue ou pays) — pas d'angle mort, et le board vivant exclut une migration d'ATS (contre-vérif du cas challenger 28ff173). Correction au passage de l'artefact du générateur vague C dans data/sources.json : url vide → https://www.49solutions.com (retrouvé via Serper + test direct des domaines candidats, vérifié 200, « 49 Solutions | Government Contracts and Consulting » — cabinet-conseil en contrats gouvernementaux, cohérent avec les mandats CIRNAC/DND/SSC du board ; la fiche affichait « Site : [49 Solutions]() »). Docstring du connecteur mise à jour (re-vérif 2026-09-25). Fiches docs/connecteurs/ x49_solutions_1.md + ats-workable.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1130 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 — le garde-fou 2-miss a retiré proprement l'offre dépubliée (miss_count=2 → active=0) ; 0 reste le volume légitime tant que 49 Solutions ne republie pas au Québec (l'entreprise est basée à Gatineau — toute republication sera re-capturée telle quelle, filtre client opérationnel). 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 · 3 files +120 −146
    2. [ka6] fix connecteur challenger: migration JazzHR → Dayforce (ns=fastfrate) — le statut stale vient de la migration d'ATS de l'employeur : le board JazzHR historique challenger.applytojob.com sert une vraie page « There are no open positions at this time. » (200, marqueur resumator présent — board vidé, pas un challenge) et les anciennes offres répondent HTTP 410 Gone ; la page carrières officielle challenger.com/careers (403 Cloudflare en direct, lue via Scrapfly render_js) embarque désormais le portail Dayforce jobs.dayforcehcm.com/<culture>/fastfrate/CANDIDATEPORTAL (Challenger fait partie du Groupe Fastfrate — le board JazzHR mêlait déjà les deux marques, ex. « Fastfrate Group (Lachine) »). Les 3 syncs found=0 étaient donc ok=1 sur un board réellement vidé, et les 2 dernières offres QC ont été retirées proprement par le garde-fou 2-miss. Réécriture du connecteur sur la plateforme existante jobka/connectors/dayforce.py, avec fusion des cultures fr-CA + en-CA (fr prioritaire, pattern fnfmb.py/euromoneyplc.py) car la recherche Dayforce est PARTITIONNÉE par culture de publication : le 2026-09-25 fr-CA ne voyait que 4 offres (les 4 QC, traduites) contre 26 en en-CA — sans la fusion, une future offre QC publiée seulement en anglais serait invisible. Aucun conflit de tenant : fastfrate n'était utilisé par aucun autre connecteur. sources.json : careers_url → jobs.dayforcehcm.com/fr-CA/fastfrate/CANDIDATEPORTAL, connector → dayforce, url vide → challenger.com (même artefact que les vagues précédentes ; vérifié 200 via Scrapfly, « Transportation and Logistics Provider | Challenger »). Sync isolé rejoué ×2 : found=4 stable (added=4 puis 0), ok=1, ~22 s — 4 est le volume QC réel du nouveau portail (26 offres groupe en en-CA, 4 QC re-comptées à la main dans les deux cultures), au-dessus de la médiane 1.0 ; fiches complètes 4/4 ville+description+date_posted, 1/4 salaire (43 000–53 000 $, les postes chauffeur/coordo n'en publient pas), URLs live 200. Pas de continuité d'IDs possible (IDs JazzHR alphanumériques → jobPostingId Dayforce numériques) : les 12 anciennes offres JazzHR restent inactives en base, les 4 nouvelles sont ajoutées. Fiches docs/connecteurs/ challenger.md + ats-dayforce.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). 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 4 files +393 −391
    3. [ka6] fix connecteur autodesk: migration Workday → Eightfold PCSX (nouvelle plateforme jobka/connectors/eightfold.py) — le statut stale vient du sync de 12:19 en 404 sur https://autodesk.wd1.myworkdayjobs.com/wday/cxs/autodesk/Ext/jobs, corps Workday « not found: Job_Posting_Site_ID=Ext » : le site de publication Ext du tenant est DÉCOMMISSIONNÉ (toutes les variantes de nom testées → 404 ; seul survit le portail stages « uni », 27 postes hors périmètre) et la page carrières officielle autodesk.com/careers (403 Akamai en direct, lue via Scrapfly render_js) pointe désormais vers jobs.autodesk.com/careers = Eightfold AI variante PCSX (l'endpoint Eightfold classique /api/apply/v2/jobs répond 403 « Not authorized for PCSX »). Première plateforme Eightfold du repo, écrite dans le style des voisines (workday.py/workable.py) : liste GET /api/pcsx/search?domain=…&start=N&num=10&sort_by=timestamp (num plafonné serveur à 10, pagination INSTABLE — count fluctuant et lignes répétées — dédup par id + garde-fou max_pages), filtre client is_quebec_location sur TOUTES les valeurs de locations[]+standardizedLocations[] (les remote pancanadiens listent le Québec parmi des dizaines de lieux ; la facette serveur location=QC,Canada matche à tort un poste remote 100 % US, vérifié — le filtre client fait foi), détail via la page publique /careers/job/<id> rendue serveur avec JSON-LD JobPosting COMPLET (réutilise _jsonld.py : description AVEC la section transparence salariale — l'API position_details la tronque : 9 830 car. vs 11 683, ce qui déclenchait l'alerte « 96 % des offres sans salaire » au premier essai —, employmentType normalisé FULL_TIME→FULL TIME, validThrough, re-sélection de l'adresse QC parmi les jobLocation multi-lieux pour ne pas étiqueter Toronto sur une offre QC), repli position_details si le balisage disparaît ; UA JobKaBot vérifié accepté partout. Continuité des IDs préservée : les req IDs Workday (26WDxxxxxx) survivent dans atsJobId → les 22 offres QC encore publiées se METTENT À JOUR (URLs migrées vers jobs.autodesk.com, vérifiées en base) au lieu d'être recréées ; les 28 dépubliées pendant la migration (sondage individuel par req ID → 0 hit) sont retirées proprement par le garde-fou 2-miss. Sync isolé rejoué ×3 : found=22 stable, ok=1, ~15-42 s — 22 est le volume QC réel du nouveau board (126 postes monde, re-mesuré ×2 en connecteur et en urllib nu ; la médiane 50 datait du board Workday d'avant la purge de migration), fiches complètes : 22/22 ville+type+date+description, 15/22 salaire (les stages n'en publient pas), work_mode 5/22 (≈ 20 % historique). sources.json : careers_url → jobs.autodesk.com/careers, connector → eightfold, url vide → autodesk.com (même artefact que les vagues précédentes). Fiches docs/connecteurs/ autodesk.md + ats-workday.md + ats-eightfold.md (nouvelle) + 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 · 4 files +501 −431
    4. [ka6] fix connecteur bayshore: retry avec backoff et cookies neufs dans _bootstrap de taleo.py — le statut stale vient d'UN sync échoué à 03:29 (« taleo bayshore: numéro de portail introuvable ») : le frontal Taleo renvoie à l'occasion la page d'amorce jobsearch.ftl SANS « portal=NNN » (interstitiel/session passager, statut 200) puis repart seul — transitoire récurrent de la plateforme, 4 occurrences en un mois sur 3 tenants (agnico_eagle 2026-09-01, textron 2026-09-02 et 2026-09-25 01:12, bayshore 2026-09-25 03:29), et le sync suivant de bayshore (06:57) avait déjà retrouvé found=9 ok=1 tout seul. Le durcissement du 2026-09-09 (_search_page : retries du non-JSON de searchjobs) ne couvrait pas cette étape : _bootstrap levait RuntimeError au premier HTML sans numéro de portail, faisant échouer tout le sync horaire. Fix minimal dans la classe de plateforme jobka/connectors/taleo.py (bénéficie aux 3 tenants touchés et à tous les connecteurs Taleo) : boucle de 3 essais dans _bootstrap avec backoff 10-20 s et session.cookies.clear() entre les essais — même famille de correctif que _search_page, appliqué à l'étape d'amorce. Sync isolé rejoué ×2 : found=9 (médiane 9.5), ok, ~35 s. Fiches docs/connecteurs/ bayshore.md + ats-taleo.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 · 3 files +140 −139
  6. Thu, Sep 24, 2026 4

    1. [ka6] fix connecteur liferaft: faux positif de supervision (0 offre QC légitime — Liferaft n'a plus aucune offre publiée) — 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 : l'org Workable liferaft n'a AUCUNE offre depuis la dépublication le 2026-09-24 (sync de 15:21, found 1→0 ; sync de 16:52, miss_count=2 → active=0) de l'unique offre québécoise « Senior Software Engineer » A48E333FD5 (Québec, parue 2026-08-17) — détail live 302 → apply.workable.com/oops confirmé (l'équivalent Workable d'un 404), 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 csncollision be10fa5, sangoma_3 783ee2c, qohash 2010afc, kodify c952fcc, goalcast a731f01, trupanion1 2cf5c9c, capintel f80c8d4, cliniqued 51913fe, canderel 32f1e24, coorstek 2c4caea, altusgroup f092997 : tenant à volume QC temporairement nul (15e cas du pattern). Le connecteur est INTACT et re-vérifié live : l'API widget apply.workable.com/api/v1/widget/accounts/liferaft?details=true répond (200, nom « Liferaft », mais 0 offre publiée — le board est entièrement vide, cas plus radical que csncollision/sangoma_3 où il restait des offres hors QC), zéro occurrence de montréal/québec/laval/gatineau/sherbrooke dans le JSON complet (773 octets) ; le widget Workable v1 liste TOUT en une requête (pas de partition par langue ou pays, contrairement à Dayforce) — pas d'angle mort. Correction au passage de l'artefact du générateur vague C dans data/sources.json : url vide → https://liferaftlabs.com (retrouvé via Serper, vérifié 200, « OSINT Platform for Real-Time Threat Intelligence | Liferaft » — plateforme OSINT de renseignement sur les menaces ; la fiche affichait « Site : [Liferaft]() »). Docstring du connecteur mise à jour (re-vérif 2026-09-24). Fiches docs/connecteurs/ liferaft.md + ats-workable.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 Liferaft ne republie pas au Québec ; toute republication sera re-capturée telle quelle (filtre client is_quebec_location opérationnel). 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +74 −100
    2. [ka6] fix connecteur csncollision: faux positif de supervision (0 offre QC légitime — CSN Collision 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 : l'org Workable csncollision n'a AUCUNE offre QC depuis la dépublication le 2026-09-24 (sync de 14:50, found 3→0 ; sync de 16:22, miss_count=2 → active=0) des 3 offres québécoises « Auto Body Technician - RED SEAL » 071A1A35F8 (Kirkland, parue 2023-06-02), « Collision Repair Technician - Apprentice » BC43C97A0F (Kirkland, parue 2023-12-27) et « Technicien en carrosserie automobile - Carrossier Débosseleur » B560734C38 (Québec, parue 2025-12-01) — détails live 302 → apply.workable.com/oops confirmés (l'équivalent Workable d'un 404), donc les syncs horaires rendent ok=1 found=0 (médiane 1.5) et sont comptés comme non-succès — même profil que sangoma_3 783ee2c, qohash 2010afc, kodify c952fcc, goalcast a731f01, trupanion1 2cf5c9c, capintel f80c8d4, cliniqued 51913fe, canderel 32f1e24, coorstek 2c4caea, altusgroup f092997 : tenant à volume QC temporairement nul (14e cas du pattern). Le connecteur est INTACT et re-vérifié live : l'API widget apply.workable.com/api/v1/widget/accounts/csncollision?details=true répond (200, 96 offres publiées : 63 aux États-Unis — Californie, Illinois, Washington, Hawaï, Nevada, Texas, Minnesota, Wisconsin, Utah, Tennessee, Arizona — et 33 au Canada hors Québec — Ontario, Alberta, Nouveau-Brunswick, Nouvelle-Écosse), zéro occurrence de montréal/québec/laval/gatineau/sherbrooke/kirkland dans le JSON complet, et les 96 offres sont toutes correctement exclues par _keep/is_quebec_location (les 33 CA ont region Ontario/Alberta/NB/NS ≠ Québec) ; le widget Workable v1 liste TOUT en une requête (pas de partition par langue ou pays, contrairement à Dayforce) — pas d'angle mort. Correction au passage de l'artefact du générateur vague B dans data/sources.json : url vide → https://csncollision.com (vérifié 200, « CSN Collision - Auto Body Repair & OEM-Certified Collision Centers » ; la fiche affichait « Site : [CSN Collision]() »). Docstring du connecteur mise à jour (re-vérif 2026-09-24). Fiches docs/connecteurs/ csncollision.md + ats-workable.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,3 s, ok=1 — 0 reste le volume légitime tant que CSN Collision ne republie pas au Québec ; toute republication sera re-capturée telle quelle (filtre client opérationnel — le réseau compte des ateliers QC, ex-Kirkland). 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +207 −233
    3. [ka6] fix connecteur sangoma_3: faux positif de supervision (0 offre QC légitime — Sangoma 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 : l'org Workable sangoma-3 n'a AUCUNE offre QC depuis la dépublication le 2026-09-24 (sync de 13:13, found 1→0 ; sync de 15:31, miss_count=2 → active=0) de l'unique offre montréalaise « Analytics Engineer, Enterprise Data » 6AC6A2A04F (parue le 2026-07-22, détail live 301 → apply.workable.com/sangoma-3/?not_found=true confirmé — l'équivalent Workable d'un 404), 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 qohash 2010afc, kodify c952fcc, goalcast a731f01, trupanion1 2cf5c9c, capintel f80c8d4, cliniqued 51913fe, canderel 32f1e24, coorstek 2c4caea, altusgroup f092997 : tenant à volume QC temporairement nul (13e cas du pattern). Le connecteur est INTACT et re-vérifié live : l'API widget apply.workable.com/api/v1/widget/accounts/sangoma-3?details=true répond (200, 5 entrées publiées : Payroll Manager remote US ×4 lieux Sarasota/Atlanta/Huntsville/Dallas + Senior Accountant Makati Philippines), zéro occurrence de montréal/québec/laval/gatineau/sherbrooke/QC dans le JSON complet (25,9 Ko), et les 5 entrées sont toutes correctement exclues par _keep/is_quebec_location (countryCode US/PH ≠ CA) ; le widget Workable v1 liste TOUT en une requête (pas de partition par langue ou pays, contrairement à Dayforce) — pas d'angle mort. Correction au passage de l'artefact du générateur vague C dans data/sources.json : url vide → https://sangoma.com (vérifié 200, « Sangoma: Business Communications Platform | UCaaS » ; la fiche affichait « Site : [Sangoma]() »). Docstring du connecteur mise à jour (re-vérif 2026-09-24). Fiches docs/connecteurs/ sangoma_3.md + ats-workable.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 Sangoma ne republie pas au Québec ; toute republication sera re-capturée telle quelle (filtre client opérationnel). 106 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +283 −309
    4. [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 · 3 files +270 −266
  7. 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 · 3 files +168 −168
    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 · 3 files +266 −292
  8. 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 · 3 files +385 −411
  9. 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 · 3 files +198 −224
    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 · 3 files +54 −54
    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 · 3 files +155 −181
    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 · 3 files +225 −251
  10. Fri, Sep 11, 2026 1

    1. [ka6] fix connecteur derumarketcatering: retrait définitif de la source (précédent projevia 7b871e8) — double condamnation confirmée en direct le 2026-09-11 : (1) le compte JazzHR du tenant est désactivé de façon permanente (page 200 « Inactive Career Page / this account is no longer active », détectée explicitement par jazzhr._fetch_list depuis la mission du 2026-09-04 → RuntimeError sans retry, 60 échecs consécutifs) ; (2) l'employeur était un faux positif de génération : Deru Market + Catering est un restaurant de Kirkland, État de WASHINGTON (derumarket.com, ZipRecruiter « Kirkland, WA »), pas Kirkland QC — sa seule offre jamais ingérée (FOH Staff, Kirkland WA) était américaine et est inactive en base depuis le fix is_quebec_location f4038e4. Deux missions ka6 (2026-08-26, 2026-09-04) avaient déjà conclu site_source_mort sans retirer la source : la supervision la resynchronisait donc en boucle (statut broken). Retrait complet selon le pattern maison : suppression de jobka/connectors/derumarketcatering.py (registre auto-découvrant → 1105 connecteurs), de l'entrée data/sources.json (1107 sources, employeurs_directs 1048→1047, page Sources vérifiée sans Deru) et de la fiche docs/connecteurs/derumarketcatering.md (INDEX/ats-jazzhr seront nettoyés à la prochaine régénération gen_connector_docs). Données en base conservées (offre déjà active=0, historique sync_log intact). Aucune modification de la plateforme jazzhr : non-régression tenant cliniqued found=1 ok. run.py sync derumarketcatering → « connecteur inconnu » (comportement attendu). 101 tests pytest verts. pm2 restart job-ka-sync OK, site 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 1 file −109
  11. Tue, Aug 25, 2026 2

    1. 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 · 1,133 files +11,818 −4,745
    2. 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 · 1,070 files +23,143 −9,328
  12. Sun, Aug 23, 2026 1

    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 · 995 files +67,733 −2,403
  13. Sat, Aug 22, 2026 1

    1. 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 · 376 files +15,066 −2,867
  14. Wed, Aug 19, 2026 2

    1. Simon-Pierre Boucher · 239 files +2,823 −2,146
  15. Tue, Aug 18, 2026 2

    1. docs/connecteurs : snapshot post-cycle complet (220 sources, 42 min)
      …
      Régénération des fiches sur l état stable après le premier cycle horaire
      complet à 220 sources (12:46-13:28) : 8 862 offres actives.
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 239 files +1,542 −1,537
    2. Documentation connecteurs (standard Groupe-KA) + registre de conformité
      …
      - scripts/gen_connector_docs.py : générateur rejouable (ast + sources.json +
        BD live en lecture seule + sync_log + git) -> docs/connecteurs/ :
        INDEX.md + 17 fiches plateformes ATS (mécanique, endpoints, budgets,
        tableau des tenants) + 217 fiches employeurs + 3 fiches portails +
        fiche dépôt direct (239 fichiers, sections fixes standardisées)
      - docs/CONFORMITE.md : registre de conformité par famille (base d accès,
        attribution/lien candidature vérifié -> offre originale, zéro donnée
        personnelle de candidat, Québec Emploi écarté clicSÉQUR, vérifié 2026-08-18)
      - README : section Connecteurs (17 ATS, 217 employeurs directs, 3 portails,
        badge Offre directe, dépôt direct), structure/env/API à jour
      - data/sources.json : _meta enrichi (compteurs, liste ATS, pointeurs docs)
      
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 239 files +25,435
Menu

Theme