Jobsuche: Berufsbezeichnungen steuern die Suche, nicht mehr Faehigkeiten

Der Feinschliff schlug per KI Technologien vor ("Proxmox", "Rechenzentrum")
und verbot Rollenbezeichnungen ausdruecklich - die sollte die Suche selbst
aus dem Lebenslauf ableiten. Das war schief: Welche Anzeigen ueberhaupt
gefunden werden, entscheidet die Suchanfrage, also der Stellentitel.
Technologien gewichten nur, was schon da ist. Damit schlug die KI genau das
vor, was der Such-Agent ohnehin selbst ableitet, waehrend die eine Sache,
die der Nutzer weder sieht noch steuern kann - unter welchen Titeln gesucht
wird -, bei jedem Lauf neu improvisiert wurde. Faellt "Fachinformatiker
Systemintegration" weg, merkt das niemand; es kommt nur wenig zurueck.

- Neues Profilfeld berufsbezeichnungen: die KI schlaegt es vor, der Nutzer
  editiert es, der Such-Agent fragt jeden Titel einzeln ab.
- zusatz_begriffe bleibt, aber als Kontext (Branche, Umfeld, Arbeitszeit),
  nicht als Stellentitel; ausschluesse unveraendert.
- Leeres Feld = altes Verhalten (Titel aus dem Lebenslauf), niemandes
  Profil aendert sich durch das Update.
- Spalte wird fuer bestehende Installationen nachgezogen.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-14 12:27:06 +02:00
co-authored by Claude Opus 4.8
parent 67b8e5735f
commit 090228479a
5 changed files with 86 additions and 25 deletions
+15 -5
View File
@@ -916,14 +916,15 @@ async function loadSuchprofil(userId) {
async function saveSuchprofil(userId, profil) {
const r = suchprofil.toRow(profil);
await dbRun(
`INSERT INTO suchprofil (user_id, aktiv, modus, staedte, zusatz_begriffe, ausschluesse, zeitplan_tage, zeitplan_zeit, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
`INSERT INTO suchprofil (user_id, aktiv, modus, staedte, berufsbezeichnungen, zusatz_begriffe, ausschluesse, zeitplan_tage, zeitplan_zeit, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP)
ON CONFLICT(user_id) DO UPDATE SET
aktiv = excluded.aktiv, modus = excluded.modus, staedte = excluded.staedte,
berufsbezeichnungen = excluded.berufsbezeichnungen,
zusatz_begriffe = excluded.zusatz_begriffe, ausschluesse = excluded.ausschluesse,
zeitplan_tage = excluded.zeitplan_tage, zeitplan_zeit = excluded.zeitplan_zeit,
updated_at = CURRENT_TIMESTAMP`,
[userId, r.aktiv, r.modus, r.staedte, r.zusatz_begriffe, r.ausschluesse, r.zeitplan_tage, r.zeitplan_zeit]
[userId, r.aktiv, r.modus, r.staedte, r.berufsbezeichnungen, r.zusatz_begriffe, r.ausschluesse, r.zeitplan_tage, r.zeitplan_zeit]
);
}
@@ -1525,14 +1526,16 @@ async function initializeDatabase() {
`);
// Job-search profile (one row per user; a missing row = no search configured).
// The user sets *where* (Städte/Modus) and the guard rails; the roles and
// buzzwords are derived from their Lebenslauf at run time — see lib/suchprofil.
// The user sets *where* (Städte/Modus), *unter welchen Titeln* gesucht wird
// (berufsbezeichnungen) und die Leitplanken; Technologien/Buzzwords leitet die
// Suche weiter aus dem Lebenslauf ab — siehe lib/suchprofil.
await exec(`
CREATE TABLE IF NOT EXISTS suchprofil (
user_id INTEGER PRIMARY KEY,
aktiv INTEGER NOT NULL DEFAULT 0,
modus TEXT NOT NULL DEFAULT 'regional',
staedte TEXT NOT NULL DEFAULT '[]',
berufsbezeichnungen TEXT DEFAULT '',
zusatz_begriffe TEXT DEFAULT '',
ausschluesse TEXT DEFAULT '',
zeitplan_tage TEXT DEFAULT '1,2,3,4,5',
@@ -1541,6 +1544,13 @@ async function initializeDatabase() {
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
)
`);
// Bestehende Installationen: die Spalte kam nach dem CREATE TABLE oben dazu.
// Leer heißt „wie bisher" — die Suche leitet die Rollen dann weiter selbst aus
// dem Lebenslauf ab, niemandes Profil ändert sich durch das Update.
const suchprofilSpalten = await dbAll('PRAGMA table_info(suchprofil)');
if (!suchprofilSpalten.some((s) => s.name === 'berufsbezeichnungen')) {
await exec("ALTER TABLE suchprofil ADD COLUMN berufsbezeichnungen TEXT DEFAULT ''");
}
// Queue + history of search runs. The app only ever *enqueues* (status
// 'angefordert'); the host-side runner (bin/jobsuche-runner.sh) picks runs up,