docs(quick-260907-hyi): SUMMARY fuer Tasks 1-3, Task 4 (Browser-Abnahme) offen

Dokumentiert die drei ausgefuehrten Tasks (Woerterbuch + de.json,
Vitest-Waechter, API-Texte), die zwei waehrend Task 2 selbst
entdeckten und behobenen Woerterbuch-Luecken sowie die realen
Test-/Build-Ergebnisse fuer beide Apps. Task 4 (Sichtpruefung nach
Docker-Rebuild) bleibt dem Orchestrator ueberlassen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5jtbGzC5Sf9npJ3JCjKhq
This commit is contained in:
2026-09-07 13:08:53 +02:00
parent d9f1422d6f
commit cb6ba7188a
@@ -0,0 +1,125 @@
---
quick_id: 260907-hyi
title: Umlaute in der deutschen Oberflaeche korrigieren
status: complete
tech-stack:
patterns:
- "Explizite Ersetzungs-/Positivliste statt Zeichenregel fuer Umlaut-Korrektur"
key-files:
created:
- apps/web/src/messages/umlaut-dictionary.ts
- apps/web/src/messages/umlaut-guard.spec.ts
modified:
- apps/web/src/messages/de.json
- apps/api/src/mail/mail.service.ts
- apps/api/src/domaincheck/domaincheck.seed.ts
decisions:
- "ss/ß-Faelle (Groesse, Schliessen, ausschliessen, Gruessen) wurden mitkorrigiert statt ausgeklammert, da derselbe Defekt."
- "Fehlende Woerterbuch-Eintraege, die der neue Waechter selbst aufdeckte, wurden inline nachgezogen (Rule 1 - Bug)."
actuals:
tokens: 9975
tasks: 3
commits: 3
plan_head_before: bec0530a2b2638b47fbc91dc9017cda148f5c37f
metrics:
duration: "~25 min"
completed: 2026-09-07
---
# Quick-Task 260907-hyi: Umlaute in der deutschen Oberflaeche korrigieren Summary
Deutsche Oberflaechentexte, Passwort-/Willkommens-Mail und Marktplatz-Modulbeschreibung
schrieben Umlaute als Buchstabenpaare aus; jetzt schreiben sie echte Umlaute, per expliziter
Token-Liste korrigiert und mit einem Vitest-Waechter gegen Rueckfall abgesichert.
## Ausgefuehrte Tasks
1. **Woerterbuch anlegen und de.json korrigieren** — `umlaut-dictionary.ts` angelegt
(`UMLAUT_REPLACEMENTS`, `UMLAUT_ALLOWLIST`), 68 falsche Tokens (140 Fundstellen inkl. der
in Task 2 entdeckten Ergaenzung) in `de.json` per Ganzwort-Ersetzung korrigiert. Commit
`3d351c6`.
2. **Regressionswaechter als Vitest-Spec** — `umlaut-guard.spec.ts` angelegt, liest
ausschliesslich das geparste JSON, prueft drei Dinge (keine bekannten Ersatzschreibweisen
mehr, kein neues ae/oe/ue/ss-Token ausserhalb der Positivliste, de/en-Schluesselparitaet).
Commit `caa4827`.
3. **API-Texte — Passwort-Mail und Modul-Beschreibung** — `mail.service.ts` (Betreff,
Reset-Fliesstext, Willkommens-Mail) und `domaincheck.seed.ts` korrigiert. Commit `d9f1422`.
4. **Sichtpruefung im Browser und in der Datenbank** — `checkpoint:human-verify`, absichtlich
nicht ausgefuehrt. Der Orchestrator fuehrt Docker-Rebuild und die visuelle Pruefung durch.
## Deviations from Plan
### Auto-fixed Issues
**1. [Rule 1 - Bug] Fehlender Grossschreibungs-Eintrag `Bestaetigen` → `Bestätigen`**
- **Found during:** Task 2, beim ersten Lauf des neuen Waechters.
- **Issue:** Die Plan-Wortliste fuehrte nur `bestaetigen→bestätigen` (klein), aber
`common.confirm` in `de.json` nutzt die Grossschreibung `"Bestaetigen"` (Schaltflaechen-Text)
— blieb nach Task 1 faelschlich unkorrigiert.
- **Fix:** `Bestaetigen: 'Bestätigen'` zu `UMLAUT_REPLACEMENTS` ergaenzt, `de.json`-Wert
direkt korrigiert.
- **Files modified:** `apps/web/src/messages/umlaut-dictionary.ts`, `apps/web/src/messages/de.json`
- **Commit:** `caa4827`
**2. [Rule 1 - Bug] Fehlende Positivlisten-Eintraege fuer nach der Korrektur entstandene, aber weiterhin ae/oe/ue/ss-haltige korrekte Woerter**
- **Found during:** Task 2, gleicher Waechter-Lauf.
- **Issue:** Die Korrektur von `Passwoerter`, `vertrauenswuerdigen`, `ausschliessen`,
`entschluesselt` ergibt korrektes Deutsch (`Passwörter`, `vertrauenswürdigen`,
`ausschließen`, `entschlüsselt`), das aber weiterhin die Zeichenfolge `ss`/`ue` enthaelt
(z. B. `üssel`, `au` + `e` in `trauen`, `uss` in `ausschließen`) und deshalb vom
zweiten Waechter-Test als "neues Wort" markiert wurde.
- **Fix:** Die vier Woerter zu `UMLAUT_ALLOWLIST` ergaenzt.
- **Files modified:** `apps/web/src/messages/umlaut-dictionary.ts`
- **Commit:** `caa4827`
Beide Punkte wurden inline behoben, nicht als separate Commits — sie sind Teil der
Fertigstellung des in Task 1/2 beschriebenen Woerterbuchs, keine architektonische Aenderung.
## Test-/Build-Ergebnisse (real, nicht simuliert)
- `pnpm --filter @tessera/web test`: **38 Testdateien, 225 Tests — alle gruen** (inkl. neuem
`umlaut-guard.spec.ts` und bestehender `tenderRadar-parity.spec.ts`).
- `pnpm --filter @tessera/web run type-check`: sauber, keine Ausgabe.
- `pnpm --filter @tessera/api run build`: sauber, keine Ausgabe.
- `pnpm --filter @tessera/api run type-check`: sauber, keine Ausgabe.
- `pnpm --filter @tessera/api run test`: **46 Testdateien, 642 Tests — alle gruen** (mehrere
erwartete `ERROR`/`WARN`-Log-Zeilen in der Ausgabe stammen von absichtlich simulierten
Fehlerpfaden in bestehenden Tests, kein neuer Testfehler).
- Manuelle Waechter-Probe (Task 2 `done`-Kriterium): ein probeweise eingefuegtes `fuer`
liess die Spec mit exakt der geforderten Meldung fehlschlagen (`"für"` + Schluesselpfad
`common.edit`), danach zurueckgenommen — `git diff --stat` bestaetigt keine Restspur.
## Wieviele Strings geaendert wurden
- **68 verschiedene Tokens** in `UMLAUT_REPLACEMENTS` (67 aus dem Plan + 1 selbst gefunden:
`Bestaetigen`), **140 Ersetzungs-Treffer** in `de.json`-Werten insgesamt.
- **65 Tokens** auf `UMLAUT_ALLOWLIST` (61 aus dem Plan + 4 selbst ergaenzt).
- **6 Zeichenketten** in `apps/api/src/mail/mail.service.ts` (Betreff + 5 Fliesstext-/
Template-Literal-Stellen in beiden Mails).
- **1 Zeichenkette** in `apps/api/src/domaincheck/domaincheck.seed.ts`.
## Was bewusst unangetastet blieb
- `empfaenger@example.com` (Schluessel `testToPlaceholder`) — Platzhalter-Adresse, per
`@`-Regel uebersprungen, wie im Plan gefordert.
- Alle 65 Positivlisten-Woerter (`Passwort`, `Adresse`, `Quelle`, `manuell`, `Ausschreibung`,
`Erzeugnisse`, `zuerst`, `neue`, ...) — unveraendert, keine einzige Ersetzung darauf
angewendet.
- Deutsche Code-Kommentare (z. B. in `tessera-logo.tsx`) — laut Plan ausdruecklich nicht
Teil dieses Tasks, nicht angefasst.
- Wortlaut jeder Zeichenkette — nur Schreibweise korrigiert, keine Umformulierung.
- Schluessel und Reihenfolge in `de.json`/`en.json` — strukturell identisch geblieben (787
Schluessel, geprueft per Skript vor und nach der Aenderung).
- Die beiden Backlog-Punkte aus dem Plan (`1 Mitglieder` statt `1 Mitglied`; Duzen im
Aktivierungsdialog) — ausdruecklich nicht Teil dieses Plans, bereits im Backlog unter
`.planning/phases/15-modul-berechtigungen-gruppen-user-grants/15-UAT-2026-09-07.md` vermerkt.
- Task 4 (Sichtpruefung, Docker-Rebuild) — `checkpoint:human-verify`, dem Orchestrator
ueberlassen.
## Self-Check: PASSED
- `apps/web/src/messages/umlaut-dictionary.ts` — FOUND
- `apps/web/src/messages/umlaut-guard.spec.ts` — FOUND
- Commit `3d351c6` — FOUND (`git log --oneline --all`)
- Commit `caa4827` — FOUND
- Commit `d9f1422` — FOUND