[ka6] connecteur nortekinc: broken = fenêtre de maintenance planifiée Workday (systémique, terminée) — rien à réparer côté flux, sync rejoué found=4 = médiane 4.0 + artefact vague C corrigé (url vide → nortekair.com). Broken = faux positif: 3 syncs ok=0 « Workday en maintenance planifiée » (00:20, 02:21 et 07:09 le 2026-10-17) après dernier sync vert 22:01 la veille found=4, même fenêtre que puma/valmet/quadreal, détection maintenance de workday.py a proprement nommé la cause, AUCUN retrait. Fenêtre terminée à la mission (09:17): board live 200, 41 postes, sync isolé rejoué found=4 = médiane en 5,2 s, 4 offres QC actives (Montréal/St-Léonard-d'Aston/Québec x2) miss_count=0. Pas de migration: nortekair.com/careers (200) référence toujours myworkdayjobs.com/en-US/NortekAirSolutions. Artefact vague C: url vide dans sources.json → https://www.nortekair.com (200 vérifié live; nortekinc.com ne répond plus, marque opérante = Nortek Air Solutions). Docstring chronologie 1re intervention, fiches nortekinc.md/INDEX.md régénérées. 107 tests verts, pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200.
4 changed files +36 −12
modified
data/sources.json
+1 −1
@@ -11520,7 +11520,7 @@ | |||||
| 11520 | { | 11520 | { | ||
| 11521 | "id": "nortekinc", | 11521 | "id": "nortekinc", | ||
| 11522 | "name": "Nortekinc", | 11522 | "name": "Nortekinc", | ||
| 11523 | − "url": "", | 11523 | + "url": "https://www.nortekair.com", | ||
| 11524 | "careers_url": "https://nortekinc.wd503.myworkdayjobs.com/NortekAirSolutions", | 11524 | "careers_url": "https://nortekinc.wd503.myworkdayjobs.com/NortekAirSolutions", | ||
| 11525 | "sectors": [ | 11525 | "sectors": [ | ||
| 11526 | "TI", | 11526 | "TI", | ||
modified
docs/connecteurs/INDEX.md
+3 −3
@@ -5,14 +5,14 @@ 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-17 09:04 EDT par scripts/gen_connector_docs.py — NE PAS ÉDITER, | 8 | +Généré : 2026-10-17 09:19 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-17 09:04 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-17 09:19 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 | **1104 employeurs directs** connectés via **25 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **25566 offres actives** (23016 directes, 2550 portails ; 116 masquées comme doublons inter-sources, soit 25450 visibles). 1134 fiches. | 17 | **1104 employeurs directs** connectés via **25 plateformes ATS** + **3 portails agrégateurs** + le canal de **dépôt direct** — **25566 offres actives** (23016 directes, 2550 portails ; 116 masquées comme doublons inter-sources, soit 25450 visibles). 1134 fiches. | ||
| 18 | 18 | ||||
@@ -688,7 +688,7 @@ Conformité : voir [`docs/CONFORMITE.md`](../CONFORMITE.md). Chaque offre conser | |||||
| 688 | | [Msd](msd.md) | [`workday`](ats-workday.md) | 4 | 100 % | 100 % | ✅ | | 688 | | [Msd](msd.md) | [`workday`](ats-workday.md) | 4 | 100 % | 100 % | ✅ | | ||
| 689 | | [Nmédia](nmdia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | | 689 | | [Nmédia](nmdia.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 0 % | 100 % | ✅ | | ||
| 690 | | [Norbert Health](norbert_health.md) | [`breezy`](ats-breezy.md) | 4 | 0 % | 100 % | ✅ | | 690 | | [Norbert Health](norbert_health.md) | [`breezy`](ats-breezy.md) | 4 | 0 % | 100 % | ✅ | | ||
| 691 | −| [Nortekinc](nortekinc.md) | [`workday`](ats-workday.md) | 4 | 25 % | 100 % | ❌ | | 691 | +| [Nortekinc](nortekinc.md) | [`workday`](ats-workday.md) | 4 | 25 % | 100 % | ✅ | | ||
| 692 | | [Nssl](nssl.md) | [`dayforce`](ats-dayforce.md) | 4 | 0 % | 100 % | ✅ | | 692 | | [Nssl](nssl.md) | [`dayforce`](ats-dayforce.md) | 4 | 0 % | 100 % | ✅ | | ||
| 693 | | [Nuvei](nuvei.md) | [`workable`](ats-workable.md) | 4 | 0 % | 100 % | ✅ | | 693 | | [Nuvei](nuvei.md) | [`workable`](ats-workable.md) | 4 | 0 % | 100 % | ✅ | | ||
| 694 | | [O-I](o_i.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 25 % | 100 % | ✅ | | 694 | | [O-I](o_i.md) | [`smartrecruiters`](ats-smartrecruiters.md) | 4 | 25 % | 100 % | ✅ | | ||
modified
docs/connecteurs/nortekinc.md
+12 −7
@@ -5,7 +5,7 @@ Auteur : Simon-Pierre Boucher | |||||
| 5 | Contact : contact@spboucher.ai | 5 | Contact : contact@spboucher.ai | ||
| 6 | Fichier : docs/connecteurs/nortekinc.md | 6 | Fichier : docs/connecteurs/nortekinc.md | ||
| 7 | Rôle : Fiche connecteur — Nortekinc (employeur direct, ATS workday) | 7 | Rôle : Fiche connecteur — Nortekinc (employeur direct, ATS workday) | ||
| 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-17 09:19 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 | --> | ||
@@ -16,7 +16,7 @@ Généré : 2026-10-14 18:40 EDT par scripts/gen_connector_docs.py — NE PAS | |||||
| 16 | 16 | ||||
| 17 | ## Description | 17 | ## Description | ||
| 18 | 18 | ||||
| 19 | −- **Site** : [Nortekinc]() | 19 | +- **Site** : [Nortekinc](https://www.nortekair.com) | ||
| 20 | - **Page carrières** : https://nortekinc.wd503.myworkdayjobs.com/NortekAirSolutions | 20 | - **Page carrières** : https://nortekinc.wd503.myworkdayjobs.com/NortekAirSolutions | ||
| 21 | - **Secteurs** : TI, Services | 21 | - **Secteurs** : TI, Services | ||
| 22 | - **Région** : Montréal | 22 | - **Région** : Montréal | ||
@@ -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 **4 offres actives** de la source (base live, 2026-10-14 18:40 EDT). | 41 | +Complétude mesurée sur les **4 offres actives** de la source (base live, 2026-10-17 09:19 EDT). | ||
| 42 | 42 | ||||
| 43 | | Champ (`jobs.*`) | Rôle | Complétude | | 43 | | Champ (`jobs.*`) | Rôle | Complétude | | ||
| 44 | |---|---|---| | 44 | |---|---|---| | ||
@@ -79,19 +79,24 @@ Exemple réel : *Assembleur 1 - Fin de semaine* — Montréal · Un salaire de d | |||||
| 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-17 09:19 EDT dans `data/jobka.db`)* | ||
| 83 | 83 | ||||
| 84 | - **Offres en base** : 21 (dont **4 actives**, 0 masquées comme doublons `dup_of`) | 84 | - **Offres en base** : 21 (dont **4 actives**, 0 masquées comme doublons `dup_of`) | ||
| 85 | - **Salaire** : 1/4 actives (25 %) | 85 | - **Salaire** : 1/4 actives (25 %) | ||
| 86 | - **GPS** : 4/4 actives (100 %) | 86 | - **GPS** : 4/4 actives (100 %) | ||
| 87 | - **Mode** : 0/4 actives (0 %) | 87 | - **Mode** : 0/4 actives (0 %) | ||
| 88 | - **Parution** : 4/4 actives (100 %) | 88 | - **Parution** : 4/4 actives (100 %) | ||
| 89 | −- **Dernier sync** : 2026-10-14 15:45 — trouvées 4, +0, ~0, -0 | 89 | +- **Dernier sync** : 2026-10-17 09:18 — trouvées 4, +0, ~2, -0 | ||
| 90 | −- **Syncs enregistrés** (`sync_log`) : 473 | 90 | +- **Syncs enregistrés** (`sync_log`) : 496 | ||
| 91 | 91 | ||||
| 92 | ## Erreurs & dépannage | 92 | ## Erreurs & dépannage | ||
| 93 | 93 | ||||
| 94 | −Aucune erreur dans `sync_log` pour cette source. | 94 | +Erreurs relevées dans `sync_log` : | ||
| 95 | + | ||||
| 96 | +| Erreur | Occurrences | Dernière fois | | ||||
| 97 | +|---|---|---| | ||||
| 98 | +| Workday en maintenance planifiée (redirigé vers https://community.workday.com/maintenance-… | 2 | 2026-10-17 07:09 | | ||||
| 99 | +| Workday en maintenance planifiée (redirigé vers https://static.community.workday.com/maint… | 1 | 2026-10-17 02:21 | | ||||
| 95 | 100 | ||||
| 96 | - Rejouer un sync isolé : `.venv/bin/python run.py sync nortekinc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='nortekinc' ORDER BY ts DESC LIMIT 5;"` | 101 | - Rejouer un sync isolé : `.venv/bin/python run.py sync nortekinc` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='nortekinc' ORDER BY ts DESC LIMIT 5;"` | ||
| 97 | - Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`. | 102 | - Garde-fous : une source qui retourne ≤ 25 % de sa médiane historique déclenche une alerte et les retraits sont suspendus ; une offre doit manquer 2 syncs consécutifs avant `active=0`. | ||
modified
jobka/connectors/nortekinc.py
+20 −1
@@ -5,11 +5,30 @@ | |||||
| 5 | # Fichier : jobka/connectors/nortekinc.py | 5 | # Fichier : jobka/connectors/nortekinc.py | ||
| 6 | # Rôle : Connecteur Nortekinc — workday (tenant nortekinc.wd503, site NortekAirSolutions) | 6 | # Rôle : Connecteur Nortekinc — workday (tenant nortekinc.wd503, site NortekAirSolutions) | ||
| 7 | # [généré par scripts/gen_connectors.py, flux vérifié le 2026-08-23] | 7 | # [généré par scripts/gen_connectors.py, flux vérifié le 2026-08-23] | ||
| 8 | −# Créé : 2026-08-23 Modifié : 2026-08-23 | 8 | +# Créé : 2026-08-23 Modifié : 2026-10-17 | ||
| 9 | # ============================================================================= | 9 | # ============================================================================= | ||
| 10 | from .workday import WorkdayConnector | 10 | from .workday import WorkdayConnector | ||
| 11 | 11 | ||||
| 12 | 12 | ||||
| 13 | +# Chronologie des interventions | ||||
| 14 | +# ----------------------------- | ||||
| 15 | +# 2026-10-17 (ka6, 1re intervention) — « broken » = fenêtre de maintenance | ||||
| 16 | +# PLANIFIÉE Workday (POST cxs redirigé vers community.workday.com/ | ||||
| 17 | +# maintenance-page), systémique : 3 syncs ok=0 « maintenance planifiée » | ||||
| 18 | +# à 00:20, 02:21 et 07:09 le 2026-10-17, même fenêtre que puma/valmet/ | ||||
| 19 | +# quadreal (~20 tenants Workday du repo). Dernier sync vert la veille | ||||
| 20 | +# 22:01 found=4 = médiane 4.0, AUCUN retrait. Fenêtre TERMINÉE au moment | ||||
| 21 | +# de la mission (09:17) : board live 200 avec 41 postes, sync rejoué | ||||
| 22 | +# found=4 = médiane en 5,2 s, 4 offres QC actives (Montréal, | ||||
| 23 | +# St-Léonard-d'Aston, Québec x2) miss_count=0. Rien à réparer côté flux. | ||||
| 24 | +# Pas de migration : nortekair.com/careers (200) référence toujours | ||||
| 25 | +# myworkdayjobs.com/en-US/NortekAirSolutions. Seul correctif : artefact | ||||
| 26 | +# vague C « url vide » dans data/sources.json -> https://www.nortekair.com | ||||
| 27 | +# (200 vérifié live ; nortekinc.com ne répond plus — Nortek Inc. absorbée | ||||
| 28 | +# par Madison Industries, la marque opérante est Nortek Air Solutions). | ||||
| 29 | +# Ne pas diagnostiquer tenant par tenant pendant ces fenêtres : repart seul. | ||||
| 30 | + | ||||
| 31 | + | ||||
| 13 | class NortekincConnector(WorkdayConnector): | 32 | class NortekincConnector(WorkdayConnector): | ||
| 14 | source_id = 'nortekinc' | 33 | source_id = 'nortekinc' | ||
| 15 | EMPLOYER = 'Nortekinc' | 34 | EMPLOYER = 'Nortekinc' | ||
| 16 | 35 | ||||