From d8b552e57d665d4d503babf91411d4cca03248ef Mon Sep 17 00:00:00 2001 From: Thomas Hackner Date: Fri, 3 Jul 2026 18:11:31 +0200 Subject: [PATCH] Ban hollow filler and self-labels in generated prose The model produced awkward AI-tells like "Als Muttersprachler kommuniziere ich serviceorientiert und klar - sowohl mit Anwendern als auch im Team". Add an explicit style rule (system prompt, shared prose guidance, and the AI-reply prompt) that forbids empty buzzword pairs and self-labels such as "Als Muttersprachler ...", quoting the offending sentence as a negative example. Language proficiency belongs only in the CV's Sprachen section; every trait must come out of a concrete task or result. Co-Authored-By: Claude Opus 4.8 --- lib/documents.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/documents.js b/lib/documents.js index 49e9ce9..ed67f91 100644 --- a/lib/documents.js +++ b/lib/documents.js @@ -169,7 +169,9 @@ async function generateTailoredTexts({ job, basisDokumente, settings, llmNotizen 'erfindest KEINE Fakten, Qualifikationen, Abschlüsse, Kontaktdaten oder ' + 'Berufserfahrungen. Verwende ausschließlich Informationen aus den Basis-Unterlagen. ' + 'Du darfst umformulieren, gewichten, relevante Punkte hervorheben und auf die Stelle ' + - 'zuschneiden — aber nichts hinzudichten. Schreibe natürlich, konkret und ohne Floskeln.'; + 'zuschneiden — aber nichts hinzudichten. Schreibe natürlich, konkret und ohne Floskeln, so wie ein ' + + 'deutscher Muttersprachler schreibt: keine Buzzword-Paare, keine leeren Eigenschaftswörter und keine ' + + 'Selbstetiketten wie "Als Muttersprachler ..."; jede Aussage aus einer konkreten Tätigkeit heraus.'; const skeleton = `{\n` + @@ -258,6 +260,14 @@ async function generateTailoredTexts({ job, basisDokumente, settings, llmNotizen `letzten Zeile der vollständige Name des Bewerbers. Trenne Anrede, Absätze, Grußformel und Name jeweils durch ` + `eine Leerzeile (\\n\\n). Höflich, sachlich, in Aktiv-Sätzen, ohne Floskeln und Weichspüler, keine Platzhalter.\n` + `- profil: 2–3 Sätze Kurzprofil, konkret auf die Zielstelle zugeschnitten (der individuelle Text zur Stelle).\n` + + `- Stil/Sprache (gilt für Anschreiben, Profil UND E-Mail): Schreibe so natürlich, wie ein deutscher ` + + `Muttersprachler tatsächlich schreibt - konkrete Verben, kurze klare Sätze. KEINE leeren Floskeln oder ` + + `Buzzword-Paare (also NICHT "serviceorientiert und klar", "motiviert und zuverlässig", "teamfähig und ` + + `belastbar", "kommuniziere ich serviceorientiert und klar - sowohl mit Anwendern als auch im Team"). Jede ` + + `genannte Eigenschaft MUSS aus einer konkreten Tätigkeit oder einem Ergebnis hervorgehen, sonst weglassen. ` + + `KEINE Meta-Aussagen über die eigene Person oder Sprache wie "Als Muttersprachler ..." - Sprachkenntnisse ` + + `gehören ausschließlich in die Sprachen-Sektion des Lebenslaufs, niemals in den Fließtext. Formuliere aus ` + + `der konkreten Aufgabe heraus statt über abstrakte Selbstetiketten.\n` + `- berufserfahrung: ALLE Stationen aus den Unterlagen, neueste zuerst — lückenloser Verlauf, ` + `keine Station weglassen, die sonst eine Lücke hinterlässt (Überschneidungen sind ok). ` + `"firma" = "Arbeitgeber, Ort". Je jünger/relevanter eine Station, desto mehr Stichpunkte: die ` + @@ -1109,7 +1119,8 @@ async function generateEmailReply({ incoming, job = {}, settings = {}, hinweise 'Fakten (keine erfundenen Termine, Zahlen, Zusagen). Wenn eine konkrete Angabe nötig ist, ' + 'die du nicht kennst (z. B. ein genauer Terminvorschlag), setze einen klar erkennbaren ' + 'Platzhalter in eckigen Klammern, z. B. "[Terminvorschlag einfügen]". Schreibe natürlich, ' + - 'knapp und verbindlich, ohne Floskeln.'; + 'knapp und verbindlich, wie ein deutscher Muttersprachler - ohne leere Floskeln, ohne ' + + 'Buzzword-Paare und ohne Selbstetiketten wie "Als Muttersprachler ...".'; const user = `# Kontext der Bewerbung\n` + `Unternehmen: ${job.firma || '-'}\n` +