…
Backend (enrichissement central via finalize() -> tous les connecteurs) :
- normalize.py : extract_requirements() (années d'expérience, scolarité,
langues exigées, FR/EN, bornes de plausibilité), parse_seniority()
(stage/junior/intermédiaire/senior/direction : titre, libellés ATS,
années d'expérience), en-têtes d'avantages élargis
- schema.py : champ seniority + branchement des extracteurs (setdefault,
jamais d'écrasement des valeurs ATS)
- db.py : colonne seniority (migration auto) dans insert/update
- web.py : filtre + facette séniorité, salary_context (médiane/quartiles
de la catégorie + écart % de l'offre, cache 10 min), employer_jobs,
median_salary_year dans /api/stats
- scripts/backfill_enrich.py : backfill exécuté — 23 680 offres scannées,
16 606 exigences ajoutées (26 % -> 77 %), 10 966 séniorités (0 -> 46 %)
- tests/test_enrich.py : 27 nouveaux tests (101 au total, tous verts)
Frontend (display + métriques claires) :
- JobCard : badge Nouveau (≤3 j), salaire avec équivalent annuel, badges
séniorité/exigences/bilingue, pied fraîcheur · avantages · plateforme
- Fiche : panneau « En un coup d'œil » (salaire vs marché avec barre
interquartile P25-P75, expérience, scolarité, langues, fraîcheur, date
limite), volume d'offres de l'employeur, historique du salaire affiché
- Accueil : filtre séniorité ; api.ts : types + helpers (compactMoney,
yearlyEquiv, daysSince)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>