# 🔴 Vorschau stürzt bei ~0,1 % der Mails ab (htmlToText, Unicode)
Gefunden beim Verifizieren des Index-Drift-Fixes. **Der Drift-Fix selbst ist
sauber** (2000 Stichproben über 8 Ordner, 0 falsche Zuordnungen, Drift 0 über
alle 69 Ordner) — das hier ist ein **separater, neuer Befund**.
## Symptom
```
2026/07/16 09:45:44 http: panic serving: runtime error:
slice bounds out of range [:207] with length 175
backend.replaceCaseInsensitive 06-mbox.go:770
backend.markHTMLBreaks 06-mbox.go:755
backend.htmlToText 06-mbox.go:690
backend.extractTextBody / messageBody / messageHandler
```
Die betroffene Mail ist **nicht anzeigbar** — die Verbindung stirbt. Gemessen:
**1 von 2000 Stichproben (~0,1 %)**, hochgerechnet ~58 der 57.771 Mails.
Beispiel: `kolmer/INBOX seq=2378 "[www.mtp24.pl] Weryfikacja adresu"` — eine
polnische Mail. Auslöser ist Nicht-ASCII.
## Ursache — dieselbe Klasse wie der Buffer-Bug: zwei Koordinatensysteme
[`06-mbox.go:760`](backend/06-mbox.go):
```go
func replaceCaseInsensitive(s, old, new string) string {
lower := strings.ToLower(s) // <-- kann ANDERE Byte-Laenge haben als s!
needle := strings.ToLower(old)
for {
i := strings.Index(lower, needle) // Index in LOWER
...
b.WriteString(s[:i]) // auf S angewendet <-- FALSCH
cut := i + len(old)
s = s[cut:]
lower = lower[cut:] // beide mit demselben cut -> driften auseinander
}
}
```
`strings.ToLower` ist **nicht byte-laengen-erhaltend**:
- `İ` (U+0130, 2 Bytes) → `i̇` (3 Bytes) = **+1**
- `K` (U+212A Kelvin, 3 Bytes) → `k` (1 Byte) = **−2**
Sobald ein solches Zeichen vorkommt, passen die Indizes aus `lower` nicht mehr
auf `s`. Mit jedem `cut` driftet es weiter, bis `i > len(s)` → Panic. Das erklaert
`[:207] with length 175` exakt.
**`stripHTMLBlock` direkt darunter hat denselben Fehler** (`lower`-Index auf `s`
angewendet) — bitte mitfixen, auch wenn er noch nicht gecrasht ist.
## Fix
Die Needles sind **alle ASCII** (`
`, `
Turkish İ test