# Ciena (`ciena`) **Employeur direct** · Plateforme ATS : [`workday`](ats-workday.md) · Statut registre : actif · Connecteur : `jobka/connectors/ciena.py` ## Description - **Site** : [Ciena]() - **Page carrières** : https://ciena.wd5.myworkdayjobs.com/Careers - **Secteurs** : Télécommunications, TI - **Région** : Québec - Offres marquées **« Offre directe »** dans l'app (badge) : la candidature se fait chez l'employeur, jamais via un intermédiaire. ## Accès - **Mécanique** : voir la fiche plateforme [`ats-workday.md`](ats-workday.md) — API JSON publique du site carrières, backend `requests` direct (Scrapfly seulement si indiqué sur la fiche plateforme). - **Identifiants du tenant** (attributs du connecteur) : | Attribut | Valeur | |---|---| | `EMPLOYER` | `Ciena` | | `HOST` | `wd5` | | `SITE` | `Careers` | | `TENANT` | `ciena` | - **Throttle** : 0.7 s entre requêtes. - **Filtre Québec** : seuls les postes localisés au Québec sont conservés (facette serveur quand l'ATS en offre une, sinon `is_quebec_location` côté client). ## Champs → schéma Complétude mesurée sur les **5 offres actives** de la source (base live, 2026-09-21 18:06 EDT). | Champ (`jobs.*`) | Rôle | Complétude | |---|---|---| | `title` — Titre | titre du poste | 100 % | | `employer` — Employeur | nom de l'entreprise | 100 % | | `url` — URL | lien direct vers l'offre originale | 100 % | | `description` — Description | texte complet (HTML nettoyé) | 100 % | | `city` — Ville | municipalité normalisée | 60 % | | `region` — Région | région administrative | 60 % | | `address` — Adresse | adresse du lieu de travail | 0 % | | `postal_code` — Code postal | code postal si publié | 0 % | | `work_mode` — Mode | presentiel / hybride / teletravail | 80 % | | `employment_type` — Type | temps_plein / temps_partiel / … | 100 % | | `salary` — Salaire ($) | bornes numériques normalisées $/h et $/an | 40 % | | `salary_label` — Libellé salaire | texte salarial original | 40 % | | `benefits` — Avantages | avantages sociaux publiés (JSON) | 0 % | | `requirements` — Exigences | scolarité, expérience, langues (JSON) | 100 % | | `date_posted` — Date de parution | ISO 8601 | 100 % | | `date_deadline` — Date limite | date limite pour postuler | 0 % | | `category` — Catégorie | taxonomie interne (TI, Santé, …) | 80 % | | `language` — Langue | fr / en / bilingue (source ou heuristique) | 100 % | | `company_logo` — Logo employeur | URL du logo si exposé par la source | 0 % | | `apply_url` — Candidature | lien de candidature directe | 100 % | | `gps` — GPS | lat/lng (géocodage sans invention) | 60 % | Exemple réel : *NPI Test Engineer* — Montréal · Pay range $91,800 - $146,600 CAD · parue le 2026-09-17. ## Fréquence & budgets - **Cadence** : resynchronisation **horaire** (PM2 `job-ka-sync` = `run.py watch 60`), suivie du géocodage en lot puis de la déduplication inter-sources. - **Throttle** : 0.7 s minimum entre deux requêtes vers la source (`request_delay`). - **Budgets / plafonds (variables d'environnement)** : | Variable | Défaut | |---|---| | `JOBKA_WORKDAY_DETAIL_LIMIT` | `300` | - Cache BD des pages détail (`detail_cache`) : le détail d'une offre n'est re-téléchargé que si sa ligne de liste change. ## Volumétrie & complétude live *(mesuré le 2026-09-21 18:06 EDT dans `data/jobka.db`)* - **Offres en base** : 8 (dont **5 actives**, 0 masquées comme doublons `dup_of`) - **Salaire** : 2/5 actives (40 %) - **GPS** : 3/5 actives (60 %) - **Mode** : 4/5 actives (80 %) - **Parution** : 5/5 actives (100 %) - **Dernier sync** : 2026-09-21 16:48 — trouvées 5, +0, ~0, -0 - **Syncs enregistrés** (`sync_log`) : 267 ## Erreurs & dépannage Erreurs relevées dans `sync_log` : | Erreur | Occurrences | Dernière fois | |---|---|---| | Workday non-JSON après 3 essais (HTTP 200, text/html) : Expecting value: line 1 column 1 (… | 2 | 2026-09-19 03:21 | | 502 Server Error: Bad Gateway for url: https://ciena.wd5.myworkdayjobs.com/wday/cxs/ciena/… | 11 | 2026-08-29 10:30 | | Expecting value: line 1 column 1 (char 0) | 1 | 2026-08-29 03:23 | - Rejouer un sync isolé : `.venv/bin/python run.py sync ciena` puis inspecter `sync_log` : `sqlite3 data/jobka.db "SELECT * FROM sync_log WHERE source='ciena' ORDER BY ts DESC LIMIT 5;"` - 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`. ## Licence / conformité **Flux public du site carrières officiel de l'employeur** (API JSON de l'ATS ou HTML rendu serveur) — le même contenu que la page carrière affiche publiquement, prévu pour la diffusion des offres, sans authentification. Chaque offre conserve son URL originale et le bouton « Postuler chez Ciena » renvoie chez l'employeur. Aucune donnée personnelle de candidat n'est collectée. User-Agent identifié `JobKaBot/1.0 (+https://www.job-ka.com; contact@spboucher.ai)` sur les accès directs ; requêtes throttlées et plafonnées par budgets. ## Historique **Mission connecteurs du 2026-08-18** — passage de 135 à 217 employeurs directs connectés, de 9 à 17 plateformes ATS, ajout de 3 portails agrégateurs et du canal de dépôt direct : - `fd4bfc8` qualité lieux : rejet des villes hors Québec, bâtiments McGill → Montréal ; - `5a66f48` +59 employeurs (sondage massif d'ATS + détection de pages carrières) ; - `4917d57` 8 nouveaux ATS (Taleo, Njoyn, UltiPro, iCIMS, SuccessFactors, ADP WFN, Digital Recruiters, Workland) + 23 employeurs publics/parapublics ; - `f6e7571` portails Guichet-Emplois, Jobillico, Espresso-Jobs — l'offre directe gagne toujours la canonique (dédup) ; - `744cbfc` badge « Offre directe », stats directes/portails, dépôt direct employeurs ; - `1604ff9` reprise sur coupure WAF Guichet-Emplois (retry + acquis partiel). Commits touchant `jobka/connectors/ciena.py` : - `ae44d7c` 2026-08-29 [ka6] fix connecteur ciena: repli « détail seulement » pendant la panne d'index Workday du tenant — l'endpoint liste POST /wday/cxs/ciena/Careers/jobs renvoie 502 backend (errorCaseId Workday) pour tout le monde depuis ~12:39 EDT le 2026-08-28 (reconfirmé le 2026-08-29 depuis le nœud, via proxy résidentiel CA Oxylabs et en navigateur réel : le board React rend une page vide), MAIS l'API détail GET /wday/cxs/ciena/Careers/job/ répond 200 avec données complètes et ciena.com/careers pointe toujours vers ce board (pas de migration). Le connecteur revalide donc les offres actives connues en base via l'API détail quand la liste échoue en 5xx : 404/posted=false = offre retirée, aucune donnée inventée (tout vient du jobPostingInfo live), et si RIEN n'est validable l'erreur d'origine est propagée (sync en échec, inventaire préservé). Dès que l'index Workday revient, le chemin liste normal reprend seul. Test réel : run.py sync ciena → ok, found=7 (= médiane 7.0), updated=5, removed=0, 7 actives en base. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200. - `dab8068` 2026-08-29 Revert "[ka6] fix connecteur ciena: panne PARTIELLE côté Workday (tenant ciena.wd5 uniquement) — l'endpoint liste POST /wday/cxs/ciena/Careers/jobs renvoie 502 avec errorCaseId Workday depuis ~12:39 EDT le 2026-08-28, pour TOUT LE MONDE : vérifié depuis le nœud ET via proxy résidentiel canadien Oxylabs (502 identique, errorCaseId différent = vraie erreur backend), toutes variantes de body/locale/en-têtes testées (GET=400, POST=502). Le reste du tenant est SAIN : board 200, API détail /job/R031484 200 avec données complètes, tenant/siteId inchangés (ciena/Careers dans le HTML), autres tenants wd5 (vfc, dupont, fiserv) 200 depuis ce nœud = ni blocage IP ni panne wd5 globale. Pas de migration d'ATS : ciena.com/careers (403 direct, contourné via Scrapfly) pointe toujours vers ciena.wd5.myworkdayjobs.com/Careers ; l'API legacy refreshFacet répond mais vide (même index de recherche en panne). AUCUN bug dans le connecteur ni changement de code : panne externe transitoire, le cycle horaire de job-ka-sync reprendra seul à la fin de la panne Workday. Les 7 offres actives (médiane 7.0) sont préservées en base — un sync en échec ne purge rien. Sync isolé rejoué pour trace (502 reproduit via le connecteur réel, actives=7 après). Note de contexte ajoutée au connecteur. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200." - `4faea71` 2026-08-28 [ka6] fix connecteur ciena: panne PARTIELLE côté Workday (tenant ciena.wd5 uniquement) — l'endpoint liste POST /wday/cxs/ciena/Careers/jobs renvoie 502 avec errorCaseId Workday depuis ~12:39 EDT le 2026-08-28, pour TOUT LE MONDE : vérifié depuis le nœud ET via proxy résidentiel canadien Oxylabs (502 identique, errorCaseId différent = vraie erreur backend), toutes variantes de body/locale/en-têtes testées (GET=400, POST=502). Le reste du tenant est SAIN : board 200, API détail /job/R031484 200 avec données complètes, tenant/siteId inchangés (ciena/Careers dans le HTML), autres tenants wd5 (vfc, dupont, fiserv) 200 depuis ce nœud = ni blocage IP ni panne wd5 globale. Pas de migration d'ATS : ciena.com/careers (403 direct, contourné via Scrapfly) pointe toujours vers ciena.wd5.myworkdayjobs.com/Careers ; l'API legacy refreshFacet répond mais vide (même index de recherche en panne). AUCUN bug dans le connecteur ni changement de code : panne externe transitoire, le cycle horaire de job-ka-sync reprendra seul à la fin de la panne Workday. Les 7 offres actives (médiane 7.0) sont préservées en base — un sync en échec ne purge rien. Sync isolé rejoué pour trace (502 reproduit via le connecteur réel, actives=7 après). Note de contexte ajoutée au connecteur. pm2 restart job-ka-sync OK, site local 200, www.job-ka.com 200. - `c45c753` 2026-08-23 Vague C — +620 connecteurs employeurs directs (350 -> 968)