...rn text
    head = int(max_chars * 0.6)
    tail = max_chars - head - 40
    return (
        text[:head]
        + "\n...\n[TRUNCATED]\n...\n"
        + text[-tail:]
    )
```

---

## 6) Validator: nur noch harte Struktur, alles andere soft

### Harte Fails (nur diese!)
- JSON nicht parsebar
- Pflichtfeld fehlt
- falscher Datentyp

### **KEINE** Hard-Fails mehr für:
- Quote fehlt
- Quote stimmt nicht ex...