SPB Git

spb/job-ka

Public

[ka6] fix connecteur uv_assurance: frontal ADP intermittent PAR CID (6e cas, garde-fou retry borné répliqué) — stale causé par 2 syncs 404 (00:02 et 03:23) pendant l'épisode nocturne ADP du 30-31/10 (niobec, osgoode_properties, strathmore, canadian_royalties touchés dans la même fenêtre 23:45→04:42), sonde live 5/6 essais 200 totalNumber=14 + 1 « default backend - 404 », 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, sync isolé vert found=14 (= médiane 14.0), 108 tests pytest verts, fiches uv_assurance.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>
Simon-Pierre Boucher committed (Oct 31, 2026) parent 3b95c43 Browse files

4 changed files +101 −45

modified docs/connecteurs/INDEX.md +7 −7
@@ -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:32 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, 8+Généré : 2026-10-31 04:47 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: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`. 15+> Index généré le 2026-10-31 04:47 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** — **25358 offres actives** (22928 directes, 2430 portails ; 100 masquées comme doublons inter-sources, soit 25258 visibles). 1135 fiches. 17+**1103 employeurs directs** connectés via **27 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **25354 offres actives** (22924 directes, 2430 portails ; 100 masquées comme doublons inter-sources, soit 25254 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
@@ -42,7 +42,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
42 | [`jazzhr`](ats-jazzhr.md) | 27 | 143 | 17 % | 91 % | 42 | [`jazzhr`](ats-jazzhr.md) | 27 | 143 | 17 % | 91 % |
43 | [`adp`](ats-adp.md) | 17 | 131 | 34 % | 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 | 48 | 29 % | 98 % |
46 | [`ultipro`](ats-ultipro.md) | 4 | 48 | 50 % | 100 % | 46 | [`ultipro`](ats-ultipro.md) | 4 | 48 | 50 % | 100 % |
47 | [`digitalrecruiters`](ats-digitalrecruiters.md) | 2 | 36 | 81 % | 100 % | 47 | [`digitalrecruiters`](ats-digitalrecruiters.md) | 2 | 36 | 81 % | 100 % |
48 | [`eightfold`](ats-eightfold.md) | 1 | 33 | 88 % | 100 % | 48 | [`eightfold`](ats-eightfold.md) | 1 | 33 | 88 % | 100 % |
@@ -342,7 +342,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
342 | [Santé Québec](sante_quebec.md) | [`digitalrecruiters`](ats-digitalrecruiters.md) | 14 | 79 % | 100 % | ✅ | 342 | [Santé Québec](sante_quebec.md) | [`digitalrecruiters`](ats-digitalrecruiters.md) | 14 | 79 % | 100 % | ✅ |
343 | [Société de transport de Laval](stl_laval.md) | [`njoyn`](ats-njoyn.md) | 14 | 43 % | 0 % | ✅ | 343 | [Société de transport de Laval](stl_laval.md) | [`njoyn`](ats-njoyn.md) | 14 | 43 % | 0 % | ✅ |
344 | [Ur](ur.md) | [`workday`](ats-workday.md) | 14 | 0 % | 100 % | ❌ | 344 | [Ur](ur.md) | [`workday`](ats-workday.md) | 14 | 0 % | 100 % | ❌ |
345−| [UV Assurance](uv_assurance.md) | [`adp`](ats-adp.md) | 14 | 0 % | 100 % | ❌ | 345+| [UV Assurance](uv_assurance.md) | [`adp`](ats-adp.md) | 14 | 0 % | 100 % | ✅ |
346 | [Bridgestone](bridgestone.md) | [`workday`](ats-workday.md) | 13 | 31 % | 100 % | ✅ | 346 | [Bridgestone](bridgestone.md) | [`workday`](ats-workday.md) | 13 | 31 % | 100 % | ✅ |
347 | [CAA-Québec](caaquebec.md) | [`workday`](ats-workday.md) | 13 | 31 % | 100 % | ✅ | 347 | [CAA-Québec](caaquebec.md) | [`workday`](ats-workday.md) | 13 | 31 % | 100 % | ✅ |
348 | [Canadian Tire](canadiantirecorporation.md) | [`workday`](ats-workday.md) | 13 | 54 % | 92 % | ✅ | 348 | [Canadian Tire](canadiantirecorporation.md) | [`workday`](ats-workday.md) | 13 | 54 % | 92 % | ✅ |
@@ -603,7 +603,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
603 | [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 % | ✅ |
604 | [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 % | ✅ |
605 | [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 % | ✅ | 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 % | ✅ |
@@ -651,7 +651,6 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
651 | [Berger (tourbe horticole)](berger.md) | [`dayforce`](ats-dayforce.md) | 4 | 0 % | 100 % | ✅ | 651 | [Berger (tourbe horticole)](berger.md) | [`dayforce`](ats-dayforce.md) | 4 | 0 % | 100 % | ✅ |
652 | [Bilingual Fire Protection Sales Representative](victaulic.md) | [`workday`](ats-workday.md) | 4 | 100 % | 100 % | ❌ | 652 | [Bilingual Fire Protection Sales Representative](victaulic.md) | [`workday`](ats-workday.md) | 4 | 100 % | 100 % | ❌ |
653 | [Boreala Management](borealamanagement.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | 653 | [Boreala Management](borealamanagement.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ |
654−| [CAPREIT](capreit.md) | [`icims`](ats-icims.md) | 4 | 0 % | 100 % | ✅ |
655 | [Chanel](cc.md) | [`workday`](ats-workday.md) | 4 | 25 % | 100 % | ✅ | 654 | [Chanel](cc.md) | [`workday`](ats-workday.md) | 4 | 25 % | 100 % | ✅ |
656 | [Chewi Creative](chewicreative.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | 655 | [Chewi Creative](chewicreative.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ |
657 | [Cologix](cologix.md) | [`lever`](ats-lever.md) | 4 | 0 % | 100 % | ✅ | 656 | [Cologix](cologix.md) | [`lever`](ats-lever.md) | 4 | 0 % | 100 % | ✅ |
@@ -1061,6 +1060,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser
1061 | [Building Blocks Early Learning Center](blockslearning.md) | [`lever`](ats-lever.md) | 0 | — | — | ✅ | 1060 | [Building Blocks Early Learning Center](blockslearning.md) | [`lever`](ats-lever.md) | 0 | — | — | ✅ |
1062 | [California Closets](californiaclosets.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 0 | — | — | ✅ | 1061 | [California Closets](californiaclosets.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 0 | — | — | ✅ |
1063 | [Capco](capco.md) | [`greenhouse`](ats-greenhouse.md) | 0 | — | — | ✅ | 1062 | [Capco](capco.md) | [`greenhouse`](ats-greenhouse.md) | 0 | — | — | ✅ |
1063+| [CAPREIT](capreit.md) | [`icims`](ats-icims.md) | 0 | — | — | ✅ |
1064 | [CCA](cca1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 0 | — | — | ✅ | 1064 | [CCA](cca1.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 0 | — | — | ✅ |
1065 | [Cooperrentsequip](cooperrentsequip.md) | [`dayforce`](ats-dayforce.md) | 0 | — | — | ✅ | 1065 | [Cooperrentsequip](cooperrentsequip.md) | [`dayforce`](ats-dayforce.md) | 0 | — | — | ✅ |
1066 | [CoorsTek](coorstek.md) | [`workday`](ats-workday.md) | 0 | — | — | ✅ | 1066 | [CoorsTek](coorstek.md) | [`workday`](ats-workday.md) | 0 | — | — | ✅ |
modified docs/connecteurs/ats-adp.md +5 −5
@@ -5,7 +5,7 @@ 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:32 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, 8+Généré : 2026-10-31 04:47 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 -->
@@ -43,15 +43,15 @@ Généré : 2026-10-31 04:32 EDT par scripts/gen_connector_docs.py — NE PAS
43 | [Groupe Nordik (Nordik Spa-Nature)](groupe_nordik.md) | 19 | 26 % | 100 % | 0 % | 2026-10-31 01:39 | ✅ | 43 | [Groupe Nordik (Nordik Spa-Nature)](groupe_nordik.md) | 19 | 26 % | 100 % | 0 % | 2026-10-31 01:39 | ✅ |
44 | [Uniboard](uniboard.md) | 19 | 32 % | 63 % | 0 % | 2026-10-31 03:19 | ✅ | 44 | [Uniboard](uniboard.md) | 19 | 32 % | 63 % | 0 % | 2026-10-31 03:19 | ✅ |
45 | [Quincaillerie Richelieu](richelieu.md) | 17 | 0 % | 71 % | 0 % | 2026-10-31 02:38 | ✅ | 45 | [Quincaillerie Richelieu](richelieu.md) | 17 | 0 % | 71 % | 0 % | 2026-10-31 02:38 | ✅ |
46−| [UV Assurance](uv_assurance.md) | 14 | 0 % | 100 % | 0 % | 2026-10-31 03:23 | ❌ | 46+| [UV Assurance](uv_assurance.md) | 14 | 0 % | 100 % | 0 % | 2026-10-31 04:47 | ✅ |
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 04:23 | ✅ | 50+| [Bento Sushi](bento_sushi.md) | 8 | 88 % | 100 % | 0 % | 2026-10-31 04:40 | ✅ |
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−| [Abritek](abritek.md) | 6 | 100 % | 100 % | 0 % | 2026-10-31 04:17 | ✅ | 52+| [Abritek](abritek.md) | 6 | 100 % | 100 % | 0 % | 2026-10-31 04:33 | ✅ |
53 | [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 | ✅ | 54+| [Canadian Royalties](canadian_royalties.md) | 5 | 40 % | 100 % | 0 % | 2026-10-31 04:42 | ❌ |
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 04:32 | ✅ | 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 | ✅ |
modified docs/connecteurs/uv_assurance.md +18 −17
@@ -5,7 +5,7 @@ Auteur : Simon-Pierre Boucher
5 Contact : contact@spboucher.ai 5 Contact : contact@spboucher.ai
6 Fichier : docs/connecteurs/uv_assurance.md 6 Fichier : docs/connecteurs/uv_assurance.md
7 Rôle : Fiche connecteur — UV Assurance (employeur direct, ATS adp) 7 Rôle : Fiche connecteur — UV Assurance (employeur direct, ATS adp)
8−Généré : 2026-10-23 03:52 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, 8+Généré : 2026-10-31 04:47 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,33 +38,33 @@ Généré : 2026-10-23 03:52 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 **12 offres actives** de la source (base live, 2026-10-23 03:52 EDT). 41+Complétude mesurée sur les **14 offres actives** de la source (base live, 2026-10-31 04:47 EDT).
42 42
43 | Champ (`jobs.*`) | Rôle | Complétude | 43 | Champ (`jobs.*`) | Rôle | Complétude |
44 |---|---|---| 44 |---|---|---|
45 | `title` — Titre | titre du poste | 100 % | 45 | `title` — Titre | titre du poste | 100 % |
46 | `employer` — Employeur | nom de l'entreprise | 100 % | 46 | `employer` — Employeur | nom de l'entreprise | 100 % |
47 | `url` — URL | lien direct vers l'offre originale | 100 % | 47 | `url` — URL | lien direct vers l'offre originale | 100 % |
48−| `description` — Description | texte complet (HTML nettoyé) | 92 % | 48+| `description` — Description | texte complet (HTML nettoyé) | 93 % |
49 | `city` — Ville | municipalité normalisée | 100 % | 49 | `city` — Ville | municipalité normalisée | 100 % |
50 | `region` — Région | région administrative | 100 % | 50 | `region` — Région | région administrative | 100 % |
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 / … | 25 % | 54+| `employment_type` — Type | temps_plein / temps_partiel / … | 21 % |
55 | `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % | 55 | `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 0 % |
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 % |
58−| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 92 % | 58+| `requirements` — Exigences | scolarité, expérience, langues (JSON) | 93 % |
59 | `date_posted` — Date de parution | ISO 8601 | 100 % | 59 | `date_posted` — Date de parution | ISO 8601 | 100 % |
60 | `date_deadline` — Date limite | date limite pour postuler | 0 % | 60 | `date_deadline` — Date limite | date limite pour postuler | 0 % |
61−| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 92 % | 61+| `category` — Catégorie | taxonomie interne (TI, Santé, …) | 86 % |
62−| `language` — Langue | fr / en / bilingue (source ou heuristique) | 92 % | 62+| `language` — Langue | fr / en / bilingue (source ou heuristique) | 93 % |
63 | `company_logo` — Logo employeur | URL du logo si exposé par la source | 0 % | 63 | `company_logo` — Logo employeur | URL du logo si exposé par la source | 0 % |
64 | `apply_url` — Candidature | lien de candidature directe | 0 % | 64 | `apply_url` — Candidature | lien de candidature directe | 0 % |
65 | `gps` — GPS | lat/lng (géocodage sans invention) | 100 % | 65 | `gps` — GPS | lat/lng (géocodage sans invention) | 100 % |
66 66
67−Exemple réel : *Agent(e), service à la clientèle invalidité* — Drummondville · ∅ · parue le 2026-10-19. 67+Exemple réel : *Directeur(trice), Administration des contrats* — Drummondville · ∅ · parue le 2026-10-28.
68 68
69 ## Fréquence & budgets 69 ## Fréquence & budgets
70 70
@@ -79,15 +79,15 @@ Exemple réel : *Agent(e), service à la clientèle invalidité* — Drummondvil
79 79
80 ## Volumétrie & complétude live 80 ## Volumétrie & complétude live
81 81
82−*(mesuré le 2026-10-23 03:52 EDT dans `data/jobka.db`)* 82+*(mesuré le 2026-10-31 04:47 EDT dans `data/jobka.db`)*
83 83
84−- **Offres en base** : 22 (dont **12 actives**, 0 masquées comme doublons `dup_of`) 84+- **Offres en base** : 24 (dont **14 actives**, 0 masquées comme doublons `dup_of`)
85−- **Salaire** : 0/12 actives (0 %) 85+- **Salaire** : 0/14 actives (0 %)
86−- **GPS** : 12/12 actives (100 %) 86+- **GPS** : 14/14 actives (100 %)
87−- **Mode** : 0/12 actives (0 %) 87+- **Mode** : 0/14 actives (0 %)
88−- **Parution** : 12/12 actives (100 %) 88+- **Parution** : 14/14 actives (100 %)
89−- **Dernier sync** : 2026-10-23 03:52 — trouvées 12, +0, ~12, -0 89+- **Dernier sync** : 2026-10-31 04:47 — trouvées 14, +0, ~0, -0
90−- **Syncs enregistrés** (`sync_log`) : 515 90+- **Syncs enregistrés** (`sync_log`) : 579
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-23 00:47 | 98+| 404 Client Error: Not Found for url: https://workforcenow.adp.com/mascsr/default/careercen… | 3 | 2026-10-31 03:23 |
99 | Expecting value: line 1 column 1 (char 0) | 2 | 2026-08-29 23:27 | 99 | Expecting value: line 1 column 1 (char 0) | 2 | 2026-08-29 23:27 |
100 100
101 - Rejouer un sync isolé : `.venv/bin/python run.py sync uv_assurance` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='uv_assurance' ORDER BY ts DESC LIMIT 5;"` 101 - Rejouer un sync isolé : `.venv/bin/python run.py sync uv_assurance` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='uv_assurance' ORDER BY ts DESC LIMIT 5;"`
@@ -117,6 +117,7 @@ Erreurs relevées dans `sync_log` :
117 117
118 Commits touchant `jobka/connectors/uv_assurance.py` : 118 Commits touchant `jobka/connectors/uv_assurance.py` :
119 119
120+- `19490bc4` 2026-10-23 [ka6] connecteur uv_assurance: stale = faux positif, blip de maintenance nocturne ADP WFN — rien à réparer. Syncs verts found=12 en continu jusqu'au 2026-10-22 21:37 EDT, puis UN SEUL échec à 00:47 « 404 Not Found » sur l'endpoint job-requisitions de workforcenow.adp.com. Même fenêtre SYSTÉMIQUE 00:35→01:54 EDT du 2026-10-23 que triple_boris (c2d1ee6c) et uniboard (507e3761) : 6 tenants ADP touchés (richelieu, strathmore, triple_boris, uniboard, uv_assurance, abritek), même mécanique que les maintenances ADP des 28-30 août (c7d9ece) mais signature 404 franc ; le retry de adp.py ne couvre volontairement que le 200 non-JSON — un 404 échoue net et le connecteur repart seul à la rotation suivante. Endpoint re-vérifié live 200 JSON via curl à 03:52 EDT (totalNumber=12), sync isolé rejoué : ok=1 found=12 (= médiane 12.0) en 15,2 s. Aucun code de fetch modifié, docstring chronologie seulement ; fiches uv_assurance.md/ats-adp.md/INDEX.md régénérées (1131 autres fiches restaurées, hors périmètre). 108 tests verts, pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
120 - `91532543` 2026-08-29 Revert "[ka6] snapshot pré-mission abritek" 121 - `91532543` 2026-08-29 Revert "[ka6] snapshot pré-mission abritek"
121 - `4e9b08bb` 2026-08-29 [ka6] snapshot pré-mission abritek 122 - `4e9b08bb` 2026-08-29 [ka6] snapshot pré-mission abritek
122 - `856863d2` 2026-08-25 Vague D implémentée — 75 nouveaux connecteurs (968 -> 1044 employeurs), ~768 offres QC 123 - `856863d2` 2026-08-25 Vague D implémentée — 75 nouveaux connecteurs (968 -> 1044 employeurs), ~768 offres QC
modified jobka/connectors/uv_assurance.py +71 −16
@@ -2,24 +2,48 @@
2 # Job·Ka — Groupe KA 2 # Job·Ka — Groupe KA
3 # Auteur : Simon-Pierre Boucher 3 # Auteur : Simon-Pierre Boucher
4 # Contact : contact@spboucher.ai 4 # Contact : contact@spboucher.ai
5−# Fichier : jobka/connectors/jobka/connectors/uv_assurance.py 5+# Fichier : jobka/connectors/uv_assurance.py
6 # Rôle : Connecteur UV Assurance — assurance, Drummondville — ADP WFN 6 # Rôle : Connecteur UV Assurance — assurance, Drummondville — ADP WFN
7−# Créé : 2026-08-25 Modifié : 2026-10-23 7+# + garde-fou retry borné (frontal ADP intermittent par cid)
8−# ============================================================================= 8+# Créé : 2026-08-25 Modifié : 2026-10-31
9−# [ka6 2026-10-23] Signalé stale (found=0, médiane 12.0) : FAUX POSITIF — blip
10−# de maintenance nocturne ADP WFN. Chronologie (sync_log) : syncs verts
11−# found=12 en continu jusqu'au 2026-10-22 21:37 EDT, puis UN SEUL échec à
12−# 00:47 « 404 Not Found » sur l'endpoint job-requisitions de
13−# workforcenow.adp.com — fenêtre SYSTÉMIQUE 00:35→01:54 EDT touchant 6
14−# tenants ADP (richelieu, strathmore, triple_boris, uniboard, uv_assurance,
15−# abritek), même mécanique que les maintenances ADP des 28-30 août (c7d9ece)
16−# mais signature 404 au lieu du 302 sorry.adp.com / 200 non-JSON ; le retry
17−# de adp.py ne couvre que le 200 non-JSON, un 404 franc échoue net — voulu,
18−# le connecteur repart seul à la rotation suivante. Endpoint re-vérifié live
19−# 200 JSON via curl à 03:52 (totalNumber=12), sync isolé rejoué : ok=1
20−# found=12 (= médiane) en 15,2 s. Rien à réparer dans le flux. Historique :
21−# mêmes blips ADP les 29-30 août (verdicts rien_a_faire).
22 # ============================================================================= 9 # =============================================================================
10+"""UV Assurance — tenant ADP WFN 8490e9be (Drummondville, fr_CA).
11+
12+[ka6 2026-10-23] Signalé stale (found=0, médiane 12.0) : FAUX POSITIF — blip
13+de maintenance nocturne ADP WFN. Chronologie (sync_log) : syncs verts
14+found=12 en continu jusqu'au 2026-10-22 21:37 EDT, puis UN SEUL échec à
15+00:47 « 404 Not Found » sur l'endpoint job-requisitions de
16+workforcenow.adp.com — fenêtre SYSTÉMIQUE 00:35→01:54 EDT touchant 6
17+tenants ADP (richelieu, strathmore, triple_boris, uniboard, uv_assurance,
18+abritek), même mécanique que les maintenances ADP des 28-30 août (c7d9ece)
19+mais signature 404 au lieu du 302 sorry.adp.com / 200 non-JSON. Historique :
20+mêmes blips ADP les 29-30 août (verdicts rien_a_faire).
21+
22+Chronologie (mission ka6 2026-10-31) : 6e tenant ADP de l'app touché par le
23+frontal intermittent PAR CID (même panne que bento_sushi 64f53c8f, cookit
24+7873198d, mitsubishi_hc_capital du 2026-10-26, niobec 61a2ddf8 et
25+osgoode_properties 3b95c432 de la veille — pool backend malade côté ADP,
26+« default backend - 404 » nginx). Vert found=14 en continu jusqu'à 21:41
27+EDT le 30/10, puis 404 franc sur la liste fr_CA à 00:02 ET 03:23 (épisode
28+nocturne multi-tenants 23:45→04:42 : nemaska_lithium, niobec,
29+osgoode_properties, strathmore, canadian_royalties touchés dans la même
30+fenêtre) — 2 échecs consécutifs → stale. Sonde live 05:0x : sur 6 essais
31+sur la MÊME URL liste à la même minute, 5 × 200 JSON (totalNumber=14 = la
32+médiane) et 1 × « default backend - 404 » de 21 octets — intermittence,
33+tenant VIVANT, aucune migration. Garde-fou répliqué des cinq frères :
34+`_get_json` retente jusqu'à 30 fois (pause 2 s) sur
35+404/502/503/504/timeout/non-JSON, timeout abaissé 30→15 s pour borner les
36+connexions qui pendent. Dormant dès que le frontal est sain (1er essai OK =
37+zéro surcoût) ; un sync vert ne coûte qu'UN appel liste (détails en cache
38+BD). NE PAS retirer ce garde-fou si un futur scan le croise : il est inerte
39+hors panne.
40+"""
41+from __future__ import annotations
42+
43+import time
44+
45+import requests
46+
23 from .adp import ADPWorkforceNowConnector 47 from .adp import ADPWorkforceNowConnector
24 48
25 49
@@ -28,3 +52,34 @@ class UvAssuranceConnector(ADPWorkforceNowConnector):
28 EMPLOYER = "UV Assurance" 52 EMPLOYER = "UV Assurance"
29 CID = "8490e9be-ab98-497a-8fe6-389917643673" 53 CID = "8490e9be-ab98-497a-8fe6-389917643673"
30 CCID = "19000101_000001" 54 CCID = "19000101_000001"
55+
56+ # Frontal ADP intermittent pour CE tenant (2026-10-31) : mêmes bornes que
57+ # bento_sushi/cookit/mitsubishi_hc_capital/niobec/osgoode_properties —
58+ # les 404 échouent vite (<1 s), le timeout court borne les connexions qui
59+ # pendent, et un sync vert ne coûte qu'UN appel liste (détails en cache
60+ # BD).
61+ timeout = 15
62+ _FLAKY_TRIES = 30
63+ _FLAKY_PAUSE = 2.0
64+
65+ def _get_json(self, url: str, params: dict) -> dict:
66+ last: Exception | None = None
67+ for attempt in range(self._FLAKY_TRIES):
68+ if attempt:
69+ time.sleep(self._FLAKY_PAUSE)
70+ try:
71+ return super()._get_json(url, params)
72+ except requests.HTTPError as exc:
73+ status = getattr(exc.response, "status_code", None)
74+ if status not in (404, 502, 503, 504):
75+ raise
76+ last = exc
77+ except (requests.Timeout, requests.ConnectionError) as exc:
78+ last = exc
79+ except RuntimeError as exc:
80+ # « ADP non-JSON après 3 essais » de la classe de base :
81+ # même frontal malade, même traitement.
82+ if not str(exc).startswith("ADP non-JSON"):
83+ raise
84+ last = exc
85+ raise last
31 86
Menu

Theme