SPB Git

spb/job-ka

Public
page 1
  1. 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 · 4 files +87 −96
    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 · 5 files +409 −422
    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 · 6 files +355 −318
  2. 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 · 5 files +97 −76
  3. 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 · 5 files +117 −102
    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 · 5 files +85 −78
    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 · 5 files +95 −92
    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 · 4 files +72 −67
    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 · 5 files +129 −124
    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 · 4 files +93 −46
    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 · 4 files +90 −76
    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 · 4 files +75 −67
    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 · 4 files +408 −400
  4. 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 · 5 files +128 −149
    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 · 6 files +434 −400
    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 · 7 files +748 −443
    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 · 4 files +158 −147
  5. 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 · 5 files +81 −103
    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 · 5 files +214 −236
    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 · 5 files +287 −312
    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 · 5 files +279 −271
  6. 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 · 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 · 5 files +277 −298
  7. 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 · 5 files +392 −414
  8. 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 · 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 · 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 · 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 · 5 files +256 −256
  9. 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 · 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 · 2 files +6 −3
  10. 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 · 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 · 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 · 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 · 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 · 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 · 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 · 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 · 2 files +9 −7
  11. Thu, Sep 17, 2026 1

    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 · 2 files +9 −5
Menu

Theme