-
-
Notifications
You must be signed in to change notification settings - Fork 1
Plan Jobsuche
Issue-Level-Detail zu Cluster B aus dem Master-Plan. Stand: 2026-06-10 (beta.101).
| Nr | Funktion | Issue | Beta | Code |
|---|---|---|---|---|
| B19/B20 | MINUS-Keywords: weiche Score-Abwertung (keywords_minus, Schema v45) + gewichtung_minus-Slider — Backend + Frontend |
#667 | 84/89 |
tools/suche.py, services/scoring_service.py, ProfilePage.jsx
|
| B22 | Duplikat-Erkennung verfeinert: Titel-Aehnlichkeit (0.5 / 0.85 bei abw. URL) statt Firma+Keyword, Domain-Keyword nur Bonus, force=true-Override |
#670 | 87 |
duplicate_detection.py, tools/jobs.py
|
| B21 | Pro-Scraper-Timeout + Auto-Skip defekter Quellen im Job-Runner. beta.101: Phase-1 via as_completed + globales Phasen-Budget — kein 0%-Haenger mehr |
#668 | 85/101 |
job_runner / services/scraper_health.py
|
| B23 | Interne Jobsuche nach Zeitplan | #678 | 94 | services/automatik_scheduler.py |
| B24 | Snapshot-Nachhol-Trigger (Tagesroutine) | #688 | offen (Stub) | — |
| Sub | Funktion | Issue | Code | Tests | Status |
|---|---|---|---|---|---|
| B1.1 |
JobSourceAdapter-Basisklasse + AdapterResult + AdapterStatus-Enum |
#499 | job_scraper/adapters/base.py |
tests/test_scraper_adapter_v2.py |
✅ |
| B1.2 |
LegacyScraperAdapter wraps existing search_*-Funktionen |
#499 | job_scraper/adapters/legacy_adapter.py |
dito | ✅ |
| B1.3 |
Orchestrator.run_adapters() mit Fehler-Isolation |
#499 | job_scraper/adapters/orchestrator.py |
dito | ✅ |
| B1.4 |
JobPosting-Dataclass mit to_job_dict() / from_job_dict()
|
#499 | job_scraper/adapters/base.py |
dito | ✅ |
| B1.5 | Spezial-Adapter (Bundesagentur, Hays, JobSpy, Google Jobs) | #499 | job_scraper/adapters/*_adapter.py |
dito | ✅ |
Status per Quelle (Stand 2026-06 aus scraper_diagnose):
| Quelle | Code | Letzter Erfolg | Erfolgsrate | Status |
|---|---|---|---|---|
| arbeitnow | arbeitnow.py |
2026-05-30 | 100% | ✅ |
| bundesagentur | bundesagentur.py |
2026-05-30 | 83% | ✅ |
| greenhouse | greenhouse.py |
2026-05-30 | 89% | ✅ |
| hays |
hays.py + adapters/hays_adapter.py
|
2026-05-30 | 100% | ✅ |
| jobspy_indeed | jobspy_source.py |
2026-05-30 | 80% | ✅ |
| stellenanzeigen_de | stellenanzeigen_de.py |
2026-05-30 | 85% | ✅ |
| arbeitnow / remoteok / remotive / himalayas |
remoteok.py, remotive.py, himalayas.py, arbeitnow.py
|
— | — | ✅ |
| workable | workable.py |
— | — | ✅ |
| personio | personio.py |
— | — | ✅ |
| workday_dax | workday_dax.py |
— | — | ✅ |
| berufsstart / studentjob / praktikum_de | dito | — | — | ✅ |
| ferchau | ferchau.py |
2026-04-23 | 17% | |
| gulp | gulp.py |
2026-04-23 | 17% | |
| heise_jobs | heise_jobs.py |
2026-04-23 | 18% | |
| ingenieur_de | ingenieur_de.py |
2026-04-23 | 18% | |
| kimeta | kimeta.py |
2026-04-23 | 17% | |
| monster | monster.py |
nie | 0% | |
| solcom | solcom.py |
2026-04-23 | 18% | |
| stepstone | stepstone.py |
2026-04-23 | 0% | |
| jobspy_linkedin | jobspy_source.py |
nie | 0% | |
| indeed | indeed.py |
nie | 0% | |
| freelancermap | freelancermap.py |
2026-05-05 | 33% | |
| google_jobs | google_jobs.py |
nie | 0% | ⛔ silent |
| jobspy_glassdoor | — | nie | 0% | ⛔ auto-deaktiviert (5+ silent) |
| jobspy_google | — | nie | 0% | ⛔ auto-deaktiviert (5+ silent) |
| jobware | jobware.py |
2026-04-23 | 15% | ⛔ auto-deaktiviert |
| freelance_de | freelance_de.py |
— | 0% | ⛔ deprecated |
linkedin.py |
2026-04-23 | 0% | ⛔ deprecated (Bot-Wall, #159) | |
xing.py |
2026-04-23 | 0% | ⛔ deprecated (Bot-Wall) | |
| meinestadt | meinestadt.py |
— | — | ✅ |
Effektiv 6 voll-produktive Quellen plus die Remote-Boards (selten getriggert). Roadmap: 7 defekte reanimieren oder durch Plugin-Plattform (J1) ersetzen.
| Sub | Funktion | Issue | Code | Status |
|---|---|---|---|---|
| B3.1 |
scraper_health-Table + update_scraper_health()
|
#432 | database.py |
✅ |
| B3.2 | Backoff-Logik 24h/48h/72h/168h | #432 | database.py |
✅ |
| B3.3 | Auto-Reactivate bei OK-Run (Counter-Reset) | #432, #590 | database.py |
✅ |
| B3.4 | Defekt-Markierung (letzter_status_detail mit Grund + Datum) |
— | job_scraper/health.py |
✅ |
| B3.5 | UI-Anzeige als "ausgegraut sichtbar" statt heimliches Entfernen | — | Frontend | ✅ |
| Sub | Funktion | Issue | Code | Status |
|---|---|---|---|---|
| B4.1 | Pro Quelle ein minimaler HTTP-Probe | #624 | tools/jobs.py |
✅ |
| B4.2 | Parallel via Threads | #624 | dito | ✅ |
| B4.3 | Liefert reachable / http_status / latency_ms / error
|
#624 | dito | ✅ |
| B4.4 | Probe-URLs aktualisieren — Bundesagentur 403, Workday/Workable/Personio/Berufsstart/Studentjob/Praktikum alle 404 obwohl Production-Scraper laeuft. Probe-Endpoint-Inventar pflegen. | — | dito | ⬜ |
| Sub | Funktion | Issue | Code | Status |
|---|---|---|---|---|
| B5.1 |
services/profile_classifier.py mit 9 Cluster-Heuristik |
#590 | dito | ✅ |
| B5.2 | Cluster-zu-Quellen-Mapping (5 Empfehlungen pro Cluster) | #590 | dito | ✅ |
| B5.3 | UI-Recommendations-Panel | #590 | Frontend | ✅ |
| Sub | Funktion | Issue | Code | Status |
|---|---|---|---|---|
| B6.1 |
workday_dax.py mit Multi-Tenant-Iteration |
#590 | dito | ✅ |
| B6.2 | DAX-40-Tenant-Liste (SAP, BMW, Siemens, Bayer, ...) | #590 | dito | ✅ |
| Sub | Funktion | Issue | Code | Status |
|---|---|---|---|---|
| B7.1 | Multi-Suchprofil-Verwaltung (PLM/Tech-Senior/Freelance ...) | #564 | tools/profil.py |
✅ |
| B7.2 | Portal-spezifische Such-Profile (LinkedIn-Lessons aus Bot-Wall-Erfahrung) | #564 | dito | ✅ |
| Sub | Funktion | Issue | Code | Status |
|---|---|---|---|---|
| B8.1 | 6-Kriterien-Score (Skills/Erfahrung/Branche/Standort/Gehalt/Modell) | mehrere | services/scoring_service.py |
✅ |
| B8.2 | Gewichtungen ueber scoring_konfigurieren
|
— | dito | ✅ |
| B8.3 | Live-Recompute bei Profil-Aenderungen via scores_neu_berechnen
|
#539 | dito | ✅ |
| B8.4 | Score-Hinweis "basiert nur auf Titel" bei fehlender Beschreibung | — | tools/analyse.py |
✅ |
| Sub | Funktion | Issue | Code | Tests | Status |
|---|---|---|---|---|---|
| B9.1 | XING _process_raw_job URL-Fallback-Kaskade |
#645 | job_scraper/xing.py |
tests/test_v17_url_regression_645.py |
✅ |
| B9.2 | Stepstone URL-Fallback-Kaskade + Relative-Absolutierung | #645 | job_scraper/stepstone.py |
dito | ✅ |
| B9.3 |
is_search_url-Flag im DB-Schema |
#436 | database.py |
dito | ✅ |
| B9.4 |
is_search_result_url() Helper mit 17 Erkennungs-Mustern |
#436 | job_scraper/__init__.py |
dito | ✅ |
| B9.5 |
stelle_bearbeiten(url=...) Backfill |
#645 | tools/jobs.py |
dito | ✅ |
| B9.6 | Hard-Guard in save_jobs gegen leere URLs |
#645 | database.py |
dito | ✅ |
| Sub | Funktion | Issue | Code | Status |
|---|---|---|---|---|
| B10.1 |
_run_auto_refetch_descriptions Auto-Engine-Step |
#622 | dashboard.py |
✅ |
| B10.2 | Max 8 Stellen/Lauf | #622 | dito | ✅ |
| B10.3 | Backoff bei 3 Fehlversuchen (Setting refetch_fail:{hash}) |
#622 | dito | ✅ |
| B10.4 | Skip is_search_url-Stellen (sonst Anriss der Suchseite) | #645 | dito | ✅ |
| B10.5 | MCP-Tool stellenbeschreibung_nachladen mit klaren Fehler-Pfaden |
#622, #645 | tools/jobs.py |
✅ |
| B10.6 |
fetch_description_from_detail mit JSON-LD-Extraction |
#624 | job_scraper/__init__.py |
✅ |
| Sub | Funktion | Issue | Code | Tests | Status |
|---|---|---|---|---|---|
| B11.1 |
services/url_health.py Pure-Python-Modul |
#645 | dito |
tests/test_v17_url_health_645.py (18 Tests) |
✅ |
| B11.2 |
_run_url_aging_check Auto-Engine-Step |
#645 | dashboard.py |
— | ✅ |
| B11.3 | 24h-Backoff pro OK-Check (Setting url_aging_lastok:{hash}) |
#645 | dashboard.py |
— | ✅ |
| B11.4 | Workday-SPA-Sonderbehandlung (JSON-API-Cross-Check) | #645 | services/url_health.py |
tests | ✅ |
| B11.5 | Title-Token-Match fuer statisches HTML | #645 | dito | tests | ✅ |
| B11.6 | 17 lokalisierte Expired-Marker (DE+EN) | #645 | dito | tests | ✅ |
| B11.7 | Elwosa-Linie auto_url_aging (4 Varianten) |
#645 | services/elwosa_lines.py |
— | ✅ |
Hinweis: B11 ist in beta.73 ausgespielt. beta.72 (was bei Markus laeuft) hat es noch nicht.
| Sub | Funktion | Issue | Effort | Status |
|---|---|---|---|---|
| B12.1 |
ferchau URL-Migration zu touch.ferchau.com
|
#653 | S | ✅ |
| B12.2 |
gulp SPA-Migration → eigenes Issue B18 (Playwright) |
#656 | L | ⬜ (in B18) |
| B12.3 |
heise_jobs React-SPA → eigenes Issue B18 |
#656 | M | ⬜ (in B18) |
| B12.4 |
ingenieur_de URL-Migration zu jobs.ingenieur.de Subdomain |
#653 | S | ✅ |
| B12.5 |
kimeta SPA → eigenes Issue B18 |
#656 | M | ⬜ (in B18) |
| B12.6 |
monster deprecated (Domain transitioning 08/2025, kein Job-Listing mehr) |
#653 | XS | ✅ |
| B12.7 |
solcom deprecated (Cloudflare-Block dauerhaft) |
#653 | XS | ✅ |
| Sub | Funktion | Issue | Code | Tests | Status |
|---|---|---|---|---|---|
| B17.1 | REST-API-Adapter (job_scraper/adzuna.py) |
#654 | dito | test_v17_optimierungen_beta77.py |
✅ |
| B17.2 | Credentials-Lookup (params → DB-Settings) | #654 | dito | dito | ✅ |
| B17.3 | SOURCE_REGISTRY-Eintrag mit api_key_erforderlich=True
|
#654 | job_scraper/__init__.py |
— | ✅ |
| B17.4 | Job-Mapping (Adzuna-Felder → PBP job_dict) | #654 | adzuna.py:_process_raw_job |
tests | ✅ |
| B17.5 | Skip-Verhalten ohne Credentials | #654 | dito | tests | ✅ |
| B17.6 | UI-Settings fuer API-Keys + Setup-Anleitung | — | Frontend | — | ⬜ |
| Sub | Funktion | Issue | Status |
|---|---|---|---|
| B18.1 |
gulp Playwright-Adapter oder JSON-API-Recherche |
#656 | ⬜ |
| B18.2 |
kimeta Playwright |
#656 | ⬜ |
| B18.3 |
heise_jobs Playwright oder Adzuna als Ersatz |
#656 | ⬜ |
Probes fuer ingenieur_de und ferchau ergaenzt (URLs identisch zu den Adapter-Requests nach der #653-Migration) + Konsistenz-Tests Probe/SOURCE_REGISTRY in tests/test_v174_probe_urls_747.py. Defekte Quellen bleiben bewusst ohne Probe (wuerden falsch-gruen melden).
Alt-Drift in v1.7.5 geschlossen (#748), Prinzip Probe == Adapter: bundesagentur bekommt die Adapter-Header (X-API-Key + UA) via _PROBE_EXTRA_HEADERS, workable nutzt die v1-Widget-API mit Adapter-Firma, personio probt die erste Adapter-Firma. Die RSS-Probes (berufsstart/studentjob/praktikum_de) waren bereits adapter-identisch — melden sie rot, ist der Adapter real betroffen (gewollt). Tests: tests/test_v175_probe_konsistenz_748.py.
| Sub | Funktion | Issue | Status |
|---|---|---|---|
| B13.1 | Bundesagentur-Probe-Endpoint pruefen (gibt 403 obwohl Production-Scraper laeuft) | ⬜ | ⬜ |
| B13.2 | Workday-DAX-Probe (POST /wday/cxs/sap/...) hat ConnectError |
⬜ | ⬜ |
| B13.3 | Workable, Personio, Berufsstart, Studentjob, Praktikum — alle 404 obwohl Scraper laeuft | ⬜ | ⬜ |
| B13.4 | Generisches Pattern: pro Quelle ein erwarteter Probe-URL der dem Production-Pfad folgt | ⬜ | ⬜ |
| Sub | Funktion | Issue | Status |
|---|---|---|---|
| B14.1 | Chrome-Extension oeffnet Stellen-Seite + extrahiert Daten | — | ✅ |
| B14.2 |
stelle_manuell_anlegen als Backend-Empfaenger |
#160 | ✅ |
| B14.3 |
linkedin_browser_search Tool |
#73 | ✅ |
| Sub | Funktion | Issue | Status |
|---|---|---|---|
| B15.1 | Round-Robin durch aktive Quellen statt alle-parallel | #590-C.4 | ⬜ |
| B15.2 | Rate-Limit pro Domain einhalten (kein Server-Bombing) | ⬜ | ⬜ |
| Sub | Funktion | Issue | Status |
|---|---|---|---|
| B16.1 | User kann URL einer Karriere-Seite eingeben + Scraping-Regeln waehlen | #627 | ⬜ |
| B16.2 | Auto-Detection des Job-Listing-Patterns (JSON-LD / Pagination / ...) | ⬜ | ⬜ |
| B16.3 | UI im Tab-Einstellungen unter "Eigene Quellen" | ⬜ | ⬜ |
Pro Sub-Position gilt:
- Code im Repo (Pfad in Tabelle).
- Tests gruen (Test-Datei in Tabelle wo relevant).
- Wiki-Eintrag in Jobportale, Stellen-Qualitaet oder Tab-Stellen.
Solange auch nur eines fehlt: 🟨 oder ⬜.
🗺 Plan
- Master-Plan
- Master-Plan-Optimierung
- Plan-Datenbasis (A)
- Plan-Jobsuche (B)
- Plan-Stellen (C)
- Plan-Bewerbungen (D)
- Plan-Dokumente (E)
- Plan-Lokale-KI (F)
- Plan-Frontend (G)
- Plan-MCP-Layer (H)
- Plan-Distribution (I)
- Plan-Roadmap-v18 (J)
Einstieg
Tabs
Features
- Elwosa
- Lern-System
- Lokale KI & KI-Steuerung
- Profile-Cluster
- Suchkriterien & Gewichtungen
- Profil aus Dokumenten
- Workflows
- Jobportale
- Stellen-Qualitaet
Reference