SPB Git

spb/job-ka

Public
History of docs/connecteurs Clear filter
page 1
  1. Wed, Oct 14, 2026 7

    1. [ka6] connecteur ajholdingsltd: rien à réparer — namespace supplémentaire de la panne partielle de shard Dayforce du 2026-10-14, DÉJÀ RÉSOLUE côté Dayforce à l'intervention (syncs verts found=3 jusqu'à 17:54 — ce tenant a tenu ~4 h de plus que les autres namespaces tombés ~13:30 —, 500 isolé à 17:25 puis 503 soutenu sur /api/geo/ajholdingsltd/jobposting/search de 18:08 à 21:59, échec franc ok=0 jamais de faux 0, 3 offres QC actives préservées; à 22h le même appel répond 200 JSON et run.py sync retourne found=3 = médiane, updated=3). Pas de migration: astenjohnson.com/careers (200) liste toujours des offres du même tenant/board dayforcehcm.com/en-US/ajholdingsltd/CANDIDATEPORTAL. Partition de culture vérifiée: fr-CA voit 7 offres dont les 3 QC (Salaberry-de-Valleyfield), en-CA 37 offres 0 QC (US/BE/CN/SG) — fr-CA est la bonne culture, pas d'angle mort. DOUBLE artefact vague C corrigé (classe gevgroupltd 8ff81d0): EMPLOYER/name = namespace brut « Ajholdingsltd » → AstenJohnson (AJ Holdings Ltd = AstenJohnson Holdings, fabricant mondial de toiles pour machines à papier, usine Baie Saint-François à Salaberry-de-Valleyfield; nom lu dans les descriptions d'offres; ajholdingsltd.py + sources.json), url vide → astenjohnson.com; propagation faite aux 3 lignes actives (sync vert updated=3 via content_hash). Docstring enrichie, fiches ajholdingsltd.md/ats-dayforce.md/INDEX.md régénérées. Non-régression dayforce via bleufeu found=1. 107 tests verts, pm2 restart OK, site local+public 200.
      …
      Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
      Simon-Pierre Boucher · 3 files +32 −32
    2. [ka6] connecteur vestis: rien à réparer — namespace supplémentaire de la panne partielle de shard Dayforce du 2026-10-14 (500 à 16:13 puis 503 HTML soutenu sur /api/geo/vestis/jobposting/search, toutes combinaisons board × culture QL/CL/CANDIDATEPORTAL × fr-CA/en-CA/en-US; tenant frère benmor 200 JSON même session = frontal vivant; même 503 via proxy résidentiel CA = pas un blocage IP). Pas de migration: quebec-linge.com/about-us/careers (200, ⚠️ domaine à trait d'union — quebeclinge.com sans trait = domaine parqué /lander) pointe toujours dayforcehcm.com/CandidatePortal/.../vestis/Site/CLCANDIDATEPORTAL = même tenant. PISTE post-panne documentée: le lien officiel affiche le board frère CLCANDIDATEPORTAL (Canadian Linen) alors que le connecteur lit QLCANDIDATEPORTAL (vert found=17 à 13:31 le jour même) — si QL revient vide, sonder CL (pattern enercare). Syncs verts found=17 jusqu'à 13:31, échec franc ensuite (ok=0, jamais de faux 0), 17 offres QC actives préservées (Montréal, Québec, Saguenay, Sherbrooke). DOUBLE artefact vague C corrigé au passage (classe gevgroupltd 8ff81d0): EMPLOYER/name = titre d'offre « Journalier(ère) de production » → Quebec Linge (Quebec Linge & Uniform Service Co., groupe Vestis ex-Aramark Uniform Services; vestis.py + sources.json), url vide → quebec-linge.com; propagation aux 17 lignes au prochain sync vert via content_hash. Docstring enrichie, fiches vestis.md/ats-dayforce.md/INDEX.md régénérées. Non-régression dayforce via bleufeu found=1. 107 tests verts, pm2 restart OK, site local+public 200.
      Simon-Pierre Boucher · 3 files +39 −38
    3. Simon-Pierre Boucher · 1,134 files +8,811 −8,604
    4. Simon-Pierre Boucher · 2 files +32 −28
    5. [ka6] connecteur peaktech: rien à réparer côté source — instabilité GÉNÉRALE du frontal Dayforce le 2026-10-14 (14h59-17h36+ EDT), garde-fou _search_page durci. L'unique sync rouge de peaktech (500 à 15:49) faisait partie d'une rafale systémique jobs.dayforcehcm.com: 500 Internal Server Error ET read timeouts (30 s) intermittents sur ~21 tenants Dayforce de l'app en 2 cycles consécutifs (deltastar, flowcontrol, harrisrebar, imperialdade, jam, kdcone, mlp, ndtglobal, peaktech, realterm, stateindustrial, storagemart, superiorplus, valnetinc, vestis, wafna, wikoff, puis ajholdingsltd, altg, bly, boralex), 52 syncs Dayforce verts dans la même fenêtre = blip intermittent côté Dayforce, pas un blocage de notre IP (curl isolés 200). Board peaktech re-vérifié live: fr-CA maxCount=0 (inchangé depuis la bascule bi-culture 6a2cebc), en-CA 46 offres TOUTES hors QC (US ×43, Toronto, GB ×2, BE) — found=0 légitime, médiane 0.0. Fix générique dayforce.py _search_page: 3 essais + backoff 5s/10s (pattern taleo._bootstrap / smartrecruiters._list_page 528cbb1c) et couverture des requests.Timeout/ConnectionError que l'ancien garde-fou (2 essais, HTTPError 5xx seulement) ne retentait JAMAIS — ~la moitié des échecs de la rafale étaient des read timeouts. Bénéficie aux 129 connecteurs Dayforce de l'app. Sync isolé peaktech rejoué ×3: ok=1 found=0 stable, 35-53 s (retries absorbés pendant l'instabilité encore en cours). Non-régression dayforce via lavieenrose found=143 en 6,6 s. 107 tests pytest verts. Docstring peaktech.py enrichie (chronologie 2e intervention). Fiches peaktech.md / ats-dayforce.md / INDEX.md régénérées (1131 autres fiches restaurées — hors périmètre). 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 +410 −406
  2. Tue, Oct 13, 2026 4

    1. [ka6] fix connecteur huaweicanada: location renommée EN-seulement par le tenant Recruitee — repli générique multi-lieux/traductions FR. Le 2026-10-13 vers 15h-16h EDT, la location « Montréal, 7101 Avenue du Parc » (labo Noah's Ark, id 99963) a été renommée côté EN en « Markham, 19 Allstate Parkway » (doublon du nom de la vraie location Markham id 99954), alors que la traduction FR du site carrières public, le JSON-LD des pages détail (addressLocality=Montréal) et les agrégateurs (LinkedIn, espresso-jobs, jobs.ca) affichent toujours Montréal. Les champs racine city/state_code de l'API /api/offers suivent l'EN → les 24 offres QC (toutes vivantes, détails 200 published, aucune dépubliée) sortaient d'un coup du filtre _keep : found 24→0 sur 2 syncs, retraits suspendus par le garde-fou dérive. Aucun signal de fermeture/déménagement du labo de Montréal. Fix générique recruitee.py : _qc_location() teste chaque entrée de locations[] (EN puis traduction FR) quand la racine n'est pas QC, et la ville/label/postal du lieu QC retenu font foi (postal partagé avec l'EN gardé seulement si G/H/J — évite un géocodage vers Markham L3R). Sync isolé rejoué ×3 : found=24 stable (médiane locale exacte), ville en base Montréal/Québec. Non-régression recruitee via framestore found=8 et amilia found=5. 107 tests pytest verts. sources.json : url vide → www.huawei.com/ca (artefact vague D). Fiches huaweicanada.md / ats-recruitee.md / INDEX.md régénérées (1131 autres fiches restaurées — hors périmètre). 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 +321 −312
    2. [ka6] fix connecteur fresha: MIGRATION ATS Lever→Teamtailor (2e migration du repo après ten_canada Breezy→Greenhouse, 1re vers Teamtailor) — le tenant Lever « fresha » a été SUPPRIMÉ entre le 12 et le 13 oct. (API v0 404 {"ok":false,"error":"Document not found"} + board jobs.lever.co/fresha 404 + page détail de l'unique offre QC 404), 2 syncs rouges consécutifs. careers.fresha.com est désormais un site Teamtailor (tenant EU 8Ws7JiPnoEo@eu) sur DOMAINE CUSTOM : fresha.teamtailor.com redirige vers lui, mais le sitemap n'y liste que des URLs careers.fresha.com, invisibles au motif *.teamtailor.com de la plateforme → ajout générique de l'attribut DOMAIN à TeamtailorConnector (sitemap + regex construits sur le domaine custom, pattern minimal façon EXTRA_SITES/CULTURES), FreshaConnector converti LeverConnector→TeamtailorConnector avec DOMAIN='careers.fresha.com'. Le board migré porte 125 offres (sitemap) toutes Europe/Asie/Océanie, AUCUNE QC : l'unique offre historique « Account Manager (Montreal) » (d72356fc, parue 2026-05-28) n'a pas survécu à la migration — retirée au garde-fou 2-miss (missed=1 puis removed=1), found=0 est l'état légitime. Syncs isolés ×3 : ok=1 stable, 100 s → 99 s → 8,2 s (découverte étalée par le budget MAX_DETAILS=60 : 125 détails en 2 cycles, puis cache). Non-régression teamtailor via nordastelo found=60. 107 tests pytest verts. sources.json : connector lever→teamtailor, careers_url → careers.fresha.com, url vide → www.fresha.com. Fiches fresha.md / ats-teamtailor.md / ats-lever.md / INDEX.md régénérées (1130 autres fiches restaurées — hors périmètre). 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 +161 −173
  3. Mon, Oct 12, 2026 1

    1. [ka6] connecteur stateindustrial: rien à réparer — 59e cas du pattern « stale volume QC nul » (2e intervention), dépublication RÉELLE le matin même de l'unique offre QC 11972 « Représentant(e) des ventes externes (français/anglais) » (Québec, 45-65 k, parue 2026-10-05) : postingStatus 1→4 et lastModified 14:25 UTC le 2026-10-12, retirée au garde-fou 2-miss (sync found=0 ok, removed=1). 3e itération du cycle de republication mensuel à id neuf (11658/11661 août → 11795 5 sept → 11972 5 oct) : found oscille 0↔1 par design, récidive attendue. Board vivant : 26 offres US/ON identiques en en-US ET en-CA (fr-CA toujours maxCount=0 — bascule d478a07 valide), aucune QC, pas de migration (stateindustrial.com/careers embarque toujours en-US/stateindustrial/CANDIDATEPORTAL). MARQUEUR DAYFORCE NEUF documenté : l'API détail d'une offre DÉPUBLIÉE peut rester 200 avec contenu complet (≠ gotcha 404 connu) — discriminant = champ postingStatus du détail (1=vivante, 4=dépubliée, calibré sur 3 offres vivantes du board) + absence du search, jamais le code HTTP. Changements : docstring stateindustrial.py enrichie (cycle + marqueur), careers_url sources.json fr-CA→en-US (culture vide depuis 2026-09-17, alignée sur le connecteur et le site officiel). Sync isolé rejoué ×2 : found=0 stable ok=1, ~2,4 s ; non-régression dayforce via lavieenrose found=137. 107 tests pytest verts. Fiches docs/connecteurs/ stateindustrial.md + ats-dayforce.md + INDEX.md régénérées (1131 autres fiches restaurées — hors périmètre). 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 +286 −312
  4. Sat, Oct 10, 2026 2

    1. [ka6] fix connecteur osgoode_properties: angle mort de culture ADP WFN comblé — le tenant ne publie qu'en en_CA, l'offre QC vivante était invisible en fr_CA. Stale « volume QC nul » (58e cas du pattern, 2e intervention) à double cause : (1) l'unique offre vue via fr_CA (9201778625489_1 « Site Administrator », Gatineau) a été DÉPUBLIÉE par l'employeur entre 08:31 et 10:45 le 2026-09-21 (missed=1 ×2 puis removed via garde-fou 2-miss), sync_log VERT en continu depuis (313 ok / 314, found=0 = correct) — le seul échec récent est un 404 transitoire isolé de la liste à 02:02 le 2026-10-10, revenue 200 <30 min après ; (2) MAIS le centre de carrières est PARTITIONNÉ par culture et ne publie plus qu'en en_CA : liste 200+[] en fr_CA ET en_US (le fallback générique de adp.py s'arrête à en_US → aveugle), alors que en_CA expose 2 offres vivantes dont 1 QC jamais vue par job-ka : 9201780233629_1 « Concierge - Gatineau » (Gatineau QC J8Y 4B1, 36-42 k$/an, parue 2026-08-07). Marqueur détail ADP documenté : offre vivante interrogée dans la MAUVAISE culture = 200 + squelette JSON sans requisitionTitle, IDENTIQUE à une offre dépubliée (vérifié sur Site Administrator) — seul le 404 est un retrait certain. Correctif : OsgoodePropertiesConnector itère CULTURES=(fr_CA, en_CA), fusion par itemID priorité fr_CA — variante ADP WFN du pattern bi-culture Dayforce (peaktech/challenger) et EXTRA_SITES Workday (pwc/enercare) ; le repli de revalidation essaie lui aussi chaque culture avant de conclure (squelette sans titre partout = indéterminé, pas un retrait) ; RuntimeError (non-JSON après 3 essais de _get_json) ajouté aux déclencheurs du repli. Sync isolé rejoué ×2 : found=1 stable, added=1 (offre 9201780233629_1 en base, active=1, salaire 36000-42000/an, URL lang=en_CA), ~3-4 s ; non-régression plateforme adp sur tenant vivant bento_sushi : found=10, ok. 107 tests pytest verts. Fiches docs/connecteurs/ osgoode_properties.md + ats-adp.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 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 +103 −76
    2. [ka6] fix connecteur enercare: restauration du fix bi-board 242e8efa annulé par le rollback automatique de supervision (revert 463ae35b) — 2e cas de la classe « rollback collatéral » (dentons c2276fc). Le stale du 2026-10-10 n'est PAS une panne de la source : le fix bi-board légitime du 2026-10-09 (BOARDS hydrosolution+CANDIDATEPORTAL × CULTURES fr-CA+en-CA, found=1 testé ×2) a été reverté automatiquement à 18:38 le soir même (verdict de mission tronqué « inconnu » dans le journal de supervision → jugé faux repare), ramenant le connecteur au mono-board hydrosolution ENTIÈREMENT VIDE → found=0, puis retrait de l'offre 19659 par le garde-fou 2-miss (sync_log : missed=1 ×2 puis removed=1). Re-vérification live AVANT restauration : l'offre 19659 « Conseiller(ère) aux ventes » (Anjou, 7100 rue Jean-Talon E) est toujours publiée sur CANDIDATEPORTAL fr-CA (maxCount=1) et en-CA en voit 102 — l'angle mort comblé par 242e8efa est toujours réel. Restauration chirurgicale (PAS un git revert global : INDEX.md/ats-dayforce.md régénérés depuis par les missions acuity_insights/ponsera) : enercare.py repris de 242e8efa + note d'épisode rollback en docstring, url employeur recomblée dans sources.json (https://www.hydrosolution.com, édition 1 ligne, JSON validé). Sync isolé rejoué ×2 : found=1 stable (médiane 1.0), ok=1, ~13 s, offre 19659 réactivée en base (active=1, miss_count=0, titre fr). 107 tests pytest verts. Fiches docs/connecteurs/ enercare.md + ats-dayforce.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 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 +190 −188
  5. Fri, Oct 9, 2026 5

    1. [ka6] fix connecteur ponsera: faux positif supervision « volume QC nul » (57e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. Ponsera (ponsera.com, deep-tech montréalaise de désinfection au plasma froid atmosphérique, spin-off de l'incubateur TandemLaunch) a une présence QC intermittente (médiane 0.5) : son unique offre QC restante (8291085002 « Directeur général (PDG) | Chief Executive Officer (CEO) », Montréal, parue 2025-11-13) a été DÉPUBLIÉE par l'employeur entre 14:45 et 17:24 EDT le 2026-10-09 (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss à 19:42), sync_log VERT en continu (ok=1). Marqueur Greenhouse confirmé live sur les 2 offres historiques : détail 302 → /ponsera?error=true + API détail 404 (même marqueur que gearboxquebec/studiokraftonboard/national). TOPOLOGIE DE TENANT DOCUMENTÉE (neuve pour le repo) : le board « ponsera » est une VUE filtrée du tenant Greenhouse de TandemLaunch — /v1/boards/ponsera/departments expose les 32 départements du portefeuille (AAVAA, AIRY3D, Amphimo, Ponsera, …), tous jobs:[] quand la spin-off ne recrute pas ; le board parent « tandemlaunch » est déjà couvert par le connecteur frère (5 offres QC vivantes vérifiées, found=5, AUCUNE au département Ponsera) — pas d'angle mort inter-board, contrairement au cas enercare/CANDIDATEPORTAL. Board ponsera re-vérifié vivant : 200, total=0 toutes régions = creux d'embauche classe ghgsat/studiokraftonboard, PAS une migration d'ATS : ponsera.com (site vitrine Durable.co, route Next.js catch-all → soft-200 sur TOUT chemin, gotcha : /careers répond 200 sans page carrières réelle) n'embarque aucun ATS, le board Greenhouse reste l'unique canal d'embauche. Artefact vague C comblé dans sources.json : url employeur vide → https://ponsera.com (vérifié 200 ; édition chirurgicale 1 ligne, JSON valide). Tant que Ponsera ne republie pas de poste (TandemLaunch a vraisemblablement pourvu le poste de PDG après 11 mois d'affichage), ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe qu'acuity_insights 9caadce / alliedreit 5789d459). Docstring ponsera.py enrichie (chronologie + topologie du tenant partagé + gotcha soft-200). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1 s ; non-régression plateforme greenhouse sur le tenant frère vivant tandemlaunch : found=5, ok. 107 tests pytest verts. Fiches docs/connecteurs/ ponsera.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 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 +164 −190
    2. [ka6] fix connecteur acuity_insights: faux positif supervision « volume QC nul » (56e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. Acuity Insights (acuityinsights.com, edtech torontoise du test d'admission Casper, ex-Altus Assessments) a une présence québécoise intermittente (médiane 0.5) : son unique offre QC restante (B4A73CA886 « Bilingual Casper Test Support Agent (On-Demand Contract Work Remote in Canada) », Montréal, parue 2026-09-22) a été DÉPUBLIÉE par l'employeur entre 16:06 et 18:36 EDT le 2026-10-09 (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss à 18:39), sync_log VERT en continu (ok=1). Marqueur Workable confirmé live : détail /j/B4A73CA886 dépublié = 301 → board + ?not_found=true (même marqueur que findevcanada 5b0ba42 / jove 8c2fc01). Board re-vérifié vivant : widget v1 200, 4 offres uniques (11 entrées — répétition par location, gotcha jove) NZ/AU/Vancouver/Calgary/Toronto/Halifax, 0 lieu QC. Pas de migration d'ATS : acuityinsights.com/about-us/careers/ (403 anti-bot au curl direct, sondé via Scrapfly asp) embarque toujours le widget Workable embed.js. Artefact vague C comblé dans sources.json : url employeur vide → https://acuityinsights.com (vérifié 200 via Scrapfly, www redirige vers l'apex ; édition chirurgicale 1 ligne, JSON valide). Tant qu'Acuity ne republie pas de poste au Québec (contrats Casper on-demand publiés au rythme des cycles d'admission), ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe qu'alliedreit 5789d459 / gevgroupltd 8ff81d0). Docstring acuity_insights.py enrichie (chronologie + nature du volume + marqueur). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1-0,2 s ; non-régression plateforme workable sur tenant vivant genetec_inc : found=103, ok. 107 tests pytest verts. Fiches docs/connecteurs/ acuity_insights.md + ats-workable.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +311 −337
    3. Revert "[ka6] fix connecteur enercare: angle mort bi-board Dayforce comblé — l'offre QC vivante était sur le board frère CANDIDATEPORTAL, jamais couvert. Stale « volume QC nul » (1re intervention, médiane 1.0) à double cause : (1) l'unique offre du board hydrosolution (20691 « Gestionnaire comptable et système financier », Montréal, parue 2026-08-25) a été DÉPUBLIÉE par l'employeur entre 14:14 et 16:29 EDT le 2026-10-09 (found 1 → 0, missed=1, sync_log vert ok=1 en continu), le board hydrosolution restant servi (200) mais ENTIÈREMENT VIDE (maxCount=0 dans les 3 cultures) ; (2) MAIS le tenant Dayforce enercare expose un 2e jobBoardCode CANDIDATEPORTAL (portail corporate Enercare, 102 offres en-CA : ON ×79, AB ×17, MB ×5) qui portait une offre QC VIVANTE jamais vue par job-ka : 19659 « Conseiller(ère) aux ventes »/« Inside Sales Advisor », Anjou 7100 rue Jean-Talon E (adresse HydroSolution, la filiale QC chauffe-eau/CVC d'Enercare), parue 2026-06-05, seule offre fr-CA du portail — angle mort PRÉEXISTANT depuis la création du connecteur (vague C, board hydrosolution seul). Correctif : EnercareConnector itère désormais sur BOARDS=(hydrosolution, CANDIDATEPORTAL) × CULTURES=(fr-CA, en-CA), fusion par jobPostingId avec priorité fr-CA et board filiale d'abord — variante Dayforce du pattern EXTRA_SITES Workday (cas pwc 8d150eb), composée avec le pattern bi-culture existant (peaktech/challenger/fnfmb) car en-CA voit 102 offres là où fr-CA n'en voit que 1. Pas de migration d'ATS : hydrosolution.com/carrieres/ (200) référence toujours le board hydrosolution (avec liens d'offres périmés — gotcha frontal Next.js Dayforce confirmé : page détail d'offre dépubliée = 200, trancher à l'API détail qui répond 404, même classe de purge différée qu'alliedreit/Lever 5789d459). Marqueur dépublication Dayforce vérifié : API détail 20691 = 404 sur boardId 1-5. Artefact vague C comblé dans sources.json : url employeur vide → https://www.hydrosolution.com (vérifié 200, édition chirurgicale 1 ligne, JSON valide). Docstring enercare.py récrite (topologie bi-board du tenant + chronologie + gotcha Next.js). Sync isolé rejoué ×2 : found=1 stable (médiane 1.0), added=1 (19659, titre fr en base), removed=1 (20691 via garde-fou 2-miss), ok=1, ~13 s ; non-régression plateforme dayforce bi-culture sur tenant vivant challenger : found=5, ok. 107 tests pytest verts. Fiches docs/connecteurs/ enercare.md + ats-dayforce.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200."
      …
      This reverts commit 242e8efa1280942d6aa3872dbac0821d05f1c197.
      Simon-Pierre Boucher · 3 files +346 −346
    4. [ka6] fix connecteur enercare: angle mort bi-board Dayforce comblé — l'offre QC vivante était sur le board frère CANDIDATEPORTAL, jamais couvert. Stale « volume QC nul » (1re intervention, médiane 1.0) à double cause : (1) l'unique offre du board hydrosolution (20691 « Gestionnaire comptable et système financier », Montréal, parue 2026-08-25) a été DÉPUBLIÉE par l'employeur entre 14:14 et 16:29 EDT le 2026-10-09 (found 1 → 0, missed=1, sync_log vert ok=1 en continu), le board hydrosolution restant servi (200) mais ENTIÈREMENT VIDE (maxCount=0 dans les 3 cultures) ; (2) MAIS le tenant Dayforce enercare expose un 2e jobBoardCode CANDIDATEPORTAL (portail corporate Enercare, 102 offres en-CA : ON ×79, AB ×17, MB ×5) qui portait une offre QC VIVANTE jamais vue par job-ka : 19659 « Conseiller(ère) aux ventes »/« Inside Sales Advisor », Anjou 7100 rue Jean-Talon E (adresse HydroSolution, la filiale QC chauffe-eau/CVC d'Enercare), parue 2026-06-05, seule offre fr-CA du portail — angle mort PRÉEXISTANT depuis la création du connecteur (vague C, board hydrosolution seul). Correctif : EnercareConnector itère désormais sur BOARDS=(hydrosolution, CANDIDATEPORTAL) × CULTURES=(fr-CA, en-CA), fusion par jobPostingId avec priorité fr-CA et board filiale d'abord — variante Dayforce du pattern EXTRA_SITES Workday (cas pwc 8d150eb), composée avec le pattern bi-culture existant (peaktech/challenger/fnfmb) car en-CA voit 102 offres là où fr-CA n'en voit que 1. Pas de migration d'ATS : hydrosolution.com/carrieres/ (200) référence toujours le board hydrosolution (avec liens d'offres périmés — gotcha frontal Next.js Dayforce confirmé : page détail d'offre dépubliée = 200, trancher à l'API détail qui répond 404, même classe de purge différée qu'alliedreit/Lever 5789d459). Marqueur dépublication Dayforce vérifié : API détail 20691 = 404 sur boardId 1-5. Artefact vague C comblé dans sources.json : url employeur vide → https://www.hydrosolution.com (vérifié 200, édition chirurgicale 1 ligne, JSON valide). Docstring enercare.py récrite (topologie bi-board du tenant + chronologie + gotcha Next.js). Sync isolé rejoué ×2 : found=1 stable (médiane 1.0), added=1 (19659, titre fr en base), removed=1 (20691 via garde-fou 2-miss), ok=1, ~13 s ; non-régression plateforme dayforce bi-culture sur tenant vivant challenger : found=5, ok. 107 tests pytest verts. Fiches docs/connecteurs/ enercare.md + ats-dayforce.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 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 +346 −346
    5. [ka6] fix connecteur atlas_workland: timeout 30 s trop court pour l'API réseau Workland (~55 Mo) — read timeout ponctuel ×3 relances = faux « volume 0 » transitoire, timeout porté à 90 s sur la plateforme workland. Le connecteur réseau (médiane 1158, ~80 employeurs publics/parapublics QC) était déjà auto-rétabli à 13:01 EDT (found=1163) quand la mission a démarré : l'échec unique de 10:16 (ReadTimeout 30 s sur jobs-prod.workland.com/api/v1/job/published-external, 3 tentatives de _ka_resilient_post expirées) + le trou de cadence du cycle complet des 1100+ sources ont suffi à franchir le seuil stale de 4 h. Cause racine durable : published-external renvoie TOUT le réseau en UNE réponse de ~55 Mo qui prend déjà 16 s quand le serveur va bien — à 30 s de read timeout, toute lenteur serveur fait échouer les 3 relances (3e occurrence du même timeout : 2026-08-22, 2026-09-18, 2026-10-09, ~1 toutes les 2-3 semaines). Correctif minimal : timeout = 90 sur WorklandConnector (workland.py), précédent exact dans le repo = ia_groupe.py (CXS lent, timeouts observés à 30 s). Docstrings workland.py + atlas_workland.py enrichies (chronologie + volumétrie de la réponse). Sync isolé rejoué ×2 : found=1166 stable (médiane 1158), ok=1, ~19 s. 107 tests pytest verts. Fiches docs/connecteurs/ atlas_workland.md + ats-workland.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +219 −219
  6. Thu, Oct 8, 2026 6

    1. [ka6] fix connecteur alliedreit: faux positif supervision « volume QC nul » (55e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. Allied Properties REIT (alliedreit.com, FPI de bureaux urbains basée à Toronto, portefeuille montréalais réel d'où une présence QC récurrente mais modeste, médiane historique 4.0 = 2 paires FR/EN) : ses 4 offres QC (paires FR/EN « Gestionnaire, Services Techniques » 43e09e30/082fca35 et « Superviseur, Services Techniques » 9541f0be/3137968d, Montréal, parues 2026-09-09 et 2026-09-17) ont été DÉPUBLIÉES par l'employeur entre 17:35 et 19:41 EDT le 2026-10-08 (found 4 → 0, missed=4, puis removed=4 via le garde-fou 2-miss à 22:12), sync_log VERT en continu (ok=1). VARIANTE NEUVE du marqueur Lever documentée (≠ quenchwater f1b4e0a où page ET API v0 étaient 404) : le détail dépublié reste servi en 200 avec contenu complet et bouton Apply sur jobs.lever.co/alliedreit/<id>, alors que l'API v0 /postings/<org>/<id> répond 404 et que l'offre est absente du board — purge de page différée ou offre « unlisted » ; trancher à l'API v0 + présence au board, jamais au code HTTP de la page détail. Board re-vérifié vivant : API v0 200, 8 offres toutes Toronto (Building Operator, comptables CPA, Manager Portfolio Operations…), 0 lieu QC. Pas de migration d'ATS : alliedreit.com/company/careers/ (403 anti-bot au curl direct, sondé via Scrapfly asp+render_js) embarque toujours jobs.lever.co/alliedreit. Artefact vague C comblé dans sources.json : url employeur vide → https://www.alliedreit.com (vérifié 200 via Scrapfly, redirige vers l'apex alliedreit.com ; édition chirurgicale 1 ligne, JSON valide). Tant qu'Allied ne republie pas de poste au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que gevgroupltd 8ff81d0 / studiokraftonboard 164d701 / national 7dca64d / arago f697ca8). Docstring alliedreit.py enrichie (chronologie + nature du volume + variante du marqueur Lever). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,6-0,7 s ; non-régression plateforme lever sur tenant vivant bhvr : found=26, ok. Fiches docs/connecteurs/ alliedreit.md + ats-lever.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 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 +121 −147
    2. [ka6] fix connecteur gevgroupltd: faux positif supervision « volume QC nul » (54e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. GEV Wind Power (gevwindpower.com, maintenance/réparation de turbines éoliennes, HQ Hessle R.-U. + Fort Worth Texas) est un employeur international à présence québécoise occasionnelle (médiane historique 0.5) ; son unique offre QC jamais vue (2661606 « Superviseur de construction de parc éolien (titulaire d'une licence RBQ) », Québec, parue 2026-06-30, ~3 mois d'affichage) a été DÉPUBLIÉE par l'employeur entre 14:13 et 16:36 EDT le 2026-10-08 (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss à 17:57), sync_log VERT en continu (ok=1). Marqueur Recruitee confirmé live : détail dépublié = 404 sur la page /o/<slug> ET sur l'API /api/offers/<id>. Board re-vérifié vivant : API 200, 10 offres (Fort Worth/Dallas/Abilene US, Hull/Hessle UK, Taichung TW, Calgary AB), is_quebec_location False sur tous les libellés, AUCUN lieu QC. Pas de migration d'ATS : gevwindpower.com/careers/ (200) embarque toujours gevgroupltd.recruitee.com. DOUBLE artefact vague C corrigé : EMPLOYER/name « Siemens Gamesa Certified Wind Turbine Troubleshooters » était le TITRE de l'offre 2740886 (Calgary) pris pour un nom d'entreprise (gotcha Recruitee vague C documenté) → GEV Wind Power (gevgroupltd.py + sources.json) ; url employeur vide → https://www.gevwindpower.com (vérifié 200, JSON valide). Tant que GEV ne republie pas de poste au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que studiokraftonboard 164d701 / national 7dca64d / arago f697ca8). Docstring gevgroupltd.py enrichie (chronologie + nature du volume + artefacts). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,2-0,3 s ; non-régression plateforme recruitee sur tenant vivant anciapersonnelinc : found=57, ok. Fiches docs/connecteurs/ gevgroupltd.md + ats-recruitee.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 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 +176 −202
    3. [ka6] fix connecteur studiokraftonboard: faux positif supervision « volume QC nul » (53e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. KRAFTON Montréal Studio (kraftonmontreal.com, studio AAA de KRAFTON Inc./PUBG ouvert en 2023, développe « Project Windless » annoncé au State of Play de février 2026) publie peu (médiane 1.0, 4 offres distinctes vues depuis la création du connecteur). Son unique offre QC restante « Writer - Scenariste Senior » (8773420002, Montréal, parue 2026-09-03) a été DÉPUBLIÉE par l'employeur entre 12:36 et 14:59 EDT le 2026-10-08 (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss au re-test), sync_log VERT en continu (ok=1) ; le statut stale vient du trou de cadence du cycle complet des 1100+ sources + restart pm2 de 17:08 (mission national), pas d'une panne. Marqueurs Greenhouse confirmés live (4e confirmation, après gearboxquebec/reallygreatreading/national) : détail dépublié = 302 → /studiokraftonboard?error=true + API détail 404. Particularité : board re-vérifié VIVANT (API 200) mais ENTIÈREMENT VIDE (0 offre toutes régions) — dépublication complète, PAS une migration d'ATS : kraftonmontreal.com (200) est un frontend WordPress maison dont la section carrières, rendue côté serveur depuis le MÊME tenant Greenhouse, est vide elle aussi ; le portail corporate krafton.com/en/careers/jobs/ (403 au curl direct, sondé via Scrapfly render_js) ne mentionne « Montréal » que comme option de filtre studio/bureau — aucune offre montréalaise orpheline. Studio bien vivant (LinkedIn « actively recruiting », jeu en développement) : creux d'embauche, même classe que ghgsat 5e2c122 (board vidé sans migration) / national 7dca64d / pokafr 035acb7. Artefact vague B comblé dans sources.json : url employeur vide → https://kraftonmontreal.com (vérifié 200, édition chirurgicale 1 ligne, JSON valide). Tant que le studio ne republie pas de poste, ce connecteur sera re-signalé périodiquement : structurel, pas une panne. Docstring studiokraftonboard.py enrichie (chronologie + nature du volume + topologie frontend WP→Greenhouse). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1 s ; non-régression plateforme greenhouse sur tenant vivant laportefr : found=61, ok. Fiches docs/connecteurs/ studiokraftonboard.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +108 −134
    4. [ka6] fix connecteur national: faux positif supervision « volume QC nul » (52e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. NATIONAL (national.ca, cabinet de relations publiques fondé à Montréal, bureaux pan-canadiens, groupe AVENIR GLOBAL) publie peu : volume historique = UNE offre QC (5151496007 « Conseiller(ère), Relations médias, positionnement corporatif et produits (Remplacement de congé de maternité) », Montréal, parue 2026-06-02, médiane 1.0), DÉPUBLIÉE par l'employeur entre 12:24 et 14:45 EDT le 2026-10-08 (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss au re-test), sync_log VERT en continu (ok=1). Marqueurs Greenhouse confirmés live : détail dépublié = 302 → /national?error=true (3e confirmation, après gearboxquebec et reallygreatreading) + API détail 404 "Job not found". Board re-vérifié vivant : API 200, 3 offres (Director Corporate Communications Toronto, Director Public Affairs T.-N.-L., Senior Consultant Public Affairs Toronto), is_quebec_location False sur tous les libellés, AUCUN lieu QC. Pas de migration d'ATS : www.national.ca/en/careers/ (200) est un frontend maison branché sur le MÊME tenant Greenhouse — les liens /en/careers/detail/<id>/ reprennent exactement les 3 ids du board, l'offre dépubliée en est absente aussi. Artefact vague C comblé dans sources.json : url employeur vide → https://www.national.ca (vérifié 200, édition chirurgicale 1 ligne, JSON valide). Tant que NATIONAL ne republie pas de poste au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que arago f697ca8 / trener_robotics 8d6ceb7 / pokafr 035acb7 / blockstream e270bec). Docstring national.py enrichie (chronologie + nature du volume + topologie frontend maison→Greenhouse). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1 s ; non-régression plateforme greenhouse sur tenant vivant laportefr : found=61, ok. Fiches docs/connecteurs/ national.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre ; gotcha restauration : hubinternational.md/msxinternational.md matchent le grep « national.md »). 107 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +370 −396
    5. [ka6] fix connecteur arago: faux positif supervision « volume QC nul » (51e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. Arago (aragoconsulting.com, intégrateur SAP SuccessFactors basé à Paris — bureaux Bordeaux, Genève, Porto — qui a absorbé l'équipe Rhaegal de rhaegal.com, d'où la redirection du portail public jobs.smartrecruiters.com/Arago vers rhaegal.com : URL custom du tenant, sans effet sur le connecteur qui lit l'API JSON) est un employeur européen à présence montréalaise occasionnelle ; sa paire FR/EN « Business Manager - Québec (Canada) » (744000139003289 / 744000139000904, Montréal, parue 2026-07-22, médiane historique 1.0) a été DÉPUBLIÉE par l'employeur entre 03:13 et 06:43 EDT le 2026-10-08 (found 2 → 0, missed=2, puis removed=2 via le garde-fou 2-miss à 08:07), sync_log VERT en continu (ok=1). Marqueur SmartRecruiters confirmé live (2e confirmation après oliverbonacini d461e83) : détail API dépublié = HTTP 200 + active:false — trancher sur active, jamais sur le code HTTP. Board re-vérifié vivant et activement utilisé : API 200, 7 offres (Paris ×4, Bordeaux, Genève, Porto), dernière publication 2026-10-06, is_quebec_location False sur tous les libellés, AUCUN lieu QC. Pas de migration d'ATS : le tenant publie encore activement sur SmartRecruiters (aucun autre ATS référencé par aragoconsulting.com/en/careers, page vitrine rendue via Scrapfly). Artefact vague C comblé dans sources.json : url employeur vide → https://www.aragoconsulting.com (vérifié 200, édition chirurgicale 1 ligne, JSON valide). Tant qu'Arago ne republie pas de poste au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que trener_robotics 8d6ceb7 / pokafr 035acb7 / blockstream e270bec / reallygreatreading 8d4d3df). Docstring arago.py enrichie (chronologie + nature du volume + acquisition Rhaegal). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,5 s ; non-régression plateforme smartrecruiters sur tenant vivant cima2 : found=243, ok. Fiches docs/connecteurs/ arago.md + ats-smartrecruiters.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +214 −240
    6. [ka6] fix connecteur sepaq: faux « stale » après un sync found=0 isolé — le connecteur est SAIN, auto-rétabli avant intervention ; retry 3× ajouté sur le flux RSS TBE vide (durcissement plateforme). Chronologie : dernier succès vu par la supervision 2026-10-08 01:51 (found=95), sync de 05:05 found=0 ok=1 (flux RSS 200 SANS <item>, transitoire du servlet Rss propre au tenant SEPAQ — les frères TBE kruger found=56 et exo found=33 étaient sains aux mêmes heures ; le garde-fou dérive a suspendu les retraits, 0 offre perdue, les 95 offres restées actives), puis trou de cadence de ~2,7 h (cycle complet des 1100+ sources) → seuil stale 4 h franchi au scan de ~07:05 ; AUTO-RÉTABLI au sync de 07:49 avec found=95 pile la médiane. Durcissement minimal selon le pattern maison (taleo.py _bootstrap/_search_page, interstitiels 200 de Taleo Enterprise) : nouvelle méthode TaleoTBEConnector._rss_items — si le flux RSS revient sans <item> (statut 200), retenter jusqu'à 3× avec backoff 10/20 s avant d'accepter un vrai zéro ; sans coût en régime normal, tous les tenants TBE du repo exposant ≥ 8 items live (sepaq 95, graymont 73, kruger 56, exo 33, produits_kruger items présents mais filtrés QC, hec 8/9). Docstring sepaq.py enrichie (chronologie). Sync isolé rejoué ×3 : found=95 stable, ok=1, 0,4-0,5 s ; non-régression plateforme TBE : kruger found=56, exo found=33. Fiches docs/connecteurs/ sepaq.md + ats-taleo_tbe.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 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 +194 −194
  7. Wed, Oct 7, 2026 3

    1. [ka6] fix connecteur trener_robotics: faux positif supervision « volume QC nul » (50e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. Trener Robotics (trener.ai, « physical AI » pour robots industriels, plateforme Acteris) est un employeur international (HQ San Jose CA, bureaux Trondheim Norvège et Barcelone) à présence montréalaise occasionnelle ; son unique offre QC jamais vue (c9446546 « Senior Software Engineer, Integration Suite », parue 2026-06-30, médiane historique 0.5) était MULTI-LIEUX « San Jose OR Montreal OR Trondheim » — c'est le lieu SECONDAIRE Montréal qui passait le filtre _keep (lieu principal donc location_label/city en base = « Trondheim, Norway », ce qui intriguait au premier regard : le filtre est sain, is_quebec_location re-testé False sur tous les libellés non-QC). Elle a été DÉPUBLIÉE par l'employeur entre 10:34 et 12:53 EDT le 2026-10-07 (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss à 15:08), sync_log VERT en continu (ok=1). Marqueur Ashby confirmé live (2e confirmation après blockstream e270bec) : détail dépublié = HTTP 200 (SPA) + window.__appData.posting = null. Board re-vérifié vivant : API 200, 4 offres (San Jose US-HQ ×3, Trondheim+Barcelone), is_quebec_location False sur tous les libellés, AUCUN lieu QC. Pas de migration d'ATS : trener.ai/company#careers (200) embarque toujours jobs.ashbyhq.com/Trener-Robotics (slug insensible à la casse, mêmes ids d'offres que l'API). Artefact vague C comblé dans sources.json : url employeur vide → https://trener.ai (vérifié 200, édition chirurgicale 1 ligne, JSON valide). Tant que Trener ne republie pas d'offre avec un lieu québécois, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que blockstream e270bec / pokafr 035acb7 / reallygreatreading 8d4d3df / jove 8c2fc01). Docstring trener_robotics.py enrichie (chronologie + nature du volume + mécanique multi-lieux). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1 s ; non-régression plateforme ashby sur tenant vivant lightspeedhq : found=62, ok=1, 0,4 s. Fiches docs/connecteurs/ trener_robotics.md + ats-ashby.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +47 −73
    2. [ka6] fix connecteur pokafr: faux positif supervision « volume QC nul » (49e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. Poka FR est le board Greenhouse MIROIR FRANÇAIS de Poka (poka.io, SaaS manufacturier de Québec ; frère EN = connecteur poka, 3e board pokaeu Europe non couvert) ; l'employeur publie peu et par paires FR/EN appariées. Sa dernière offre QC (6204969004 « Stratège de contenu et communications », parue 2026-09-28, médiane historique 0.5) a été DÉPUBLIÉE par l'employeur entre 10:20 et 12:40 EDT le 2026-10-07 (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss à 14:54), et sa JUMELLE EN 6204970004 « Content and Communications Strategist » a disparu du board frère poka au même sync (found 2 → 1) — dépublication de paire synchronisée, sync_log VERT en continu (ok=1). Marqueur Greenhouse confirmé live : détail dépublié = 302 → /pokafr?error=true. Board re-vérifié vivant et activement utilisé : API 200, 1 offre « Stratège Web SEO et AEO » (6210186004, jumelle FR de 6210184004 côté poka) localisée « Canada - Remote » SANS province → exclue par design (is_quebec_location testé : False — même règle que reallygreatreading 8d4d3df), AUCUN lieu QC. Le frère poka (sain, found=1) couvre l'offre « Sales Development Representative | Montreal/Toronto » : aucune offre montréalaise orpheline. Pas de migration d'ATS : poka.io/en/careers (200) référence toujours Greenhouse (boards poka + pokaeu). Artefact vague C comblé dans sources.json : url employeur vide → https://www.poka.io (vérifié 200, édition chirurgicale 1 ligne, JSON valide). Tant que Poka ne republie pas d'offre localisée au Québec sur son board FR, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que blockstream e270bec / reallygreatreading 8d4d3df / strongtie a295929 / jove 8c2fc01). Docstring pokafr.py enrichie (chronologie + nature du volume + topologie des 3 boards). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1 s ; non-régression plateforme greenhouse sur tenant vivant laportefr : found=61, ok=1, 0,2 s. Fiches docs/connecteurs/ pokafr.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +188 −214
    3. [ka6] fix connecteur blockstream: faux positif supervision « volume QC nul » (48e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. Blockstream (blockstream.com, infrastructure Bitcoin) est un employeur international (Menlo Park, Zurich/Genève/Lugano, New York, remote) ; son unique offre QC (a25901c4 « Staff Accountant & Accounts Payable », Montréal, parue 2026-06-18, médiane historique 1.0) a été DÉPUBLIÉE par l'employeur entre 09:26 et 11:51 EDT le 2026-10-07 (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss), sync_log VERT en continu (ok=1). Marqueur Ashby confirmé live (1re confirmation de ce marqueur dans le repo) : détail dépublié = HTTP 200 (SPA) avec window.__appData.posting = null — trancher sur l'absence de l'offre dans le JSON posting-api, jamais sur le code HTTP (même classe de marqueur que Breezy). Board re-vérifié vivant : API 200, 46 offres, is_quebec_location négatif sur les 11 libellés de lieux distincts (APAC, Geneva, HQ, Lugano, Menlo Park, New York, Remote, Remote (GH), Switzerland, United States, Zurich), AUCUN lieu QC. Pas de migration d'ATS : blockstream.com/careers (200) embarque toujours jobs.ashbyhq.com (46 références). Artefact vague C comblé dans sources.json : url employeur vide → https://blockstream.com (vérifié 200, édition chirurgicale 1 ligne, JSON valide). Tant que Blockstream ne republie pas de poste au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que strongtie a295929 / reworld c59448d / jove 8c2fc01 / reallygreatreading 8d4d3df). Docstring blockstream.py enrichie (chronologie + nature du volume). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1-0,2 s ; non-régression plateforme ashby sur tenant vivant lightspeedhq : found=62, ok=1, 0,5 s. Fiches docs/connecteurs/ blockstream.md + ats-ashby.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +282 −308
  8. Tue, Oct 6, 2026 9

    1. [ka6] fix connecteur reallygreatreading: faux positif supervision « volume QC nul » (47e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. Really Great Reading (reallygreatreading.com, EdTech littératie basée aux É.-U., équipe majoritairement remote) avait publié à l'été 2026 une grappe de 4 postes TI « Quebec, Canada » (parus 2026-07-09 → 2026-07-28, dépubliés au fil d'août-septembre) ; la dernière survivante (4313417009 « Senior Software Developer », médiane historique 1.0) a été DÉPUBLIÉE par l'employeur entre 15:56 et 18:17 EDT le 2026-10-06 (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss), sync_log VERT en continu (ok=1). Marqueur Greenhouse confirmé live : détail = 302 → /reallygreatreading?error=true. Board re-vérifié vivant : API 200, 9 offres, toutes « Remote » US/régions US — les libellés « Remote US or Canada » sans province sont exclus par design (is_quebec_location testé : False), AUCUN lieu QC. Pas de migration d'ATS : reallygreatreading.com/careers (200) redirige directement vers ce même board Greenhouse. Artefact vague C comblé dans sources.json : url employeur vide → https://www.reallygreatreading.com (vérifié 200, édition chirurgicale 1 ligne, JSON valide). Tant que l'employeur ne republie pas de poste localisé au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que strongtie a295929 / reworld c59448d / jove 8c2fc01 / industrialelectricmanufacturing fa64460 / postmediadistributionsolutions 66e17c5). Docstring reallygreatreading.py enrichie (chronologie + nature du volume). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1 s ; non-régression plateforme greenhouse sur tenant vivant laportefr : found=61, ok=1, 0,2 s. Fiches docs/connecteurs/ reallygreatreading.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +200 −226
    2. [ka6] fix connecteur postmediadistributionsolutions: faux positif supervision « volume QC nul » (46e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. Postmedia Distribution Solutions (division logistique « source-to-shelf » de Postmedia lancée 2026-07, postmedia.com/postmedialogistics/) publie ses postes terrain ville par ville sur un board Breezy pan-canadien ; son unique offre QC (dbf5f01158a2 « Part-Time Merchandiser », Gatineau, 16,60 $/h) a été DÉPUBLIÉE par l'employeur entre 15:53 et 18:14 EDT le 2026-10-06 (found 1 → 0, miss_count=1, puis removed=1 via le garde-fou 2-miss au sync rejoué), sync_log VERT en continu (ok=1). Marqueur Breezy confirmé live (2e confirmation après telus_health 5134fa5) : détail = 200 + « Position Closed », offre absente du /json — trancher sur l'absence dans /json, pas sur le code HTTP. Board re-vérifié vivant et ACTIVEMENT utilisé : /json 200, 18 offres (publications 2026-09-29 et 2026-10-02), réparties AB/SK/BC/NB/ON/NS, multi-lieux inspectés (Fort Frances/Emo tous deux ON), AUCUN lieu QC — « Ottawa, ON » est côté ontarien, pas Gatineau. Pas de migration d'ATS : le Dayforce de postmedia.com/careers (can63/jobs.dayforcehcm.com ns postmedia, site PostmediaCareers) est le portail CORPORATE Postmedia Network, entité distincte — sondé via la mécanique DayforceConnector du repo : 25 offres en-CA, 0 QC (fr-CA aveugle maxCount=0, pattern partition-culture connu) → aucune récupération par portail frère possible (angle dentons/pwc vérifié négatif). Particularité du tenant : les Merchandiser sont republiés en CYCLE par ville avec un id Breezy neuf à chaque cycle (l'offre Gatineau avait déjà vu sa date_posted rafraîchie 2026-09-17 → 2026-10-02) — elle peut réapparaître sous un autre id ; tant que la division ne republie pas de poste au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que strongtie a295929 / reworld c59448d / jove 8c2fc01 / industrialelectricmanufacturing fa64460). Artefact vague C comblé dans sources.json : url employeur vide → https://www.postmedia.com/postmedialogistics/ (vérifié 200, édition chirurgicale 1 ligne, JSON valide). Docstring postmediadistributionsolutions.py enrichie (chronologie + nature du volume). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1 s, removed=1 au 1er replay (garde-fou 2-miss) ; non-régression plateforme breezy sur tenant vivant recruiting : found=86, ok=1, 0,4 s. Fiches docs/connecteurs/ postmediadistributionsolutions.md + ats-breezy.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +91 −117
    3. [ka6] fix connecteur industrialelectricmanufacturing: faux positif supervision « volume QC nul » (45e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. IEM (iemfg.com, fabricant d'équipement de distribution électrique) est basé aux É.-U. (Jacksonville FL, San Antonio TX…) avec une usine canadienne à Surrey (C.-B.) ; son unique offre QC (4031922009 « Field Service Technician - Montreal, CAN », parue 2025-09-29) a été DÉPUBLIÉE par l'employeur entre 15:37 et 17:59 EDT le 2026-10-06 (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss au sync rejoué), sync_log VERT en continu (ok=1). Marqueur Greenhouse confirmé live : détail = 302 → /industrialelectricmanufacturing?error=true. Board re-vérifié vivant : API 200, 133 offres (US + Surrey BC), remote « US - Remote » uniquement, multi-lieux inspectés, AUCUN lieu QC/Montréal. Pas de migration d'ATS : iemfg.com/careers/ (200) embarque toujours l'embed Greenhouse de ce même org (le portail JazzHR applytojob.com référencé par Google est un vestige). Artefact vague C comblé dans sources.json : url employeur vide → https://www.iemfg.com (vérifié 200, édition chirurgicale 1 ligne, JSON valide). Tant qu'IEM ne republie pas de poste au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que strongtie a295929 / reworld c59448d / ghgsat 5e2c122 / jove 8c2fc01). Docstring industrialelectricmanufacturing.py enrichie (chronologie + nature du volume). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,1-0,2 s ; non-régression plateforme greenhouse sur tenant vivant laportefr : found=61, ok=1, 0,2 s. Fiches docs/connecteurs/ industrialelectricmanufacturing.md + ats-greenhouse.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +150 −176
    4. [ka6] fix connecteur iamgold: fausse alerte « stale » — variante CYCLE INTERROMPU (3e cas de la variante, 1re intervention sur cette source), le connecteur est SAIN et n'a nécessité AUCUN changement de code. Chronologie : syncs verts found=3 en continu jusqu'à ~13:05 EDT le 2026-10-06, puis le sync de ~15:26 EDT a échoué sur un 500 serveur transitoire du frontal Taleo (endpoint REST searchjobs, persistant à travers les 3 retries/backoff existants de taleo.py — panne momentanée côté Oracle, la page d'amorce jobsearch.ftl répondait 200 pendant tout l'incident), et les restarts pm2 de job-ka-sync des missions dentons (c2276fc) et jove (8c2fc01) du même jour ont retardé le cycle horaire suivant → trou > 4 h sans sync réussi = seuil stale franchi. Aucun changement de tenant, de portail ou de section (iamgold.taleo.net, section ex, portal=101430233 inchangé) ; registre sources.json déjà complet (url + careers_url). Sync isolé rejoué ×2 : found=3 (= médiane historique 3.0), ok=1, 1,6 s, les 3 offres QC vivantes confirmées (Partenaire RH Opérations 12 mois, Géologue de projet senior, Technicienne carothèque Exploration — mine Westwood, Abitibi). Même classe que childrensplace 5ed90ff / churchdwight 43ac4f4. Docstring iamgold.py enrichie (chronologie + volume typique). Fiches docs/connecteurs/ iamgold.md + ats-taleo.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 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 +32 −27
    5. [ka6] fix connecteur jove: faux positif supervision « volume QC nul » (44e cas du pattern, 1re intervention) — le connecteur est SAIN, found=0 est le comportement CORRECT. JoVE (jove.com, EdTech/vidéos scientifiques) est un employeur 100 % remote international ; le widget Workable v1 répète le même shortcode par location, donc le found=3 historique = UNE seule vraie offre QC (E8F7F209B4 « Sales Account Executive, EdTech - Canada », 3 locations QC, parue 2026-06-27). Elle a été DÉPUBLIÉE par l'employeur entre 13:30 et 15:45 EDT le 2026-10-06 (found 3 → 0, missed=1, puis removed=1 via le garde-fou 2-miss), sync_log VERT en continu (ok=1). Marqueur Workable confirmé live : détail = 301 → /jove/j/… → 302 → /jove/?not_found=true, API v2 = 404. Board re-vérifié vivant : 200, 108 lignes job×location (~28 postes mondiaux US/Inde/LATAM/Europe/Asie, tous remote), AUCUNE entrée CA/QC ; recherche v3 Canada/Quebec/Montreal = 0 partout. Pas de migration d'ATS : Google référence toujours apply.workable.com/jove comme portail officiel (jove.com/careers = 404, homepage 200 via Scrapfly « Peer Reviewed Video Platform… | JoVE », curl direct = 202 anti-bot). Artefact vague C comblé dans sources.json : url employeur vide → https://www.jove.com (édition chirurgicale 1 ligne, JSON valide). Tant que JoVE ne republie pas de rôle Canada, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que strongtie a295929 / reworld c59448d / ghgsat 5e2c122). Docstring jove.py enrichie (chronologie + nature du volume). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,2 s ; non-régression plateforme workable sur tenant vivant genetec_inc : found=103, ok=1, 0,6 s. Fiches docs/connecteurs/ jove.md + ats-workable.md + INDEX.md régénérées via scripts/gen_connector_docs.py (les 1131 autres fiches, dont seuls les instantanés horodatés changeaient, restaurées — hors périmètre). 107 tests pytest verts. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
      Simon-Pierre Boucher · 3 files +345 −371
    6. [ka6] fix connecteur dentons: stale causé par un ROLLBACK AUTOMATIQUE COLLATÉRAL — réapplication du commit 89aedd9 (revert du revert c52c1eb). Le connecteur dentons (SuccessFactors careers.dentons.com, créé le 2026-10-06 matin par la mission dentons_europe) était SAIN et VERT (syncs found=2 à 10:10 et 10:14), mais le commit entier 89aedd9 a été reverté à 10:20 par le rollback automatique de la supervision (vraisemblablement déclenché par le volet dentons_europe found=0 du même commit — un found=0 pourtant structurel et documenté). Le revert a supprimé jobka/connectors/dentons.py et son entrée sources.json → plus aucun sync depuis 10:14 → stale 7.7 h. La source est re-vérifiée VIVANTE : sitemap 200, ~140 offres, les 2 offres QC toujours présentes (1362877757 « Accounts Payable Lead » + 1362980357 « Responsable, Comptes fournisseurs », paire FR/EN, Montréal). Réparation minimale : git revert --no-commit c52c1eb — restaure le connecteur dentons, l'entrée registre, les 3 fixes génériques successfactors.py (_balanced_itemprop, titre via itemprop=title, garde QC sur addressLocality multi-villes), parse_date java.util.Date dans normalize.py + son test, et les fiches docs/connecteurs/. Tests réels : sync dentons ×2 → found=2 (= médiane 2.0), ok=1, 0,4 s, les 2 offres réactivées ; non-régression plateforme SF sur alstom → found=247 (médiane ~224), ok=1, 8,6 s ; 107 tests pytest verts. Leçon pour la supervision : un rollback de commit multi-volets peut tuer un connecteur frère sain — si dentons_europe est re-signalé avec found=0, c'est STRUCTUREL (board Europe sans offre QC), ne pas re-reverter ce commit.
      Simon-Pierre Boucher · 5 files +288 −203
    7. Revert "[ka6] fix connecteur dentons_europe: faux positif « volume QC nul » (43e cas du pattern, 1re intervention) + RÉCUPÉRATION RÉELLE par portail frère inter-ATS — variante pwc 8d150eb sur un AUTRE ATS. Le connecteur dentons_europe (Workable, org dentons-europe) est SAIN : son unique offre QC (1454A1A702 « Global Value Pricing and Project Manager », Montréal, parue 2026-05-06) a été DÉPUBLIÉE entre 05:09 et 08:08 EDT (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss au sync rejoué), sync_log VERT en continu (ok=1). Marqueur Workable confirmé live : détail = 302 → /oops. Board re-vérifié : 200, 64 offres mondiales (Pologne/Italie/Tchéquie/Afrique), 0 lieu CA/QC (multi-lieux et 23 remote inspectés), recherche v3 Montreal/Quebec/Canada = 0 ; orgs frères Workable « dentons » et « dentons-global » = 200 mais 0 offre ; pas de migration (board vivant, c'est le portail EUROPE du cabinet). MAIS le vrai board des postes du bureau de Montréal est ailleurs : careers.dentons.com = SuccessFactors CSB (141 offres mondiales, sitemap urlset), 2 offres QC VIVANTES (paire FR/EN « Responsable, Comptes fournisseurs / Accounts Payable Lead », Montréal, multi-villes Ottawa/Toronto/Montréal) non couvertes par job-ka → NOUVEAU connecteur frère dentons (SuccessFactorsConnector, 4 lignes), volume employeur 0 → 2 (médiane historique 1.0). Ce tenant SF a exposé 3 angles morts GÉNÉRIQUES de la plateforme, corrigés dans successfactors.py : (1) description vide — le span itemprop=description enveloppe des span/p imbriqués et la capture non gourmande _ITEMPROP_RE s'arrêtait au premier </p> → extraction ÉQUILIBRÉE _balanced_itemprop (compte d'imbrication du même tag, ancien regex en repli) → descriptions 10 937/8 141 car.; (2) titre tronqué — slug terminé par la province abrégée seule (« …-Payable-Lead-Queb/ », marqueur Kiewit) alors que l'heuristique [:-3] suppose une queue -Prov-CP1-CP2 → le titre de la page détail (itemprop=title) fait désormais autorité; (3) offre multi-villes — meta addressLocality répétée (Ottawa/Toronto/Montreal, dernière gagnante) pouvait écraser la ville QC du slug par une ville hors QC → garde-fou is_quebec_location sur l'override. Bonus normalize.py : parse_date apprend le format java.util.Date.toString() (« Sun Oct 04 02:00:00 UTC 2026 », émis par les meta datePosted des sites SF CSB) qui rendait date_posted NULL — + test test_date_java_tostring. Artefact vague C comblé dans sources.json : url employeur vide → https://www.dentons.com (vérifié 200 via Scrapfly, « Dentons - Home », curl direct = 403 anti-bot) + entrée registre du nouveau connecteur dentons. Docstrings dentons_europe.py (chronologie) et dentons.py (généalogie du portail) écrites. Tests réels : sync dentons ×2 → found=2, ok=1, 2,9-3,0 s, fiches complètes (titres entiers, dates 2026-10-04, fr/en, GPS-ready) ; sync dentons_europe rejoué → found=0 stable, ok=1, 0,3 s (structurel tant que le board Europe ne republie pas de rôle Global à Montréal — même classe que strongtie a295929 / reworld c59448d) ; non-régression plateforme SF sur tenant vivant alstom : found=245 (médiane ~224), ok=1, 8,6 s. Fiches docs/connecteurs/ dentons.md (nouvelle) + dentons_europe.md + ats-successfactors.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). 107 tests pytest verts (106 + 1 nouveau). pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200."
      …
      This reverts commit 89aedd99e79c43621f55e258f9e2cb5f055e347b.
      Simon-Pierre Boucher · 5 files +203 −288
    8. [ka6] fix connecteur dentons_europe: faux positif « volume QC nul » (43e cas du pattern, 1re intervention) + RÉCUPÉRATION RÉELLE par portail frère inter-ATS — variante pwc 8d150eb sur un AUTRE ATS. Le connecteur dentons_europe (Workable, org dentons-europe) est SAIN : son unique offre QC (1454A1A702 « Global Value Pricing and Project Manager », Montréal, parue 2026-05-06) a été DÉPUBLIÉE entre 05:09 et 08:08 EDT (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss au sync rejoué), sync_log VERT en continu (ok=1). Marqueur Workable confirmé live : détail = 302 → /oops. Board re-vérifié : 200, 64 offres mondiales (Pologne/Italie/Tchéquie/Afrique), 0 lieu CA/QC (multi-lieux et 23 remote inspectés), recherche v3 Montreal/Quebec/Canada = 0 ; orgs frères Workable « dentons » et « dentons-global » = 200 mais 0 offre ; pas de migration (board vivant, c'est le portail EUROPE du cabinet). MAIS le vrai board des postes du bureau de Montréal est ailleurs : careers.dentons.com = SuccessFactors CSB (141 offres mondiales, sitemap urlset), 2 offres QC VIVANTES (paire FR/EN « Responsable, Comptes fournisseurs / Accounts Payable Lead », Montréal, multi-villes Ottawa/Toronto/Montréal) non couvertes par job-ka → NOUVEAU connecteur frère dentons (SuccessFactorsConnector, 4 lignes), volume employeur 0 → 2 (médiane historique 1.0). Ce tenant SF a exposé 3 angles morts GÉNÉRIQUES de la plateforme, corrigés dans successfactors.py : (1) description vide — le span itemprop=description enveloppe des span/p imbriqués et la capture non gourmande _ITEMPROP_RE s'arrêtait au premier </p> → extraction ÉQUILIBRÉE _balanced_itemprop (compte d'imbrication du même tag, ancien regex en repli) → descriptions 10 937/8 141 car.; (2) titre tronqué — slug terminé par la province abrégée seule (« …-Payable-Lead-Queb/ », marqueur Kiewit) alors que l'heuristique [:-3] suppose une queue -Prov-CP1-CP2 → le titre de la page détail (itemprop=title) fait désormais autorité; (3) offre multi-villes — meta addressLocality répétée (Ottawa/Toronto/Montreal, dernière gagnante) pouvait écraser la ville QC du slug par une ville hors QC → garde-fou is_quebec_location sur l'override. Bonus normalize.py : parse_date apprend le format java.util.Date.toString() (« Sun Oct 04 02:00:00 UTC 2026 », émis par les meta datePosted des sites SF CSB) qui rendait date_posted NULL — + test test_date_java_tostring. Artefact vague C comblé dans sources.json : url employeur vide → https://www.dentons.com (vérifié 200 via Scrapfly, « Dentons - Home », curl direct = 403 anti-bot) + entrée registre du nouveau connecteur dentons. Docstrings dentons_europe.py (chronologie) et dentons.py (généalogie du portail) écrites. Tests réels : sync dentons ×2 → found=2, ok=1, 2,9-3,0 s, fiches complètes (titres entiers, dates 2026-10-04, fr/en, GPS-ready) ; sync dentons_europe rejoué → found=0 stable, ok=1, 0,3 s (structurel tant que le board Europe ne republie pas de rôle Global à Montréal — même classe que strongtie a295929 / reworld c59448d) ; non-régression plateforme SF sur tenant vivant alstom : found=245 (médiane ~224), ok=1, 8,6 s. Fiches docs/connecteurs/ dentons.md (nouvelle) + dentons_europe.md + ats-successfactors.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). 107 tests pytest verts (106 + 1 nouveau). 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 +288 −203
    9. [ka6] fix connecteur strongtie: faux positif de supervision « volume QC nul » (42e cas du pattern, 1re intervention sur cette source) — le connecteur est SAIN, found=0 est le comportement CORRECT (médiane historique 1.0, Simpson Strong-Tie siège Pleasanton CA, seul site québécois = le centre de distribution de Châteauguay qui publie 0-1 poste par vagues). Le stale de 4,1 h vient de la définition de succès de la supervision (dernier sync found>0 = 2026-10-05 21:48) : l'unique offre QC en base (R7985 « Warehouse Supervisor », Châteauguay, parue 2026-09-05) a été DÉPUBLIÉE par l'employeur entre 21:48 et 23:56 EDT (found 1 → 0, miss_count=1, puis removed=1 via le garde-fou 2-miss au sync rejoué). sync_log VERT en continu (ok=1). Marqueur Workday classique confirmé live : détail cxs R7985 = 403 S22 « permission denied ». Board re-vérifié live : 200, 102 offres mondiales vivantes, facette pays Canada = 2 (Pitt Meadows BC + Brampton ON), AUCUN lieu QC dans la facette locations ; les 2 offres canadiennes inspectées au détail cxs = mono-lieu BC/ON, additionalLocations vides (angle mort rbc c095c66 exclu) ; searchText Quebec/Québec/Chateauguay/Montreal = 0 partout (les 3 hits « Canada » restants = Ho Chi Minh City, correspondances texte). Aucun site frère sur le tenant : sondage de 8 noms de sites candidats → tous 404 (leçon pwc/silabs appliquée, External est le seul site). Aucune migration d'ATS : strongtie.com/about/jobs (200) référence toujours myworkdayjobs.com/External (même tenant wd1). Artefact vague D comblé dans sources.json : url employeur vide → https://www.strongtie.com (vérifié 200, « Simpson Strong-Tie – Structural Connectors, Fasteners & Hardware »), JSON valide. Tant que Châteauguay ne republie rien, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que reworld c59448d / peaktech 6a2cebc / mitacs a49f7a5 / zoetis 78938c3). Docstring strongtie.py enrichie (chronologie + nature du volume). Sync isolé rejoué ×2 : found=0 stable, ok=1, 7,0-7,2 s ; non-régression plateforme workday sur tenant vivant cineplex : found=1, ok=1, 2,5 s. Fiches docs/connecteurs/ strongtie.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 +336 −362
  9. Mon, Oct 5, 2026 3

    1. [ka6] fix connecteur reworld: faux positif de supervision « volume QC nul » (41e cas du pattern, 1re intervention sur cette source) — le connecteur est SAIN, found=0 est le comportement CORRECT (médiane historique 0.5, Reworld ex-Covanta, valorisation énergétique des déchets, seul site québécois = l'usine de Chambly qui publie 0-1 poste par vagues). Le stale de 4,4 h vient de la définition de succès de la supervision (dernier sync found>0 = 2026-10-05 13:29) : l'unique offre QC en base (JR13561 « Waste Processing Tech II », Chambly, parue 2026-09-05) a été DÉPUBLIÉE par l'employeur entre 13:29 et 15:45 EDT (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss). sync_log VERT en continu (ok=1). Marqueur Workday classique confirmé live : détail cxs JR13561 = 403 S22 « permission denied ». Board re-vérifié live : 200, 160 offres mondiales vivantes, facette pays Canada = 4 (Kitchener ON ×3 + ON Works from home ×1), AUCUN lieu QC dans la facette locations ; les 4 offres canadiennes inspectées au détail cxs = mono-lieu Ontario, additionalLocations vides (angle mort rbc c095c66 exclu) ; le hit searchText « Quebec » (1) = « AZ Driver - Regional » basé à Kitchener dont la description mentionne le Québec comme destination de ROUTE, pas comme lieu de poste. Aucun site frère sur le tenant : sondage de 9 noms de sites candidats → tous 404 (leçon pwc/silabs appliquée, External est le seul site). Aucune migration d'ATS : reworldwaste.com/careers (200) référence toujours myworkdayjobs.com/External (même tenant wd5). Artefact vague C comblé dans sources.json : url employeur vide → https://www.reworldwaste.com (vérifié 200, « A Leader in Sustainable Waste Solutions | Reworld® »), JSON valide. Tant que l'usine de Chambly ne republie rien, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que peaktech 6a2cebc / mitacs a49f7a5 / rbc edde0ca / zoetis 78938c3). Docstring reworld.py enrichie (chronologie + nature du volume). Sync isolé rejoué ×2 : found=0 stable, ok=1, 10,7-11,4 s ; non-régression plateforme workday sur tenant vivant cineplex : found=1, ok=1, 2,5 s. Fiches docs/connecteurs/ reworld.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 +254 −280
    2. [ka6] fix connecteur peaktech: stale « volume QC nul » (40e cas du pattern, 1re intervention sur cette source) — found=0 est CORRECT (médiane historique 0.5, Peak Technologies siège US, le bureau de Montréal 9066 Pascal-Gagnon n'a que 0-1 poste par vagues) : l'unique offre QC en base (3870 « Technicien de service sur le terrain », Montréal, parue 2026-07-30) a été DÉPUBLIÉE par l'employeur entre 13:25 et 15:40 EDT le 2026-10-05 (found 1 → 0, missed=1 puis removed=1 via le garde-fou 2-miss), sync_log VERT en continu (ok=1). MAIS vrai angle mort découvert et corrigé au passage : la recherche Dayforce de ce tenant est PARTITIONNÉE par culture — fr-CA renvoie désormais maxCount=0 (plus aucune offre traduite FR) alors qu'en-CA liste les 37-38 offres du board ; une future offre QC publiée seulement en anglais aurait été invisible. FIX : peaktech.py converti au pattern bi-culture CULTURES=('fr-CA','en-CA') avec fusion par external_id, version fr-CA prioritaire (même pattern que challenger/fnfmb/euromoneyplc). Board re-vérifié live : 38 offres toutes HORS QC (US ×~35, Toronto ON, GB, BE, IE) — zéro angle mort restant. Aucune migration d'ATS : peaktech.com/about-peak-technologies/careers/ (200) référence toujours dayforcehcm.com/CandidatePortal/en-CAN/peaktech (même tenant). Artefact vague C comblé dans sources.json : url employeur vide → https://www.peaktech.com (vérifié 200, « Digital Supply Chain & Mobility Solutions - Peak Technologies »), JSON valide. Tant que Peak Technologies ne republie rien au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que mitacs a49f7a5 / rbc edde0ca / zoetis 78938c3). Preuve du fetch bi-culture : fr-CA voit 0, en-CA voit 37, merge filtré QC → 0. Sync isolé rejoué ×3 : found=0 stable, ok=1, 4,4-4,8 s ; non-régression du pattern bi-culture Dayforce sur challenger : found=2, ok=1. Fiches docs/connecteurs/ peaktech.md + ats-dayforce.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 +256 −282
    3. Revert "[ka6] fix connecteur mitacs: faux positif de supervision « volume QC nul » (39e cas du pattern, 1re intervention sur cette source) — le connecteur est SAIN, found=0 est le comportement CORRECT (médiane historique 0.5, Mitacs OBNL national de recherche publiant surtout hors Québec sur son board BambooHR, le bureau de Montréal n'y a que 0-1 poste par vagues). Le stale de 4,9 h vient de la définition de succès de la supervision (dernier sync found>0 = 2026-10-05 11:02) : l'unique offre QC en base (1823 « Directeur ou directrice, Programmes et Expériences de services », Montréal, parue 2026-09-16) a été DÉPUBLIÉE par Mitacs entre 11:02 et 13:22 EDT (found 1 → 0, missed=1, puis removed=1 via le garde-fou 2-miss). sync_log VERT en continu (ok=1). Marqueur BambooHR « dépublié » confirmé live pour la 1re fois du repo : détail /careers/<id>/detail = 404 + JSON {"type":"not_found"} (offre vivante 1825 = 200 + jobOpeningStatus « Open »). Re-vérification live du board mitacs.bamboohr.com/careers/list : 200, 3 offres toutes HORS QC (Kelowna BC ×2, Lethbridge AB), libellés city/state propres, aucun remote ambigu — zéro angle mort. Aucune migration d'ATS : www.mitacs.ca/careers/ (200) référence toujours mitacs.bamboohr.com/careers (tenant unique, pas de sites frères sur BambooHR). Au passage, artefact vague C comblé dans sources.json (pattern zoetis 78938c3) : url employeur vide → https://www.mitacs.ca (vérifié 200) — édition ciblée 1 ligne, JSON valide. Tant que Mitacs ne republie rien au Québec, ce connecteur sera re-signalé périodiquement : structurel, pas une panne (même classe que rbc edde0ca / zoetis 78938c3 / ghgsat 5e2c122 / poolcorp 3e3fd59). Docstring mitacs.py enrichie (chronologie + marqueur BambooHR + nature du volume). Sync isolé rejoué ×2 : found=0 stable, ok=1, 0,3 s ; non-régression plateforme bamboohr sur tenant vivant broccolini : found=23, ok=1. Fiches docs/connecteurs/ mitacs.md + ats-bamboohr.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."
      …
      This reverts commit a49f7a57fe726acb9128168dec936c09556c0c12.
      Simon-Pierre Boucher · 3 files +184 −158
Menu

Theme