[ka6] fix connecteur nemaska_lithium: frontal ADP intermittent PAR CID (8e cas, garde-fou retry borné répliqué) — stale causé par le 404 nocturne du 30/10 23:45 (épisode multi-tenants 23:45→04:42) suivi d'un nouveau 404 isolé à 12:29 ; sonde live 2/6 essais 200 totalNumber=1 + 4 « default backend - 404 » de 21 octets = intermittence, tenant vivant ; garde-fou _get_json (30 essais, pause 2 s, timeout 15 s) répliqué de bento_sushi/cookit/mitsubishi_hc_capital/niobec/osgoode_properties/uv_assurance/strathmore, complémentaire du repli « détail seulement » existant ; sync isolé vert found=1 (= médiane 1.0) en 2,5 s, 108 tests pytest verts, fiches nemaska_lithium.md/ats-adp.md/INDEX.md régénérées, 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 +97 −43
modified
docs/connecteurs/INDEX.md
+17 −17
@@ -5,16 +5,16 @@ Auteur : Simon-Pierre Boucher | ||
| 5 | 5 | Contact : contact@spboucher.ai |
| 6 | 6 | Fichier : docs/connecteurs/INDEX.md |
| 7 | 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 11:33 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | |
| 8 | +Généré : 2026-10-31 13:33 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | |
| 9 | 9 | relancer le script pour régénérer. |
| 10 | 10 | ============================================================================= |
| 11 | 11 | --> |
| 12 | 12 | |
| 13 | 13 | # Job·Ka — Connecteurs (index) |
| 14 | 14 | |
| 15 | −> Index généré le 2026-10-31 11:33 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 13:33 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** — **25246 offres actives** (22725 directes, 2521 portails ; 108 masquées comme doublons inter-sources, soit 25138 visibles). 1135 fiches. | |
| 17 | +**1103 employeurs directs** connectés via **27 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **25366 offres actives** (22732 directes, 2634 portails ; 111 masquées comme doublons inter-sources, soit 25255 visibles). 1135 fiches. | |
| 18 | 18 | |
| 19 | 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 | |
@@ -22,13 +22,13 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | ||
| 22 | 22 | |
| 23 | 23 | | Plateforme | Employeurs | Actives | Salaire | GPS | |
| 24 | 24 | |---|---|---|---|---| |
| 25 | −| [`workday`](ats-workday.md) | 232 | 7340 | 47 % | 88 % | | |
| 25 | +| [`workday`](ats-workday.md) | 232 | 7347 | 47 % | 88 % | | |
| 26 | 26 | | [`smartrecruiters`](ats-smartrecruiters.md) | 171 | 2894 | 16 % | 99 % | |
| 27 | −| [`workable`](ats-workable.md) | 71 | 1994 | 17 % | 100 % | | |
| 28 | −| [`dayforce`](ats-dayforce.md) | 129 | 1897 | 10 % | 100 % | | |
| 27 | +| [`workable`](ats-workable.md) | 71 | 1993 | 17 % | 100 % | | |
| 28 | +| [`dayforce`](ats-dayforce.md) | 129 | 1899 | 10 % | 100 % | | |
| 29 | 29 | | [`successfactors`](ats-successfactors.md) | 12 | 1639 | 19 % | 99 % | |
| 30 | 30 | | [`njoyn`](ats-njoyn.md) | 11 | 1265 | 69 % | 87 % | |
| 31 | −| [`workland`](ats-workland.md) | 1 | 1107 | 37 % | 100 % | | |
| 31 | +| [`workland`](ats-workland.md) | 1 | 1106 | 37 % | 100 % | | |
| 32 | 32 | | [`wpjobmanager`](ats-wpjobmanager.md) | 8 | 805 | 6 % | 100 % | |
| 33 | 33 | | [`greenhouse`](ats-greenhouse.md) | 132 | 792 | 19 % | 100 % | |
| 34 | 34 | | [`lever`](ats-lever.md) | 58 | 622 | 20 % | 95 % | |
@@ -54,20 +54,20 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | ||
| 54 | 54 | |
| 55 | 55 | | Source | Actives | Salaire | Dernier sync | |
| 56 | 56 | |---|---|---|---| |
| 57 | −| [Espresso-Jobs](espresso_jobs.md) | 157 | 22 % | 2026-10-31 11:12 | | |
| 58 | −| [Guichet-Emplois (Canada)](guichet_emplois.md) | 532 | 100 % | 2026-10-31 11:23 | | |
| 59 | −| [Jobillico](jobillico.md) | 1832 | 35 % | 2026-10-31 09:08 | | |
| 57 | +| [Espresso-Jobs](espresso_jobs.md) | 157 | 22 % | 2026-10-31 11:59 | | |
| 58 | +| [Guichet-Emplois (Canada)](guichet_emplois.md) | 501 | 100 % | 2026-10-31 12:08 | | |
| 59 | +| [Jobillico](jobillico.md) | 1976 | 34 % | 2026-10-31 12:21 | | |
| 60 | 60 | | [Dépôt direct employeurs](depot-direct.md) | 0 (0 en modération) | — | au fil de l'eau | |
| 61 | 61 | |
| 62 | 62 | ## Employeurs directs (par volume d'offres actives) |
| 63 | 63 | |
| 64 | 64 | | Employeur | ATS | Actives | Salaire | GPS | Dernier sync OK | |
| 65 | 65 | |---|---|---|---|---|---| |
| 66 | −| [Réseau Atlas Workland (~80 employeurs QC : CSS, cégeps, Santé Québec, STQ, UQTR…)](atlas_workland.md) | [`workland`](ats-workland.md) | 1107 | 37 % | 100 % | ✅ | | |
| 66 | +| [Réseau Atlas Workland (~80 employeurs QC : CSS, cégeps, Santé Québec, STQ, UQTR…)](atlas_workland.md) | [`workland`](ats-workland.md) | 1106 | 37 % | 100 % | ✅ | | |
| 67 | 67 | | [Couche-Tard / Circle K](circlek.md) | [`workday`](ats-workday.md) | 984 | 70 % | 67 % | ✅ | |
| 68 | 68 | | [Solution SFT](solution_sft.md) | [`workable`](ats-workable.md) | 959 | 23 % | 100 % | ✅ | |
| 69 | 69 | | [Bombardier](bombardier.md) | [`successfactors`](ats-successfactors.md) | 899 | 1 % | 100 % | ✅ | |
| 70 | −| [Walmart Canada](walmart.md) | [`workday`](ats-workday.md) | 877 | 98 % | 90 % | ✅ | | |
| 70 | +| [Walmart Canada](walmart.md) | [`workday`](ats-workday.md) | 886 | 98 % | 91 % | ✅ | | |
| 71 | 71 | | [Santé Québec — Montréal](sante_montreal.md) | [`njoyn`](ats-njoyn.md) | 817 | 98 % | 98 % | ✅ | |
| 72 | 72 | | [TEHORA](tehora.md) | [`workable`](ats-workable.md) | 421 | 0 % | 100 % | ✅ | |
| 73 | 73 | | [Université McGill](mcgill.md) | [`workday`](ats-workday.md) | 395 | 82 % | 100 % | ✅ | |
@@ -85,7 +85,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | ||
| 85 | 85 | | [Groupe Banque TD](td.md) | [`workday`](ats-workday.md) | 184 | 94 % | 96 % | ✅ | |
| 86 | 86 | | [CISSS de Laval](cisss_laval.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 175 | 2 % | 100 % | ✅ | |
| 87 | 87 | | [La Vie en Rose](lavieenrose.md) | [`dayforce`](ats-dayforce.md) | 153 | 5 % | 100 % | ✅ | |
| 88 | −| [Le Groupe Maurice](groupemaurice.md) | [`dayforce`](ats-dayforce.md) | 146 | 0 % | 100 % | ✅ | | |
| 88 | +| [Le Groupe Maurice](groupemaurice.md) | [`dayforce`](ats-dayforce.md) | 148 | 0 % | 100 % | ✅ | | |
| 89 | 89 | | [CISSS de l'Abitibi-Témiscamingue](cisss_abitibi.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 144 | 0 % | 100 % | ✅ | |
| 90 | 90 | | [Sodexo Canada](sodexocanadaltd.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 143 | 82 % | 99 % | ✅ | |
| 91 | 91 | | [CISSS des Laurentides](cisss_laurentides.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 135 | 6 % | 100 % | ✅ | |
@@ -161,12 +161,12 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | ||
| 161 | 161 | | [EXFO](exfo.md) | [`workday`](ats-workday.md) | 43 | 0 % | 100 % | ✅ | |
| 162 | 162 | | [JD Sports Canada](jdsports.md) | [`dayforce`](ats-dayforce.md) | 42 | 0 % | 100 % | ✅ | |
| 163 | 163 | | [Myhrabc](myhrabc.md) | [`workday`](ats-workday.md) | 42 | 55 % | 50 % | ✅ | |
| 164 | −| [Valsoft](valsoft_corp.md) | [`workable`](ats-workable.md) | 41 | 7 % | 100 % | ✅ | | |
| 165 | 164 | | [Cohere](cohere.md) | [`ashby`](ats-ashby.md) | 40 | 92 % | 25 % | ✅ | |
| 166 | 165 | | [Levio](levio.md) | [`greenhouse`](ats-greenhouse.md) | 40 | 0 % | 100 % | ✅ | |
| 167 | −| [Uhaul](uhaul.md) | [`workday`](ats-workday.md) | 40 | 0 % | 100 % | ✅ | | |
| 166 | +| [Valsoft](valsoft_corp.md) | [`workable`](ats-workable.md) | 40 | 8 % | 100 % | ✅ | | |
| 168 | 167 | | [Firststudent](firststudent.md) | [`workday`](ats-workday.md) | 39 | 41 % | 97 % | ✅ | |
| 169 | 168 | | [Info-Ways](info_ways.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 39 | 0 % | 100 % | ✅ | |
| 169 | +| [Uhaul](uhaul.md) | [`workday`](ats-workday.md) | 39 | 0 % | 100 % | ✅ | | |
| 170 | 170 | | [Domtar](domtar.md) | [`successfactors`](ats-successfactors.md) | 38 | 8 % | 100 % | ✅ | |
| 171 | 171 | | [Sapsol Technologies Inc](sapsol_technologies_inc_7.md) | [`workable`](ats-workable.md) | 38 | 0 % | 100 % | ✅ | |
| 172 | 172 | | [system canada technologies](systemcanadatechnologies.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 38 | 0 % | 100 % | ✅ | |
@@ -224,7 +224,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | ||
| 224 | 224 | | [Behaviour Interactif](bhvr.md) | [`lever`](ats-lever.md) | 24 | 0 % | 100 % | ✅ | |
| 225 | 225 | | [Best Buy Canada](bestbuycanada.md) | [`workday`](ats-workday.md) | 24 | 0 % | 38 % | ✅ | |
| 226 | 226 | | [CHUM](chum.md) | [`wpjobmanager`](ats-wpjobmanager.md) | 24 | 4 % | 100 % | ✅ | |
| 227 | −| [Cineplex](cineplex.md) | [`workday`](ats-workday.md) | 24 | 0 % | 96 % | ✅ | | |
| 228 | 227 | | [CSS des Découvreurs](cssdd.md) | [`digitalrecruiters`](ats-digitalrecruiters.md) | 24 | 83 % | 100 % | ✅ | |
| 229 | 228 | | [Directive](directive.md) | [`ashby`](ats-ashby.md) | 24 | 21 % | 0 % | ✅ | |
| 230 | 229 | | [Exportation et développement Canada (EDC)](export_development_canada.md) | [`workable`](ats-workable.md) | 24 | 96 % | 100 % | ✅ | |
@@ -237,6 +236,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | ||
| 237 | 236 | | [Structube](structube1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 24 | 0 % | 100 % | ✅ | |
| 238 | 237 | | [Airliquidehr](airliquidehr.md) | [`workday`](ats-workday.md) | 23 | 22 % | 100 % | ✅ | |
| 239 | 238 | | [Broccolini](broccolini.md) | [`bamboohr`](ats-bamboohr.md) | 23 | 4 % | 100 % | ✅ | |
| 239 | +| [Cineplex](cineplex.md) | [`workday`](ats-workday.md) | 23 | 0 % | 96 % | ✅ | | |
| 240 | 240 | | [MEDFAR Solutions Cliniques](medfar.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 23 | 0 % | 100 % | ✅ | |
| 241 | 241 | | [Progesys](progesys_inc.md) | [`breezy`](ats-breezy.md) | 23 | 9 % | 96 % | ✅ | |
| 242 | 242 | | [Unitytech](unitytech.md) | [`workday`](ats-workday.md) | 23 | 91 % | 83 % | ✅ | |
@@ -603,7 +603,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | ||
| 603 | 603 | | [Aviya Aerospace Systems](aviyatech.md) | [`lever`](ats-lever.md) | 5 | 0 % | 100 % | ✅ | |
| 604 | 604 | | [BDL Énergie](bdl_energie.md) | [`breezy`](ats-breezy.md) | 5 | 20 % | 20 % | ✅ | |
| 605 | 605 | | [Behavox](behavox.md) | [`greenhouse`](ats-greenhouse.md) | 5 | 0 % | 100 % | ✅ | |
| 606 | −| [Canadian Royalties](canadian_royalties.md) | [`adp`](ats-adp.md) | 5 | 40 % | 100 % | ❌ | | |
| 606 | +| [Canadian Royalties](canadian_royalties.md) | [`adp`](ats-adp.md) | 5 | 40 % | 100 % | ✅ | | |
| 607 | 607 | | [Conagrabrands](conagrabrands.md) | [`workday`](ats-workday.md) | 5 | 80 % | 100 % | ✅ | |
| 608 | 608 | | [Consultant(e) en développement des affaires](omnitrans.md) | [`dayforce`](ats-dayforce.md) | 5 | 40 % | 100 % | ✅ | |
| 609 | 609 | | [Cultures Gen V](cultures_genv.md) | [`adp`](ats-adp.md) | 5 | 20 % | 100 % | ✅ | |
modified
docs/connecteurs/ats-adp.md
+18 −18
@@ -5,7 +5,7 @@ Auteur : Simon-Pierre Boucher | ||
| 5 | 5 | Contact : contact@spboucher.ai |
| 6 | 6 | Fichier : docs/connecteurs/ats-adp.md |
| 7 | 7 | Rôle : Fiche plateforme ATS adp — mécanique partagée + tableau des 17 tenants |
| 8 | −Généré : 2026-10-31 11:33 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | |
| 8 | +Généré : 2026-10-31 13:33 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | |
| 9 | 9 | relancer le script pour régénérer. |
| 10 | 10 | ============================================================================= |
| 11 | 11 | --> |
@@ -40,23 +40,23 @@ Généré : 2026-10-31 11:33 EDT par scripts/gen_connector_docs.py — NE PAS | ||
| 40 | 40 | |
| 41 | 41 | | Employeur | Actives | Salaire | GPS | Mode | Dernier sync | OK | |
| 42 | 42 | |---|---|---|---|---|---|---| |
| 43 | −| [Uniboard](uniboard.md) | 19 | 32 % | 63 % | 0 % | 2026-10-31 09:35 | ✅ | | |
| 44 | −| [Groupe Nordik (Nordik Spa-Nature)](groupe_nordik.md) | 16 | 25 % | 100 % | 0 % | 2026-10-31 11:17 | ✅ | | |
| 45 | −| [UV Assurance](uv_assurance.md) | 14 | 0 % | 100 % | 0 % | 2026-10-31 09:35 | ✅ | | |
| 46 | −| [Cook It](cookit.md) | 10 | 60 % | 100 % | 0 % | 2026-10-31 11:04 | ✅ | | |
| 47 | −| [H2O Innovation](h2o_innovation.md) | 9 | 0 % | 100 % | 0 % | 2026-10-31 11:23 | ✅ | | |
| 48 | −| [Strathmore](strathmore.md) | 9 | 44 % | 100 % | 0 % | 2026-10-31 11:33 | ✅ | | |
| 49 | −| [Quincaillerie Richelieu](richelieu.md) | 9 | 0 % | 100 % | 0 % | 2026-10-31 09:24 | ✅ | | |
| 50 | −| [Bento Sushi](bento_sushi.md) | 8 | 88 % | 100 % | 0 % | 2026-10-31 10:46 | ✅ | | |
| 51 | −| [MSI Gestion immobilière](msi_gestion.md) | 6 | 100 % | 100 % | 50 % | 2026-10-31 09:17 | ✅ | | |
| 52 | −| [Abritek](abritek.md) | 6 | 100 % | 100 % | 0 % | 2026-10-31 10:39 | ✅ | | |
| 53 | −| [Cultures Gen V](cultures_genv.md) | 5 | 20 % | 100 % | 0 % | 2026-10-31 11:05 | ✅ | | |
| 54 | −| [Canadian Royalties](canadian_royalties.md) | 5 | 40 % | 100 % | 0 % | 2026-10-31 10:48 | ❌ | | |
| 55 | −| [Mitsubishi HC Capital Canada](mitsubishi_hc_capital.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 09:16 | ✅ | | |
| 56 | −| [Osgoode Properties](osgoode_properties.md) | 1 | 100 % | 100 % | 0 % | 2026-10-31 09:19 | ✅ | | |
| 57 | −| [Nemaska Lithium](nemaska_lithium.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 09:17 | ✅ | | |
| 58 | −| [Triple Boris](triple_boris.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 09:34 | ✅ | | |
| 59 | −| [Niobec (Magris Performance Materials)](niobec.md) | 0 | — | — | — | 2026-10-31 09:17 | ✅ | | |
| 43 | +| [Uniboard](uniboard.md) | 19 | 32 % | 63 % | 0 % | 2026-10-31 12:47 | ✅ | | |
| 44 | +| [Groupe Nordik (Nordik Spa-Nature)](groupe_nordik.md) | 16 | 25 % | 100 % | 0 % | 2026-10-31 12:05 | ✅ | | |
| 45 | +| [UV Assurance](uv_assurance.md) | 14 | 0 % | 100 % | 0 % | 2026-10-31 12:47 | ✅ | | |
| 46 | +| [Cook It](cookit.md) | 10 | 60 % | 100 % | 0 % | 2026-10-31 11:51 | ✅ | | |
| 47 | +| [H2O Innovation](h2o_innovation.md) | 9 | 0 % | 100 % | 0 % | 2026-10-31 12:08 | ✅ | | |
| 48 | +| [Strathmore](strathmore.md) | 9 | 44 % | 100 % | 0 % | 2026-10-31 12:42 | ✅ | | |
| 49 | +| [Quincaillerie Richelieu](richelieu.md) | 9 | 0 % | 100 % | 0 % | 2026-10-31 12:36 | ✅ | | |
| 50 | +| [Bento Sushi](bento_sushi.md) | 8 | 88 % | 100 % | 0 % | 2026-10-31 11:40 | ✅ | | |
| 51 | +| [MSI Gestion immobilière](msi_gestion.md) | 6 | 100 % | 100 % | 50 % | 2026-10-31 12:28 | ✅ | | |
| 52 | +| [Abritek](abritek.md) | 6 | 100 % | 100 % | 0 % | 2026-10-31 11:34 | ✅ | | |
| 53 | +| [Cultures Gen V](cultures_genv.md) | 5 | 20 % | 100 % | 0 % | 2026-10-31 11:51 | ✅ | | |
| 54 | +| [Canadian Royalties](canadian_royalties.md) | 5 | 40 % | 100 % | 0 % | 2026-10-31 11:41 | ✅ | | |
| 55 | +| [Mitsubishi HC Capital Canada](mitsubishi_hc_capital.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 12:28 | ✅ | | |
| 56 | +| [Osgoode Properties](osgoode_properties.md) | 1 | 100 % | 100 % | 0 % | 2026-10-31 12:31 | ✅ | | |
| 57 | +| [Nemaska Lithium](nemaska_lithium.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 13:33 | ✅ | | |
| 58 | +| [Triple Boris](triple_boris.md) | 1 | 0 % | 100 % | 0 % | 2026-10-31 12:46 | ✅ | | |
| 59 | +| [Niobec (Magris Performance Materials)](niobec.md) | 0 | — | — | — | 2026-10-31 12:29 | ✅ | | |
| 60 | 60 | |
| 61 | 61 | ## Licence / conformité |
| 62 | 62 | |
modified
docs/connecteurs/nemaska_lithium.md
+6 −6
@@ -5,7 +5,7 @@ Auteur : Simon-Pierre Boucher | ||
| 5 | 5 | Contact : contact@spboucher.ai |
| 6 | 6 | Fichier : docs/connecteurs/nemaska_lithium.md |
| 7 | 7 | Rôle : Fiche connecteur — Nemaska Lithium (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 13:33 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | |
| 9 | 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 | 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 13:33 EDT). | |
| 42 | 42 | |
| 43 | 43 | | Champ (`jobs.*`) | Rôle | Complétude | |
| 44 | 44 | |---|---|---| |
@@ -79,15 +79,15 @@ Exemple réel : *Candidature spontanée - Carrière à l'usine de Bécancour* | ||
| 79 | 79 | |
| 80 | 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 13:33 EDT dans `data/jobka.db`)* | |
| 83 | 83 | |
| 84 | 84 | - **Offres en base** : 1 (dont **1 actives**, 0 masquées comme doublons `dup_of`) |
| 85 | 85 | - **Salaire** : 0/1 actives (0 %) |
| 86 | 86 | - **GPS** : 1/1 actives (100 %) |
| 87 | 87 | - **Mode** : 0/1 actives (0 %) |
| 88 | 88 | - **Parution** : 1/1 actives (100 %) |
| 89 | −- **Dernier sync** : 2026-10-14 15:45 — trouvées 1, +0, ~0, -0 | |
| 90 | −- **Syncs enregistrés** (`sync_log`) : 469 | |
| 89 | +- **Dernier sync** : 2026-10-31 13:33 — trouvées 1, +0, ~0, -0 | |
| 90 | +- **Syncs enregistrés** (`sync_log`) : 616 | |
| 91 | 91 | |
| 92 | 92 | ## Erreurs & dépannage |
| 93 | 93 | |
@@ -95,7 +95,7 @@ Erreurs relevées dans `sync_log` : | ||
| 95 | 95 | |
| 96 | 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:00 | | |
| 98 | +| 404 Client Error: Not Found for url: https://workforcenow.adp.com/mascsr/default/careercen… | 3 | 2026-10-31 12:29 | | |
| 99 | 99 | | Expecting value: line 1 column 1 (char 0) | 3 | 2026-08-30 00:55 | |
| 100 | 100 | | ('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer')) | 1 | 2026-08-29 02:25 | |
| 101 | 101 | |
modified
jobka/connectors/nemaska_lithium.py
+56 −2
@@ -5,11 +5,32 @@ | ||
| 5 | 5 | # Fichier : jobka/connectors/nemaska_lithium.py |
| 6 | 6 | # Rôle : Connecteur Nemaska Lithium — lithium (Whabouchi/Bécancour) — ADP WFN |
| 7 | 7 | # + repli « détail seulement » quand l'API liste échoue (maintenances |
| 8 | −# nocturnes ADP) | |
| 9 | −# Créé : 2026-08-25 Modifié : 2026-08-30 | |
| 8 | +# nocturnes ADP) + garde-fou retry borné (frontal ADP intermittent | |
| 9 | +# par cid) | |
| 10 | +# Créé : 2026-08-25 Modifié : 2026-10-31 | |
| 10 | 11 | # ============================================================================= |
| 11 | 12 | """Nemaska Lithium — ADP Workforce Now, avec repli de revalidation. |
| 12 | 13 | |
| 14 | +Chronologie (mission ka6 2026-10-31) : 8e tenant ADP de l'app touché par le | |
| 15 | +frontal intermittent PAR CID (même panne que bento_sushi 64f53c8f, cookit | |
| 16 | +7873198d, mitsubishi_hc_capital du 2026-10-26, niobec 61a2ddf8, | |
| 17 | +osgoode_properties 3b95c432, uv_assurance 946898d9 et strathmore b6b8f9fc — | |
| 18 | +pool backend malade côté ADP, « default backend - 404 » nginx). Vert found=1 | |
| 19 | +en continu (= la médiane 1.0), puis 404 franc sur la liste fr_CA à 23:45 le | |
| 20 | +30/10 (épisode nocturne multi-tenants 23:45→04:42) ; reverdi seul à 02:15, | |
| 21 | +06:25 et 09:17, puis NOUVEAU 404 isolé à 12:29 → stale. Sonde live 13:1x : | |
| 22 | +sur 6 essais sur la MÊME URL liste à la même minute, 2 × 200 JSON | |
| 23 | +(totalNumber=1) et 4 × « default backend - 404 » de 21 octets — | |
| 24 | +intermittence, tenant VIVANT, aucune migration. Garde-fou répliqué des sept | |
| 25 | +frères : `_get_json` retente jusqu'à 30 fois (pause 2 s) sur | |
| 26 | +404/502/503/504/timeout/non-JSON, timeout abaissé 30→15 s pour borner les | |
| 27 | +connexions qui pendent. Dormant dès que le frontal est sain (1er essai OK = | |
| 28 | +zéro surcoût) ; un sync vert ne coûte qu'UN appel liste (détails en cache | |
| 29 | +BD). NE PAS retirer ce garde-fou si un futur scan le croise : il est inerte | |
| 30 | +hors panne. Il couvre liste ET détail (_fetch_detail passe par _get_json) ; | |
| 31 | +le repli « détail seulement » ci-dessous reste la défense contre les | |
| 32 | +maintenances totales sorry.adp.com. | |
| 33 | + | |
| 13 | 34 | Contexte (2026-08-28/29) : ADP Workforce Now a des fenêtres de maintenance |
| 14 | 35 | nocturnes récurrentes (vendredi ET samedi soir ~22:00 → 02:00 ET) pendant |
| 15 | 36 | lesquelles TOUT workforcenow.adp.com redirige vers sorry.adp.com — la liste |
@@ -33,6 +54,8 @@ fin de la maintenance. | ||
| 33 | 54 | """ |
| 34 | 55 | from __future__ import annotations |
| 35 | 56 | |
| 57 | +import time | |
| 58 | + | |
| 36 | 59 | import requests |
| 37 | 60 | |
| 38 | 61 | from ..schema import JobPosting, clean_html |
@@ -45,6 +68,37 @@ class NemaskaLithiumConnector(ADPWorkforceNowConnector): | ||
| 45 | 68 | CID = "79ec02f1-3a83-4cbd-93d3-571a0f8432e8" |
| 46 | 69 | CCID = "19000101_000001" |
| 47 | 70 | |
| 71 | + # Frontal ADP intermittent pour CE tenant (2026-10-31) : mêmes bornes que | |
| 72 | + # bento_sushi/cookit/mitsubishi_hc_capital/niobec/osgoode_properties/ | |
| 73 | + # uv_assurance/strathmore — les 404 échouent vite (<1 s), le timeout | |
| 74 | + # court borne les connexions qui pendent, et un sync vert ne coûte qu'UN | |
| 75 | + # appel liste (détails en cache BD). | |
| 76 | + timeout = 15 | |
| 77 | + _FLAKY_TRIES = 30 | |
| 78 | + _FLAKY_PAUSE = 2.0 | |
| 79 | + | |
| 80 | + def _get_json(self, url: str, params: dict) -> dict: | |
| 81 | + last: Exception | None = None | |
| 82 | + for attempt in range(self._FLAKY_TRIES): | |
| 83 | + if attempt: | |
| 84 | + time.sleep(self._FLAKY_PAUSE) | |
| 85 | + try: | |
| 86 | + return super()._get_json(url, params) | |
| 87 | + except requests.HTTPError as exc: | |
| 88 | + status = getattr(exc.response, "status_code", None) | |
| 89 | + if status not in (404, 502, 503, 504): | |
| 90 | + raise | |
| 91 | + last = exc | |
| 92 | + except (requests.Timeout, requests.ConnectionError) as exc: | |
| 93 | + last = exc | |
| 94 | + except RuntimeError as exc: | |
| 95 | + # « ADP non-JSON après 3 essais » de la classe de base : | |
| 96 | + # même frontal malade, même traitement. | |
| 97 | + if not str(exc).startswith("ADP non-JSON"): | |
| 98 | + raise | |
| 99 | + last = exc | |
| 100 | + raise last | |
| 101 | + | |
| 48 | 102 | def fetch(self) -> list[JobPosting]: |
| 49 | 103 | try: |
| 50 | 104 | return super().fetch() |
| 51 | 105 | |