[ka6] fix connecteur osgoode_properties: frontal ADP intermittent PAR CID (5e cas, garde-fou retry borné répliqué) — stale causé par 2 syncs 404 pendant l'épisode nocturne ADP du 30-31/10, tenant vivant, sync vert found=1 (= médiane 1.0)
Chronologie : vert found=1 en continu jusqu'à 21:26 EDT le 30/10, puis 404 franc sur la liste fr_CA à 23:47 et 02:24 — épisode nocturne ADP multi-tenants (nemaska_lithium, niobec, strathmore, uv_assurance, canadian_royalties touchés 23:45→03:23 pendant que cookit/cultures_genv/h2o_innovation répondaient 200), le même que niobec 61a2ddf8 de la veille. À 04:30 la panne persistait par intermittence pour CE cid : 2 succès sur 6 essais curl sur la MÊME URL liste à la même minute (404 404 200 200 404 404), et le sync rejoué sans correctif a encore pris un 404 à la seconde où curl obtenait 200. Le repli « détail seulement » du connecteur laisse volontairement passer les 4xx (un 404 franc est normalement un signal sûr chez ADP), d'où le stale — même angle mort que bento_sushi 64f53c8f, cookit 7873198d, mitsubishi_hc_capital (2026-10-26) et niobec (2026-10-31), fiche mémoire adp-frontal-intermittent-par-cid. Tenant VIVANT, aucune migration : la liste en_CA expose 3 réquisitions (Live-In Superintendent Ottawa, Live-In Superintendent Kingston ON, Concierge - Gatineau QC) — l'unique offre QC 9201780233629_1 est toujours publiée, found=1 est le volume exact. Correctif minimal, scoped au connecteur (doctrine des 4 frères, PAS de proxy) : _get_json retente jusqu'à 30 fois (pause 2 s) sur 404/502/503/504/timeout/non-JSON, timeout abaissé 30→15 s pour borner les connexions qui pendent. Dormant hors panne (1er essai OK = zéro surcoût) ; un sync vert ne coûte qu'UN appel liste par culture (détails en cache BD). L'itération bi-culture CULTURES=(fr_CA, en_CA) du fix f5132e4d est intacte. Test : sync isolé rejoué AVEC garde-fou = vert ok=1 found=1 added=0 removed=0 en 7,1 s (quelques retries absorbés), offre Concierge - Gatineau active en base. 108 tests pytest verts. Fiches osgoode_properties.md/ats-adp.md/INDEX.md régénérées (1132 autres 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>
4 changed files +76 −24
modified
docs/connecteurs/INDEX.md
+10 −10
@@ -5,16 +5,16 @@ Auteur : Simon-Pierre Boucher | |||||
| 5 | Contact : contact@spboucher.ai | 5 | Contact : contact@spboucher.ai | ||
| 6 | Fichier : docs/connecteurs/INDEX.md | 6 | Fichier : docs/connecteurs/INDEX.md | ||
| 7 | Rôle : Index généré de la documentation des connecteurs (ATS, employeurs, portails, dépôt) | 7 | Rôle : Index généré de la documentation des connecteurs (ATS, employeurs, portails, dépôt) | ||
| 8 | −Généré : 2026-10-31 04:16 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | 8 | +Généré : 2026-10-31 04:32 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | ||
| 9 | relancer le script pour régénérer. | 9 | relancer le script pour régénérer. | ||
| 10 | ============================================================================= | 10 | ============================================================================= | ||
| 11 | --> | 11 | --> | ||
| 12 | 12 | ||||
| 13 | # Job·Ka — Connecteurs (index) | 13 | # Job·Ka — Connecteurs (index) | ||
| 14 | 14 | ||||
| 15 | −> Index généré le 2026-10-31 04:16 EDT par `scripts/gen_connector_docs.py` (rejouable). Croise `data/sources.json`, l'introspection de `jobka/connectors/*.py` et la base live `data/jobka.db`. | 15 | +> Index généré le 2026-10-31 04:32 EDT par `scripts/gen_connector_docs.py` (rejouable). Croise `data/sources.json`, l'introspection de `jobka/connectors/*.py` et la base live `data/jobka.db`. | ||
| 16 | 16 | ||||
| 17 | −**1103 employeurs directs** connectés via **27 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **25362 offres actives** (22932 directes, 2430 portails ; 101 masquées comme doublons inter-sources, soit 25261 visibles). 1135 fiches. | 17 | +**1103 employeurs directs** connectés via **27 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **25358 offres actives** (22928 directes, 2430 portails ; 100 masquées comme doublons inter-sources, soit 25258 visibles). 1135 fiches. | ||
| 18 | 18 | ||||
| 19 | Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conserve son URL originale ; la candidature se fait chez l'employeur (badge « Offre directe » sur les sources directes). | 19 | Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conserve son URL originale ; la candidature se fait chez l'employeur (badge « Offre directe » sur les sources directes). | ||
| 20 | 20 | ||||
@@ -27,9 +27,9 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | |||||
| 27 | | [`workable`](ats-workable.md) | 71 | 1974 | 17 % | 100 % | | 27 | | [`workable`](ats-workable.md) | 71 | 1974 | 17 % | 100 % | | ||
| 28 | | [`dayforce`](ats-dayforce.md) | 129 | 1901 | 10 % | 100 % | | 28 | | [`dayforce`](ats-dayforce.md) | 129 | 1901 | 10 % | 100 % | | ||
| 29 | | [`successfactors`](ats-successfactors.md) | 12 | 1649 | 19 % | 99 % | | 29 | | [`successfactors`](ats-successfactors.md) | 12 | 1649 | 19 % | 99 % | | ||
| 30 | −| [`njoyn`](ats-njoyn.md) | 11 | 1345 | 70 % | 87 % | | 30 | +| [`njoyn`](ats-njoyn.md) | 11 | 1343 | 71 % | 87 % | | ||
| 31 | | [`workland`](ats-workland.md) | 1 | 1109 | 37 % | 100 % | | 31 | | [`workland`](ats-workland.md) | 1 | 1109 | 37 % | 100 % | | ||
| 32 | −| [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 806 | 6 % | 100 % | | 32 | +| [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 805 | 6 % | 100 % | | ||
| 33 | | [`greenhouse`](ats-greenhouse.md) | 132 | 792 | 19 % | 100 % | | 33 | | [`greenhouse`](ats-greenhouse.md) | 132 | 792 | 19 % | 100 % | | ||
| 34 | | [`lever`](ats-lever.md) | 58 | 622 | 20 % | 95 % | | 34 | | [`lever`](ats-lever.md) | 58 | 622 | 20 % | 95 % | | ||
| 35 | | [`breezy`](ats-breezy.md) | 71 | 402 | 37 % | 94 % | | 35 | | [`breezy`](ats-breezy.md) | 71 | 402 | 37 % | 94 % | | ||
@@ -40,7 +40,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | |||||
| 40 | | [`teamtailor`](ats-teamtailor.md) | 10 | 166 | 28 % | 96 % | | 40 | | [`teamtailor`](ats-teamtailor.md) | 10 | 166 | 28 % | 96 % | | ||
| 41 | | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 146 | 14 % | 86 % | | 41 | | [`zoho_recruit`](ats-zoho_recruit.md) | 16 | 146 | 14 % | 86 % | | ||
| 42 | | [`jazzhr`](ats-jazzhr.md) | 27 | 143 | 17 % | 91 % | | 42 | | [`jazzhr`](ats-jazzhr.md) | 27 | 143 | 17 % | 91 % | | ||
| 43 | −| [`adp`](ats-adp.md) | 17 | 132 | 33 % | 91 % | | 43 | +| [`adp`](ats-adp.md) | 17 | 131 | 34 % | 91 % | | ||
| 44 | | [`taleo`](ats-taleo.md) | 5 | 105 | 0 % | 100 % | | 44 | | [`taleo`](ats-taleo.md) | 5 | 105 | 0 % | 100 % | | ||
| 45 | | [`icims`](ats-icims.md) | 7 | 52 | 27 % | 98 % | | 45 | | [`icims`](ats-icims.md) | 7 | 52 | 27 % | 98 % | | ||
| 46 | | [`ultipro`](ats-ultipro.md) | 4 | 48 | 50 % | 100 % | | 46 | | [`ultipro`](ats-ultipro.md) | 4 | 48 | 50 % | 100 % | | ||
@@ -71,8 +71,8 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | |||||
| 71 | | [Walmart Canada](walmart.md) | [`workday`](ats-workday.md) | 872 | 98 % | 90 % | ✅ | | 71 | | [Walmart Canada](walmart.md) | [`workday`](ats-workday.md) | 872 | 98 % | 90 % | ✅ | | ||
| 72 | | [TEHORA](tehora.md) | [`workable`](ats-workable.md) | 421 | 0 % | 100 % | ✅ | | 72 | | [TEHORA](tehora.md) | [`workable`](ats-workable.md) | 421 | 0 % | 100 % | ✅ | | ||
| 73 | | [Université McGill](mcgill.md) | [`workday`](ats-workday.md) | 417 | 81 % | 100 % | ✅ | | 73 | | [Université McGill](mcgill.md) | [`workday`](ats-workday.md) | 417 | 81 % | 100 % | ✅ | | ||
| 74 | −| [CGI](cgi.md) | [`njoyn`](ats-njoyn.md) | 299 | 0 % | 94 % | ✅ | | ||||
| 75 | | [Mouvement Desjardins](desjardins.md) | [`workday`](ats-workday.md) | 298 | 1 % | 92 % | ✅ | | 74 | | [Mouvement Desjardins](desjardins.md) | [`workday`](ats-workday.md) | 298 | 1 % | 92 % | ✅ | | ||
| 75 | +| [CGI](cgi.md) | [`njoyn`](ats-njoyn.md) | 297 | 0 % | 94 % | ✅ | | ||||
| 76 | | [CIMA+](cima2.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 282 | 1 % | 100 % | ✅ | | 76 | | [CIMA+](cima2.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 282 | 1 % | 100 % | ✅ | | ||
| 77 | | [Go RH](gorh.md) | [`lever`](ats-lever.md) | 267 | 17 % | 98 % | ✅ | | 77 | | [Go RH](gorh.md) | [`lever`](ats-lever.md) | 267 | 17 % | 98 % | ✅ | | ||
| 78 | | [Slihrms](slihrms.md) | [`workday`](ats-workday.md) | 260 | 10 % | 95 % | ❌ | | 78 | | [Slihrms](slihrms.md) | [`workday`](ats-workday.md) | 260 | 10 % | 95 % | ❌ | | ||
@@ -218,13 +218,13 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | |||||
| 218 | | [Teknion Roy & Breton](teknionroybreton.md) | [`recruitee`](ats-recruitee.md) | 26 | 50 % | 85 % | ✅ | | 218 | | [Teknion Roy & Breton](teknionroybreton.md) | [`recruitee`](ats-recruitee.md) | 26 | 50 % | 85 % | ✅ | | ||
| 219 | | [Altasciences](altasciences.md) | [`workday`](ats-workday.md) | 25 | 0 % | 96 % | ✅ | | 219 | | [Altasciences](altasciences.md) | [`workday`](ats-workday.md) | 25 | 0 % | 96 % | ✅ | | ||
| 220 | | [AVP](aviva.md) | [`workday`](ats-workday.md) | 25 | 12 % | 92 % | ✅ | | 220 | | [AVP](aviva.md) | [`workday`](ats-workday.md) | 25 | 12 % | 92 % | ✅ | | ||
| 221 | −| [CHUM](chum.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 25 | 4 % | 100 % | ✅ | | ||||
| 222 | | [Estimator](tranetechnologies.md) | [`workday`](ats-workday.md) | 25 | 100 % | 96 % | ✅ | | 221 | | [Estimator](tranetechnologies.md) | [`workday`](ats-workday.md) | 25 | 100 % | 96 % | ✅ | | ||
| 223 | | [Huawei Canada](huaweicanada.md) | [`recruitee`](ats-recruitee.md) | 25 | 4 % | 100 % | ✅ | | 222 | | [Huawei Canada](huaweicanada.md) | [`recruitee`](ats-recruitee.md) | 25 | 4 % | 100 % | ✅ | | ||
| 224 | | [AppDirect](appdirect.md) | [`greenhouse`](ats-greenhouse.md) | 24 | 25 % | 100 % | ✅ | | 223 | | [AppDirect](appdirect.md) | [`greenhouse`](ats-greenhouse.md) | 24 | 25 % | 100 % | ✅ | | ||
| 225 | | [Baseten](baseten.md) | [`ashby`](ats-ashby.md) | 24 | 100 % | 0 % | ✅ | | 224 | | [Baseten](baseten.md) | [`ashby`](ats-ashby.md) | 24 | 100 % | 0 % | ✅ | | ||
| 226 | | [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 24 | 0 % | 100 % | ✅ | | 225 | | [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 24 | 0 % | 100 % | ✅ | | ||
| 227 | | [Best Buy Canada](bestbuycanada.md) | [`workday`](ats-workday.md) | 24 | 0 % | 38 % | ✅ | | 226 | | [Best Buy Canada](bestbuycanada.md) | [`workday`](ats-workday.md) | 24 | 0 % | 38 % | ✅ | | ||
| 227 | +| [CHUM](chum.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 24 | 4 % | 100 % | ✅ | | ||||
| 228 | | [Directive](directive.md) | [`ashby`](ats-ashby.md) | 24 | 21 % | 0 % | ✅ | | 228 | | [Directive](directive.md) | [`ashby`](ats-ashby.md) | 24 | 21 % | 0 % | ✅ | | ||
| 229 | | [Exportation et développement Canada (EDC)](export_development_canada.md) | [`workable`](ats-workable.md) | 24 | 96 % | 100 % | ✅ | | 229 | | [Exportation et développement Canada (EDC)](export_development_canada.md) | [`workable`](ats-workable.md) | 24 | 96 % | 100 % | ✅ | | ||
| 230 | | [FedEx Express Canada](fedex.md) | [`workday`](ats-workday.md) | 24 | 100 % | 88 % | ✅ | | 230 | | [FedEx Express Canada](fedex.md) | [`workday`](ats-workday.md) | 24 | 100 % | 88 % | ✅ | | ||
@@ -555,7 +555,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | |||||
| 555 | | [Bilingual (French/English) Sales Broker (RIBO Licensed)](ogc.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ | | 555 | | [Bilingual (French/English) Sales Broker (RIBO Licensed)](ogc.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ | | ||
| 556 | | [Board](deltastar.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ | | 556 | | [Board](deltastar.md) | [`dayforce`](ats-dayforce.md) | 6 | 33 % | 100 % | ✅ | | ||
| 557 | | [Bronswerk](bronswerk.md) | [`dayforce`](ats-dayforce.md) | 6 | 0 % | 100 % | ✅ | | 557 | | [Bronswerk](bronswerk.md) | [`dayforce`](ats-dayforce.md) | 6 | 0 % | 100 % | ✅ | | ||
| 558 | −| [Canadian Royalties](canadian_royalties.md) | [`adp`](ats-adp.md) | 6 | 33 % | 100 % | ✅ | | ||||
| 559 | | [Carnaval de Québec Inc.](carnaval.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 0 % | 100 % | ✅ | | 558 | | [Carnaval de Québec Inc.](carnaval.md) | [`zoho_recruit`](ats-zoho_recruit.md) | 6 | 0 % | 100 % | ✅ | | ||
| 560 | | [Cfibfcei](cfibfcei.md) | [`dayforce`](ats-dayforce.md) | 6 | 17 % | 100 % | ✅ | | 559 | | [Cfibfcei](cfibfcei.md) | [`dayforce`](ats-dayforce.md) | 6 | 17 % | 100 % | ✅ | | ||
| 561 | | [Conseil de gestion financière des Premières Nations (FNFMB)](fnfmb.md) | [`dayforce`](ats-dayforce.md) | 6 | 0 % | 100 % | ✅ | | 560 | | [Conseil de gestion financière des Premières Nations (FNFMB)](fnfmb.md) | [`dayforce`](ats-dayforce.md) | 6 | 0 % | 100 % | ✅ | | ||
@@ -604,6 +603,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | |||||
| 604 | | [Aviya Aerospace Systems](aviyatech.md) | [`lever`](ats-lever.md) | 5 | 0 % | 100 % | ✅ | | 603 | | [Aviya Aerospace Systems](aviyatech.md) | [`lever`](ats-lever.md) | 5 | 0 % | 100 % | ✅ | | ||
| 605 | | [BDL Énergie](bdl_energie.md) | [`breezy`](ats-breezy.md) | 5 | 20 % | 20 % | ✅ | | 604 | | [BDL Énergie](bdl_energie.md) | [`breezy`](ats-breezy.md) | 5 | 20 % | 20 % | ✅ | | ||
| 606 | | [Behavox](behavox.md) | [`greenhouse`](ats-greenhouse.md) | 5 | 0 % | 100 % | ✅ | | 605 | | [Behavox](behavox.md) | [`greenhouse`](ats-greenhouse.md) | 5 | 0 % | 100 % | ✅ | | ||
| 606 | +| [Canadian Royalties](canadian_royalties.md) | [`adp`](ats-adp.md) | 5 | 40 % | 100 % | ✅ | | ||||
| 607 | | [Conagrabrands](conagrabrands.md) | [`workday`](ats-workday.md) | 5 | 80 % | 100 % | ✅ | | 607 | | [Conagrabrands](conagrabrands.md) | [`workday`](ats-workday.md) | 5 | 80 % | 100 % | ✅ | | ||
| 608 | | [Consultant(e) en développement des affaires](omnitrans.md) | [`dayforce`](ats-dayforce.md) | 5 | 40 % | 100 % | ✅ | | 608 | | [Consultant(e) en développement des affaires](omnitrans.md) | [`dayforce`](ats-dayforce.md) | 5 | 40 % | 100 % | ✅ | | ||
| 609 | | [Cultures Gen V](cultures_genv.md) | [`adp`](ats-adp.md) | 5 | 20 % | 100 % | ✅ | | 609 | | [Cultures Gen V](cultures_genv.md) | [`adp`](ats-adp.md) | 5 | 20 % | 100 % | ✅ | | ||
@@ -982,7 +982,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | |||||
| 982 | | [ON Animation Studio](onanimationstudio.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 1 | 0 % | 100 % | ✅ | | 982 | | [ON Animation Studio](onanimationstudio.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 1 | 0 % | 100 % | ✅ | | ||
| 983 | | [Onomatic](onomatic.md) | [`workable`](ats-workable.md) | 1 | 0 % | 100 % | ✅ | | 983 | | [Onomatic](onomatic.md) | [`workable`](ats-workable.md) | 1 | 0 % | 100 % | ✅ | | ||
| 984 | | [Openmind Technologies](openmindt.md) | [`bamboohr`](ats-bamboohr.md) | 1 | 0 % | 100 % | ✅ | | 984 | | [Openmind Technologies](openmindt.md) | [`bamboohr`](ats-bamboohr.md) | 1 | 0 % | 100 % | ✅ | | ||
| 985 | −| [Osgoode Properties](osgoode_properties.md) | [`adp`](ats-adp.md) | 1 | 100 % | 100 % | ❌ | | 985 | +| [Osgoode Properties](osgoode_properties.md) | [`adp`](ats-adp.md) | 1 | 100 % | 100 % | ✅ | | ||
| 986 | | [Panda7](panda7.md) | [`breezy`](ats-breezy.md) | 1 | 100 % | 100 % | ✅ | | 986 | | [Panda7](panda7.md) | [`breezy`](ats-breezy.md) | 1 | 100 % | 100 % | ✅ | | ||
| 987 | | [Passport Brand Design](passportbranddesign.md) | [`greenhouse`](ats-greenhouse.md) | 1 | 0 % | 100 % | ✅ | | 987 | | [Passport Brand Design](passportbranddesign.md) | [`greenhouse`](ats-greenhouse.md) | 1 | 0 % | 100 % | ✅ | | ||
| 988 | | [Patterson Companies](pattersoncompanies.md) | [`workday`](ats-workday.md) | 1 | 0 % | 100 % | ✅ | | 988 | | [Patterson Companies](pattersoncompanies.md) | [`workday`](ats-workday.md) | 1 | 0 % | 100 % | ✅ | | ||
modified
docs/connecteurs/ats-adp.md
+6 −6
@@ -5,14 +5,14 @@ Auteur : Simon-Pierre Boucher | |||||
| 5 | Contact : contact@spboucher.ai | 5 | Contact : contact@spboucher.ai | ||
| 6 | Fichier : docs/connecteurs/ats-adp.md | 6 | Fichier : docs/connecteurs/ats-adp.md | ||
| 7 | Rôle : Fiche plateforme ATS adp — mécanique partagée + tableau des 17 tenants | 7 | Rôle : Fiche plateforme ATS adp — mécanique partagée + tableau des 17 tenants | ||
| 8 | −Généré : 2026-10-31 04:03 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | 8 | +Généré : 2026-10-31 04:32 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | ||
| 9 | relancer le script pour régénérer. | 9 | relancer le script pour régénérer. | ||
| 10 | ============================================================================= | 10 | ============================================================================= | ||
| 11 | --> | 11 | --> | ||
| 12 | 12 | ||||
| 13 | # Plateforme ATS `adp` | 13 | # Plateforme ATS `adp` | ||
| 14 | 14 | ||||
| 15 | −**17 employeurs connectés** via cette plateforme — **132 offres actives**. Module partagé : `jobka/connectors/adp.py` ; un employeur = une sous-classe d'environ 10 lignes. | 15 | +**17 employeurs connectés** via cette plateforme — **131 offres actives**. Module partagé : `jobka/connectors/adp.py` ; un employeur = une sous-classe d'environ 10 lignes. | ||
| 16 | 16 | ||||
| 17 | ## Description & mécanique | 17 | ## Description & mécanique | ||
| 18 | 18 | ||||
@@ -47,13 +47,13 @@ Généré : 2026-10-31 04:03 EDT par scripts/gen_connector_docs.py — NE PAS | |||||
| 47 | | [Cook It](cookit.md) | 10 | 60 % | 100 % | 0 % | 2026-10-31 01:26 | ✅ | | 47 | | [Cook It](cookit.md) | 10 | 60 % | 100 % | 0 % | 2026-10-31 01:26 | ✅ | | ||
| 48 | | [H2O Innovation](h2o_innovation.md) | 9 | 0 % | 100 % | 0 % | 2026-10-31 01:47 | ✅ | | 48 | | [H2O Innovation](h2o_innovation.md) | 9 | 0 % | 100 % | 0 % | 2026-10-31 01:47 | ✅ | | ||
| 49 | | [Strathmore](strathmore.md) | 9 | 44 % | 100 % | 0 % | 2026-10-31 03:00 | ✅ | | 49 | | [Strathmore](strathmore.md) | 9 | 44 % | 100 % | 0 % | 2026-10-31 03:00 | ✅ | | ||
| 50 | −| [Bento Sushi](bento_sushi.md) | 8 | 88 % | 100 % | 0 % | 2026-10-31 03:56 | ✅ | | 50 | +| [Bento Sushi](bento_sushi.md) | 8 | 88 % | 100 % | 0 % | 2026-10-31 04:23 | ✅ | | ||
| 51 | | [MSI Gestion immobilière](msi_gestion.md) | 6 | 100 % | 100 % | 50 % | 2026-10-31 02:12 | ✅ | | 51 | | [MSI Gestion immobilière](msi_gestion.md) | 6 | 100 % | 100 % | 50 % | 2026-10-31 02:12 | ✅ | | ||
| 52 | −| [Canadian Royalties](canadian_royalties.md) | 6 | 33 % | 100 % | 0 % | 2026-10-31 01:18 | ❌ | | 52 | +| [Abritek](abritek.md) | 6 | 100 % | 100 % | 0 % | 2026-10-31 04:17 | ✅ | | ||
| 53 | −| [Abritek](abritek.md) | 6 | 100 % | 100 % | 0 % | 2026-10-31 03:43 | ✅ | | ||||
| 54 | | [Cultures Gen V](cultures_genv.md) | 5 | 20 % | 100 % | 0 % | 2026-10-31 01:27 | ✅ | | 53 | | [Cultures Gen V](cultures_genv.md) | 5 | 20 % | 100 % | 0 % | 2026-10-31 01:27 | ✅ | | ||
| 54 | +| [Canadian Royalties](canadian_royalties.md) | 5 | 40 % | 100 % | 0 % | 2026-10-31 04:25 | ✅ | | ||||
| 55 | | [Mitsubishi HC Capital Canada](mitsubishi_hc_capital.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 02:08 | ✅ | | 55 | | [Mitsubishi HC Capital Canada](mitsubishi_hc_capital.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 02:08 | ✅ | | ||
| 56 | −| [Osgoode Properties](osgoode_properties.md) | 1 | 100 % | 100 % | 0 % | 2026-10-31 02:24 | ❌ | | 56 | +| [Osgoode Properties](osgoode_properties.md) | 1 | 100 % | 100 % | 0 % | 2026-10-31 04:32 | ✅ | | ||
| 57 | | [Nemaska Lithium](nemaska_lithium.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 02:15 | ✅ | | 57 | | [Nemaska Lithium](nemaska_lithium.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 02:15 | ✅ | | ||
| 58 | | [Triple Boris](triple_boris.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 03:15 | ✅ | | 58 | | [Triple Boris](triple_boris.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 03:15 | ✅ | | ||
| 59 | | [Niobec (Magris Performance Materials)](niobec.md) | 0 | — | — | — | 2026-10-31 04:03 | ✅ | | 59 | | [Niobec (Magris Performance Materials)](niobec.md) | 0 | — | — | — | 2026-10-31 04:03 | ✅ | | ||
modified
docs/connecteurs/osgoode_properties.md
+7 −7
@@ -5,7 +5,7 @@ Auteur : Simon-Pierre Boucher | |||||
| 5 | Contact : contact@spboucher.ai | 5 | Contact : contact@spboucher.ai | ||
| 6 | Fichier : docs/connecteurs/osgoode_properties.md | 6 | Fichier : docs/connecteurs/osgoode_properties.md | ||
| 7 | Rôle : Fiche connecteur — Osgoode Properties (employeur direct, ATS adp) | 7 | Rôle : Fiche connecteur — Osgoode Properties (employeur direct, ATS adp) | ||
| 8 | −Généré : 2026-10-14 18:40 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | 8 | +Généré : 2026-10-31 04:32 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | ||
| 9 | relancer le script pour régénérer. | 9 | relancer le script pour régénérer. | ||
| 10 | ============================================================================= | 10 | ============================================================================= | ||
| 11 | --> | 11 | --> | ||
@@ -38,7 +38,7 @@ Généré : 2026-10-14 18:40 EDT par scripts/gen_connector_docs.py — NE PAS | |||||
| 38 | 38 | ||||
| 39 | ## Champs → schéma | 39 | ## Champs → schéma | ||
| 40 | 40 | ||||
| 41 | −Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-10-14 18:40 EDT). | 41 | +Complétude mesurée sur les **1 offres actives** de la source (base live, 2026-10-31 04:32 EDT). | ||
| 42 | 42 | ||||
| 43 | | Champ (`jobs.*`) | Rôle | Complétude | | 43 | | Champ (`jobs.*`) | Rôle | Complétude | | ||
| 44 | |---|---|---| | 44 | |---|---|---| | ||
@@ -51,7 +51,7 @@ Complétude mesurée sur les **1 offres actives** de la source (base live, 2026- | |||||
| 51 | | `address` — Adresse | adresse du lieu de travail | 0 % | | 51 | | `address` — Adresse | adresse du lieu de travail | 0 % | | ||
| 52 | | `postal_code` — Code postal | code postal si publié | 100 % | | 52 | | `postal_code` — Code postal | code postal si publié | 100 % | | ||
| 53 | | `work_mode` — Mode | presentiel / hybride / teletravail | 0 % | | 53 | | `work_mode` — Mode | presentiel / hybride / teletravail | 0 % | | ||
| 54 | −| `employment_type` — Type | temps_plein / temps_partiel / … | 100 % | | 54 | +| `employment_type` — Type | temps_plein / temps_partiel / … | 0 % | | ||
| 55 | | `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % | | 55 | | `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 100 % | | ||
| 56 | | `salary_label` — Libellé salaire | texte salarial original | 0 % | | 56 | | `salary_label` — Libellé salaire | texte salarial original | 0 % | | ||
| 57 | | `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % | | 57 | | `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % | | ||
@@ -79,15 +79,15 @@ Exemple réel : *Concierge - Gatineau* — Gatineau · ∅ · parue le 2026-08-0 | |||||
| 79 | 79 | ||||
| 80 | ## Volumétrie & complétude live | 80 | ## Volumétrie & complétude live | ||
| 81 | 81 | ||||
| 82 | −*(mesuré le 2026-10-14 18:40 EDT dans `data/jobka.db`)* | 82 | +*(mesuré le 2026-10-31 04:32 EDT dans `data/jobka.db`)* | ||
| 83 | 83 | ||||
| 84 | - **Offres en base** : 2 (dont **1 actives**, 0 masquées comme doublons `dup_of`) | 84 | - **Offres en base** : 2 (dont **1 actives**, 0 masquées comme doublons `dup_of`) | ||
| 85 | - **Salaire** : 1/1 actives (100 %) | 85 | - **Salaire** : 1/1 actives (100 %) | ||
| 86 | - **GPS** : 1/1 actives (100 %) | 86 | - **GPS** : 1/1 actives (100 %) | ||
| 87 | - **Mode** : 0/1 actives (0 %) | 87 | - **Mode** : 0/1 actives (0 %) | ||
| 88 | - **Parution** : 1/1 actives (100 %) | 88 | - **Parution** : 1/1 actives (100 %) | ||
| 89 | −- **Dernier sync** : 2026-10-14 15:47 — trouvées 1, +0, ~0, -0 | 89 | +- **Dernier sync** : 2026-10-31 04:32 — trouvées 1, +0, ~0, -0 | ||
| 90 | −- **Syncs enregistrés** (`sync_log`) : 548 | 90 | +- **Syncs enregistrés** (`sync_log`) : 692 | ||
| 91 | 91 | ||||
| 92 | ## Erreurs & dépannage | 92 | ## Erreurs & dépannage | ||
| 93 | 93 | ||||
@@ -95,7 +95,7 @@ Erreurs relevées dans `sync_log` : | |||||
| 95 | 95 | ||||
| 96 | | Erreur | Occurrences | Dernière fois | | 96 | | Erreur | Occurrences | Dernière fois | | ||
| 97 | |---|---|---| | 97 | |---|---|---| | ||
| 98 | −| 404 Client Error: Not Found for url: https://workforcenow.adp.com/mascsr/default/careercen… | 1 | 2026-10-10 02:02 | | 98 | +| 404 Client Error: Not Found for url: https://workforcenow.adp.com/mascsr/default/careercen… | 4 | 2026-10-31 04:30 | | ||
| 99 | | Expecting value: line 1 column 1 (char 0) | 2 | 2026-08-29 22:54 | | 99 | | Expecting value: line 1 column 1 (char 0) | 2 | 2026-08-29 22:54 | | ||
| 100 | | ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer')) | 1 | 2026-08-29 02:25 | | 100 | | ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer')) | 1 | 2026-08-29 02:25 | | ||
| 101 | 101 | ||||
modified
jobka/connectors/osgoode_properties.py
+53 −1
@@ -6,7 +6,7 @@ | |||||
| 6 | # Rôle : Connecteur Osgoode Properties (immobilier locatif — immeubles à | 6 | # Rôle : Connecteur Osgoode Properties (immobilier locatif — immeubles à | ||
| 7 | # Gatineau) — ADP WFN bi-culture (fr_CA + en_CA) + repli « détail | 7 | # Gatineau) — ADP WFN bi-culture (fr_CA + en_CA) + repli « détail | ||
| 8 | # seulement » quand l'API liste échoue (maintenances nocturnes ADP) | 8 | # seulement » quand l'API liste échoue (maintenances nocturnes ADP) | ||
| 9 | −# Créé : 2026-08-19 Modifié : 2026-10-10 | 9 | +# Créé : 2026-08-19 Modifié : 2026-10-31 | ||
| 10 | # ============================================================================= | 10 | # ============================================================================= | ||
| 11 | """Osgoode Properties — ADP Workforce Now bi-culture, avec repli de | 11 | """Osgoode Properties — ADP Workforce Now bi-culture, avec repli de | ||
| 12 | revalidation. | 12 | revalidation. | ||
@@ -48,9 +48,31 @@ sorry.adp.com), l'erreur d'origine est propagée pour que le sync reste un | |||||
| 48 | échec (inventaire préservé). Limite assumée : le repli ne découvre pas les | 48 | échec (inventaire préservé). Limite assumée : le repli ne découvre pas les | ||
| 49 | NOUVELLES offres — le chemin liste normal reprend seul au cycle suivant la | 49 | NOUVELLES offres — le chemin liste normal reprend seul au cycle suivant la | ||
| 50 | fin de la maintenance. | 50 | fin de la maintenance. | ||
| 51 | + | ||||
| 52 | +Chronologie (mission ka6 2026-10-31) : 5e tenant ADP de l'app touché par le | ||||
| 53 | +frontal intermittent PAR CID (même panne que bento_sushi 64f53c8f, cookit | ||||
| 54 | +7873198d, mitsubishi_hc_capital du 2026-10-26 et niobec 61a2ddf8 de la | ||||
| 55 | +veille — pool backend malade côté ADP). Vert found=1 en continu jusqu'à | ||||
| 56 | +21:26 EDT le 30/10, puis 404 franc sur la liste fr_CA à 23:47 et 02:24 | ||||
| 57 | +(épisode nocturne multi-tenants : nemaska_lithium, niobec, strathmore, | ||||
| 58 | +uv_assurance, canadian_royalties touchés dans la même fenêtre 23:45→03:23, | ||||
| 59 | +pendant que cookit/cultures_genv/h2o_innovation répondaient 200) ; le repli | ||||
| 60 | +« détail seulement » ci-dessus laisse volontairement passer les 4xx, d'où | ||||
| 61 | +le stale. Sonde live 04:30 : 2 succès sur 6 essais sur la MÊME URL liste à | ||||
| 62 | +la même minute (404 404 200 200 404 404) — intermittence, pas une panne | ||||
| 63 | +totale ni un tenant mort (la liste en_CA 200 expose une réquisition vivante, | ||||
| 64 | +itemID 9201802642033_1 parue le 2026-10-20). Garde-fou répliqué des quatre | ||||
| 65 | +frères : `_get_json` retente jusqu'à 30 fois (pause 2 s) sur | ||||
| 66 | +404/502/503/504/timeout/non-JSON, timeout abaissé 30→15 s pour borner les | ||||
| 67 | +connexions qui pendent. Dormant dès que le frontal est sain (1er essai OK = | ||||
| 68 | +zéro surcoût) ; un sync vert ne coûte qu'UN appel liste par culture | ||||
| 69 | +(détails en cache BD). NE PAS retirer ce garde-fou si un futur scan le | ||||
| 70 | +croise : il est inerte hors panne. | ||||
| 51 | """ | 71 | """ | ||
| 52 | from __future__ import annotations | 72 | from __future__ import annotations | ||
| 53 | 73 | ||||
| 74 | +import time | ||||
| 75 | + | ||||
| 54 | import requests | 76 | import requests | ||
| 55 | 77 | ||||
| 56 | from ..schema import JobPosting, clean_html | 78 | from ..schema import JobPosting, clean_html | ||
@@ -66,6 +88,36 @@ class OsgoodePropertiesConnector(ADPWorkforceNowConnector): | |||||
| 66 | # gagne la fusion ; en_CA est la seule culture servie en 2026-10. | 88 | # gagne la fusion ; en_CA est la seule culture servie en 2026-10. | ||
| 67 | CULTURES = ("fr_CA", "en_CA") | 89 | CULTURES = ("fr_CA", "en_CA") | ||
| 68 | 90 | ||||
| 91 | + # Frontal ADP intermittent pour CE tenant (2026-10-31) : mêmes bornes que | ||||
| 92 | + # bento_sushi/cookit/mitsubishi_hc_capital/niobec — les 404 échouent vite | ||||
| 93 | + # (<1 s), le timeout court borne les connexions qui pendent, et un sync | ||||
| 94 | + # vert ne coûte qu'UN appel liste par culture (détails en cache BD). | ||||
| 95 | + timeout = 15 | ||||
| 96 | + _FLAKY_TRIES = 30 | ||||
| 97 | + _FLAKY_PAUSE = 2.0 | ||||
| 98 | + | ||||
| 99 | + def _get_json(self, url: str, params: dict) -> dict: | ||||
| 100 | + last: Exception | None = None | ||||
| 101 | + for attempt in range(self._FLAKY_TRIES): | ||||
| 102 | + if attempt: | ||||
| 103 | + time.sleep(self._FLAKY_PAUSE) | ||||
| 104 | + try: | ||||
| 105 | + return super()._get_json(url, params) | ||||
| 106 | + except requests.HTTPError as exc: | ||||
| 107 | + status = getattr(exc.response, "status_code", None) | ||||
| 108 | + if status not in (404, 502, 503, 504): | ||||
| 109 | + raise | ||||
| 110 | + last = exc | ||||
| 111 | + except (requests.Timeout, requests.ConnectionError) as exc: | ||||
| 112 | + last = exc | ||||
| 113 | + except RuntimeError as exc: | ||||
| 114 | + # « ADP non-JSON après 3 essais » de la classe de base : | ||||
| 115 | + # même frontal malade, même traitement. | ||||
| 116 | + if not str(exc).startswith("ADP non-JSON"): | ||||
| 117 | + raise | ||||
| 118 | + last = exc | ||||
| 119 | + raise last | ||||
| 120 | + | ||||
| 69 | def fetch(self) -> list[JobPosting]: | 121 | def fetch(self) -> list[JobPosting]: | ||
| 70 | try: | 122 | try: | ||
| 71 | merged: dict[str, JobPosting] = {} | 123 | merged: dict[str, JobPosting] = {} | ||
| 72 | 124 | ||||