diff --git a/docs/gui-bedienanleitung.md b/docs/gui-bedienanleitung.md
index 2fa2f8b..38510da 100644
--- a/docs/gui-bedienanleitung.md
+++ b/docs/gui-bedienanleitung.md
@@ -286,9 +286,9 @@ Validierungsregeln für `max.title.length` (Feld „Max. Titellänge (Zeichen)"
| Kein Wert / leer | Fehler – Pflichtfeld, Konfiguration nicht lauffähig |
| Keine Ganzzahl (z. B. „abc") | Fehler – ungültiger Typ |
| Kleiner als 10 | Fehler – Minimum ist 10 Zeichen |
-| 10 – 19 | Warnung – Titellänge unter 20 Zeichen ist für die meisten Dokumente nicht empfohlen |
-| 20 – 99 | Normaler Betrieb, keine Meldung |
-| 100 – 120 | Warnung – Dateiname wird sehr lang, Kompatibilität mit verschlüsselten Volumes prüfen |
+| 10 – 39 | Warnung – Titellänge unter 40 Zeichen – KI-Ergebnisse können unvollständig sein, da Absender allein bereits 15–20 Zeichen benötigt |
+| 40 – 99 | Normaler Betrieb, keine Meldung |
+| 100 – 120 | Warnung – Hohe Titellänge – Kompatibilität mit verschlüsselten Volumes prüfen |
| Größer als 120 | Fehler – überschreitet sicheres Limit für verschlüsselte Volumes |
Warnungen verhindern das Speichern nicht. Fehler markieren den Stand als nicht lauffähig; Speichern ist dennoch erlaubt, jedoch erscheint ein deutlicher Hinweis im Meldungsbereich.
diff --git a/docs/specs/V2_6_-_Spezifikation.md b/docs/specs/V2_6_-_Spezifikation.md
index e22756d..bb383bb 100644
--- a/docs/specs/V2_6_-_Spezifikation.md
+++ b/docs/specs/V2_6_-_Spezifikation.md
@@ -59,9 +59,9 @@ für den Basistitel (143 − 18 = 125, mit Puffer auf 120 gerundet).
| Keine Ganzzahl (z. B. „abc", „1.5") | Fehler | Ungültiger Typ, Start wird abgebrochen |
| < 1 | Fehler | Wert muss positiv sein, Start wird abgebrochen |
| 1–9 | Fehler | Minimum ist 10 Zeichen, Start wird abgebrochen |
-| 10–19 | Warnung | „Titellänge unter 20 Zeichen ist für die meisten Dokumente nicht empfohlen" |
-| 20–99 | OK | Normaler Betrieb, keine Meldung |
-| 100–120 | Warnung | „Hohe Titellänge – Dateiname wird sehr lang, Kompatibilität mit verschlüsselten Volumes prüfen" |
+| 10–39 | Warnung | „Titellänge unter 40 Zeichen – KI-Ergebnisse können unvollständig sein, da Absender allein bereits 15–20 Zeichen benötigt" |
+| 40–99 | OK | Normaler Betrieb, keine Meldung |
+| 100–120 | Warnung | „Hohe Titellänge – Kompatibilität mit verschlüsselten Volumes prüfen" |
| > 120 | Fehler | Überschreitet sicheres Limit für verschlüsselte Synology-Volumes, Start wird abgebrochen |
---
diff --git a/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiEditorValidationSmokeTest.java b/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiEditorValidationSmokeTest.java
index 9693217..df22ac6 100644
--- a/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiEditorValidationSmokeTest.java
+++ b/pdf-umbenenner-adapter-in-gui/src/test/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiEditorValidationSmokeTest.java
@@ -514,7 +514,7 @@ class GuiEditorValidationSmokeTest {
}
/**
- * Smoke test: a value in the lower warning band (10..19) produces a field finding that is
+ * Smoke test: a value in the lower warning band (10..39) produces a field finding that is
* not marked as ERROR.
*
* @throws Exception if the FX thread task fails or times out
diff --git a/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/bootstrap/validation/StartConfigurationValidator.java b/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/bootstrap/validation/StartConfigurationValidator.java
index 0424aff..be4f013 100644
--- a/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/bootstrap/validation/StartConfigurationValidator.java
+++ b/pdf-umbenenner-adapter-out/src/main/java/de/gecheckt/pdf/umbenenner/adapter/out/bootstrap/validation/StartConfigurationValidator.java
@@ -230,7 +230,7 @@ public class StartConfigurationValidator {
*
* Non-blocking warnings (logged but accepted):
*
- * - {@code 10 <= value <= 19}: low-range warning (below the usual minimum)
+ * - {@code 10 <= value <= 39}: low-range warning (AI results may be incomplete)
* - {@code 100 <= value <= 120}: high-range warning (filename compatibility with
* encrypted Synology volumes)
*
@@ -249,9 +249,9 @@ public class StartConfigurationValidator {
+ "). Überschreitet sicheres Limit für verschlüsselte Synology-Volumes.");
return;
}
- if (value <= 19) {
- LOG.warn("Titellänge {} unter 20 Zeichen ist für die meisten Dokumente nicht empfohlen",
- value);
+ if (value <= 39) {
+ LOG.warn("Titellänge {} unter 40 Zeichen – KI-Ergebnisse können unvollständig sein, "
+ + "da Absender allein bereits 15–20 Zeichen benötigt", value);
} else if (value >= 100) {
LOG.warn("Titellänge {} ist hoch – Kompatibilität mit verschlüsselten Volumes "
+ "(Limit ~143 Zeichen inkl. Datumspräfix) prüfen",
diff --git a/pdf-umbenenner-adapter-out/src/test/java/de/gecheckt/pdf/umbenenner/adapter/out/bootstrap/validation/StartConfigurationValidatorTest.java b/pdf-umbenenner-adapter-out/src/test/java/de/gecheckt/pdf/umbenenner/adapter/out/bootstrap/validation/StartConfigurationValidatorTest.java
index 841bc45..e2b2272 100644
--- a/pdf-umbenenner-adapter-out/src/test/java/de/gecheckt/pdf/umbenenner/adapter/out/bootstrap/validation/StartConfigurationValidatorTest.java
+++ b/pdf-umbenenner-adapter-out/src/test/java/de/gecheckt/pdf/umbenenner/adapter/out/bootstrap/validation/StartConfigurationValidatorTest.java
@@ -991,7 +991,21 @@ class StartConfigurationValidatorTest {
void validate_succeedsForLowWarnRange() throws Exception {
StartConfiguration config = buildValidConfigWithMaxTitleLength(15);
assertDoesNotThrow(() -> validator.validate(config),
- "Werte im Bereich 10..19 sind zulässig (nur Warnung im Log)");
+ "Werte im Bereich 10..39 sind zulässig (nur Warnung im Log)");
+ }
+
+ @Test
+ void validate_succeedsForLowWarnRangeUpperBoundary() throws Exception {
+ StartConfiguration config = buildValidConfigWithMaxTitleLength(39);
+ assertDoesNotThrow(() -> validator.validate(config),
+ "Wert 39 ist zulässig (nur Warnung im Log)");
+ }
+
+ @Test
+ void validate_succeedsForNormalRangeLowerBoundary() throws Exception {
+ StartConfiguration config = buildValidConfigWithMaxTitleLength(40);
+ assertDoesNotThrow(() -> validator.validate(config),
+ "Wert 40 ist unkritisch (kein Log-Warn)");
}
@Test
diff --git a/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/validation/editor/EditorConfigurationValidator.java b/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/validation/editor/EditorConfigurationValidator.java
index 3762f69..a92fd73 100644
--- a/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/validation/editor/EditorConfigurationValidator.java
+++ b/pdf-umbenenner-application/src/main/java/de/gecheckt/pdf/umbenenner/application/validation/editor/EditorConfigurationValidator.java
@@ -68,7 +68,7 @@ public class EditorConfigurationValidator {
// Grenzen für die maximale Basistitel-Länge.
private static final int TITLE_LENGTH_MIN = 10;
private static final int TITLE_LENGTH_MAX = 120;
- private static final int TITLE_LENGTH_LOW_WARN_THRESHOLD = 20;
+ private static final int TITLE_LENGTH_LOW_WARN_THRESHOLD = 40;
private static final int TITLE_LENGTH_HIGH_WARN_THRESHOLD = 100;
/**
@@ -237,10 +237,10 @@ public class EditorConfigurationValidator {
* < {@value #TITLE_LENGTH_MIN}: Fehler (Minimum)
* > {@value #TITLE_LENGTH_MAX}: Fehler (sicheres Maximum für verschlüsselte Volumes)
* {@value #TITLE_LENGTH_MIN}–{@value #TITLE_LENGTH_LOW_WARN_THRESHOLD} (einschließlich
- * 19): Warnung (unter 20 Zeichen selten empfehlenswert)
+ * 39): Warnung (unter 40 Zeichen – KI-Ergebnisse können unvollständig sein)
* ≥ {@value #TITLE_LENGTH_HIGH_WARN_THRESHOLD}: Warnung (Kompatibilitätsrisiko
* mit verschlüsselten Volumes)
- * andernfalls (20–99): kein Befund
+ * andernfalls (40–99): kein Befund
*
*
* @param rawValue Rohwert aus dem Editor; nie {@code null}
@@ -275,17 +275,17 @@ public class EditorConfigurationValidator {
}
if (value < TITLE_LENGTH_LOW_WARN_THRESHOLD) {
findings.add(EditorValidationFinding.warning(FIELD_MAX_TITLE_LENGTH,
- "Titellänge unter " + TITLE_LENGTH_LOW_WARN_THRESHOLD
- + " Zeichen ist für die meisten Dokumente nicht empfohlen (aktuell: "
+ "Titellänge unter 40 Zeichen – KI-Ergebnisse können unvollständig sein, "
+ + "da Absender allein bereits 15–20 Zeichen benötigt (aktuell: "
+ value + ")."));
return;
}
if (value >= TITLE_LENGTH_HIGH_WARN_THRESHOLD) {
findings.add(EditorValidationFinding.warning(FIELD_MAX_TITLE_LENGTH,
- "Hohe Titellänge: Kompatibilität mit verschlüsselten Volumes prüfen "
+ "Hohe Titellänge – Kompatibilität mit verschlüsselten Volumes prüfen "
+ "(aktuell: " + value + ")."));
}
- // 20–99: unkritisch, kein Befund
+ // 40–99: unkritisch, kein Befund
}
// =========================================================================
diff --git a/pdf-umbenenner-application/src/test/java/de/gecheckt/pdf/umbenenner/application/validation/editor/EditorConfigurationValidatorTest.java b/pdf-umbenenner-application/src/test/java/de/gecheckt/pdf/umbenenner/application/validation/editor/EditorConfigurationValidatorTest.java
index 31ec4be..858804d 100644
--- a/pdf-umbenenner-application/src/test/java/de/gecheckt/pdf/umbenenner/application/validation/editor/EditorConfigurationValidatorTest.java
+++ b/pdf-umbenenner-application/src/test/java/de/gecheckt/pdf/umbenenner/application/validation/editor/EditorConfigurationValidatorTest.java
@@ -591,9 +591,25 @@ class EditorConfigurationValidatorTest {
}
@Test
- void validate_maxTitleLength_twenty_producesNoFinding() {
+ void validate_maxTitleLength_twenty_producesWarning() {
EditorValidationReport report = validator.validate(inputWithMaxTitleLength("20"));
+ assertThat(report.findingsFor(EditorConfigurationValidator.FIELD_MAX_TITLE_LENGTH))
+ .anyMatch(f -> f.severity() == EditorValidationSeverity.WARNING);
+ }
+
+ @Test
+ void validate_maxTitleLength_thirtyNine_producesWarning() {
+ EditorValidationReport report = validator.validate(inputWithMaxTitleLength("39"));
+
+ assertThat(report.findingsFor(EditorConfigurationValidator.FIELD_MAX_TITLE_LENGTH))
+ .anyMatch(f -> f.severity() == EditorValidationSeverity.WARNING);
+ }
+
+ @Test
+ void validate_maxTitleLength_forty_producesNoFinding() {
+ EditorValidationReport report = validator.validate(inputWithMaxTitleLength("40"));
+
assertThat(report.findingsFor(EditorConfigurationValidator.FIELD_MAX_TITLE_LENGTH))
.isEmpty();
}