Fix Bug #12: Bindestrich im Titel wird jetzt erlaubt

- Validierungsregel in AiResponseValidator erweitert um Bindestrich (-)
- Test angepasst: validate_titleWithHyphen jetzt als Valid-Case akzeptiert
- Dokumentation (fachliche Anforderungen, CLAUDE.md) aktualisiert
- mvn clean verify erfolgreich durchgelaufen
This commit is contained in:
2026-04-23 07:02:06 +02:00
parent c7f53416ca
commit 34c8245ae9
4 changed files with 7 additions and 7 deletions
+1 -1
View File
@@ -123,7 +123,7 @@ Ein Arbeitspaket ist erst fertig, wenn die betroffenen öffentlichen Klassen und
- Bei Namenskollisionen: `YYYY-MM-DD - Titel(1).pdf`, `YYYY-MM-DD - Titel(2).pdf`, ...
- Die **konfigurierte maximale Titellänge** gilt nur für den **Basistitel**; das Dubletten-Suffix zählt nicht mit
- Das Dubletten-Suffix wird unmittelbar vor `.pdf` angehängt
- Titel sind **deutsch**, verständlich, eindeutig und enthalten keine Sonderzeichen außer Leerzeichen
- Titel sind **deutsch**, verständlich, eindeutig und enthalten keine Sonderzeichen außer Leerzeichen und Bindestrichen
- Eigennamen bleiben unverändert
- Datumsermittlung mit Priorität aus den fachlichen Anforderungen; wenn kein belastbares Datum eindeutig ableitbar ist, ist das **aktuelle Datum** als Fallback erlaubt
- Mehrdeutige Dokumente liefern **kein** unsicheres Ergebnis, sondern einen Fehler
+1 -1
View File
@@ -68,7 +68,7 @@ Fallback auf aktuelles Datum ist erlaubt, wenn kein belastbares Datum eindeutig
- maximal **konfigurierbare Anzahl Zeichen (Basistitel, Default 60, gültiger Bereich 10..120)**
- verständlich und eindeutig
- keine Sonderzeichen außer Leerzeichen
- keine Sonderzeichen außer Leerzeichen und Bindestrichen
---
@@ -102,7 +102,7 @@ public final class AiResponseValidator {
if (!isAllowedTitleCharacters(title)) {
return AiValidationResult.invalid(
"Title contains disallowed characters (only letters, digits, and spaces are permitted): '"
"Title contains disallowed characters (only letters, digits, spaces, and hyphens are permitted): '"
+ title + "'",
AiErrorClassification.FUNCTIONAL);
}
@@ -142,14 +142,14 @@ public final class AiResponseValidator {
// -------------------------------------------------------------------------
/**
* Returns {@code true} if every character in the title is a letter, digit, or space.
* Returns {@code true} if every character in the title is a letter, digit, space, or hyphen.
* <p>
* Permits Unicode letters including German Umlauts (ä, ö, ü, Ä, Ö, Ü) and ß.
*/
private static boolean isAllowedTitleCharacters(String title) {
for (int i = 0; i < title.length(); i++) {
char c = title.charAt(i);
if (!Character.isLetter(c) && !Character.isDigit(c) && c != ' ') {
if (!Character.isLetter(c) && !Character.isDigit(c) && c != ' ' && c != '-') {
return false;
}
}
@@ -139,12 +139,12 @@ class AiResponseValidatorTest {
}
@Test
void validate_titleWithHyphen_returnsInvalid() {
void validate_titleWithHyphen_isAccepted() {
ParsedAiResponse parsed = ParsedAiResponse.of("Strom-Rechnung", "reasoning", null);
AiResponseValidator.AiValidationResult result = validator.validate(parsed);
assertThat(result).isInstanceOf(AiResponseValidator.AiValidationResult.Invalid.class);
assertThat(result).isInstanceOf(AiResponseValidator.AiValidationResult.Valid.class);
}
@Test