ProduktMietpreisbremseSicherheitRechtsprechungCorpusDenkenLoginDemo →
Mila / Changelog Was wir bauen, während wir bauen.

Changelog.

Jede Woche, manchmal zweimal. Was wir geliefert haben, was sich verändert hat, was als Nächstes ansteht. Ohne PR-Floskeln.

Warum öffentlich
Die meisten Legal-Tech-Anbieter schreiben Roadmaps für ihre Investoren und Release-Notes für ihre Support-Teams. Wir nicht. Was wir bauen, wofür wir uns entschieden haben, und welche Wette wir gerade laufen — alles steht hier. Kanzleien, Konkurrenten, Presse: gleicher Zugriff, gleicher Tag.
14
Releases · 2026
1.178
Verifizierte Entscheidungen
v1.4.2
Aktuelle Version

Jeder Test bestanden, und trotzdem kaputt.

Eine winzige Änderung bestand jeden automatischen Test — und ließ die Analyse in der Praxis trotzdem nicht mehr starten. Für dich zählt das Ende: solche Ausfälle fallen nur im Test auf, nicht mitten im Mandat.

Vorfall · Verlauf
Änderung geht live
ein Feld mehr — alle Tests grün
Analyse bricht ab
alle 13 Fallarten, im selben Moment
Bemerkt und zurückgesetzt
beim ersten Fehlversuch, in Minuten
Wächter eingebaut
misst die Grenze jetzt bei jeder Änderung
Vier Schritte vom Feld zum Feuer und zurück. Kein einziger echter Fall war betroffen — der Ausfall war laut, sofort sichtbar und in Minuten behoben.

Für eine Kanzlei ist die KI-Analyse kein Extra — sie ist der erste Schritt jeder Akte. Startet sie nicht, steht der Fall. Genau das wäre an einem Tag im Juli fast passiert, und die Geschichte lohnt sich, weil ihr Ende die eigentliche Zusage ist.

Für die neue Modernisierungs-Fallart musste Mila zum ersten Mal richtig rechnen — und dafür brauchte ein kleiner, geteilter Baustein der Analyse ein zusätzliches Feld. Winzig, ein einziges. Alle automatischen Tests liefen durch: die Ergebnisse sahen aus wie vorher, der Code war sauber.

Und trotzdem war es kaputt. Dieses eine Feld hat eine unsichtbare Grenze überschritten. Vor jeder Antwort baut die Analyse ein festes Regelwerk auf, das dem Modell genau vorschreibt, welche Form die Antwort haben darf — und dieses Regelwerk wurde ein Stück zu groß, um überhaupt gebaut zu werden. Ab da startete die Analyse gar nicht mehr: nicht nur für die Modernisierung, sondern für alle damals 13 Fallarten. Und kein Test bemerkt das, denn Tests prüfen die Antwort — hier aber gab es keine Antwort, die Anfrage kam nie durch.

Ein Test, der die Antwort prüft, merkt nicht, dass die Anfrage gar nicht erst durchgeht.

Bemerkt, zurückgesetzt, abgesichert

Gleich beim ersten Fehlversuch aufgefallen. Die Analyse zuerst auf den Stand von vorher zurückgesetzt — in Minuten, ein ehrliches »läuft gerade nicht« statt ein Flicken unter Druck. Dann die Ursache in Ruhe belegt und die Änderung kleiner nachgebaut: dieselbe Rechnung, weniger Regelwerk.

Und das ist der Teil, der dich angeht. Nicht, dass ein Fehler passiert ist — den macht jede Software. Sondern dass die Sorte Fehler, die dich mitten im Mandat treffen könnte, jetzt schon beim Bauen anschlägt, lange bevor sie in die Nähe einer echten Akte kommt: eine Kontrolle misst dieses Regelwerk bei jeder Änderung und blockiert, sobald es zu groß zu werden droht. Verlässlichkeit ist hier kein Glück — sie ist eine Kontrolle, die anschlagen muss, damit nichts Kaputtes bei dir ankommt.

14 Fallarten, ein Weg.

Mila führt jetzt 14 Fallarten durchgängig — von der Mietpreisbremse über Kündigung, Eigenbedarf und Mieterhöhung bis zur Räumungsklage. Mit den letzten beiden ist die Reihe komplett, und keine der 14 ist ein Einzelstück: jede läuft denselben geprüften Weg.

Matters · live
Fallarten, live
14
vom Mietpreis-Check bis zur Räumungsklage
Ablauf
1
derselbe Weg für alle 14
Kein Sonderfall. Neu hinzugekommen: Räumungsklage und Modernisierung — die erste Fallart, bei der Mila die Zahl des Vermieters nachrechnet, statt sie nur zu prüfen.

Als Mila mit der Mietpreisbremse anfing, war das eine Fallart. Jetzt sind es 14 — von der Mietpreisbremse über Kündigung, Eigenbedarf und Mieterhöhung bis zur Räumungsklage, alle über denselben Weg: Einstieg, KI-Analyse, Anwalts-Freigabe, Schriftsatz. Damit ist die Reihe vorerst komplett.

Der Punkt ist nicht die Zahl — es ist, dass keine davon ein Sonderfall ist. Eine neue Fallart hinzuzufügen heißt nicht, ein neues Produkt zu bauen; es heißt, aus derselben Form zu gießen. Für die Kanzlei liegt darin das Eigentliche: jede Fallart bekommt dieselbe Sorgfalt — dieselbe Analyse, dieselbe Pflicht zur Anwalts-Freigabe an jeder einzelnen Stelle — und eine neue kommt in Wochen dazu, nicht in Monaten. Kein Fall ist zweite Klasse, weil er neuer ist.

Die interessanteste: Modernisierung

Bei den meisten Fallarten liest Mila die Unterlagen und prüft, was rechtlich gilt. Modernisierung ist die erste, bei der sie zusätzlich rechnen muss — die Zahl des Vermieters selbst nachrechnen. Die Modernisierungs-Umlage nach § 559 hat eine echte Rechen-Mechanik: der 8-%/11-%-Schnitt am Stichtag 2019, umlagefähige Kosten minus Instandhaltung minus Drittmittel, die Kappung bei 3 bzw. 2 € pro Quadratmeter. Das läuft als deterministischer Code, nicht als Modell-Schätzung — und wenn eine nötige Angabe fehlt, etwa die Ausgangsmiete, sagt Mila »zu klären« statt zu raten.

Warum die Trennung hier zählt: eine falsch gerundete Umlage ist kein Stilfehler, sondern ein falscher Betrag im Schreiben an den Vermieter. Deshalb rechnet an dieser Stelle kein Sprachmodell, sondern Code, den man Zeile für Zeile prüfen kann. Das Modell liest und ordnet ein, die Mathematik rechnet — vierzehn Mal jetzt, immer nach derselben Trennung.

  • Spine Milas Fall-Chat denkt jetzt auf Basis der freigegebenen Befunde mit — nur was der Anwalt bestätigt hat, fließt in die Antwort ein.
  • Email Zustellung wird verfolgt: Postmark meldet Zugestellt, Bounce und Spam-Beschwerde zurück — live in ~12 Sekunden bestätigt.
  • Spine Alle 8 vor der Bibliothek gebauten Fallarten gegen den Corpus nachgeprüft — 5 sauber, 3 mit additiven Lücken, 0 Fehler: keine live Fallart war kaputt.
  • UI Sende-Dialog scrollt auf kleinen Bildschirmen jetzt intern, statt den Footer abzuschneiden.

Wer darf was: die Zulassung, nicht der Rang.

Vier Rollen in der Kanzlei, eine Plattform-Rolle darüber — und ein Tor, das kein Rang öffnet: eine anwaltliche Handlung braucht die Zulassung, nicht die höchste Berechtigung. Dazu: was mit den Akten passiert, wenn eine Kanzlei geht.

Wer darf was
SUPER_ADMIN   verwaltet die Plattform    — keine Anwaltshandlung
ADMIN         verwaltet die Kanzlei      — keine Anwaltshandlung
ANWALT        führt Mandate, gibt frei   — Anwaltshandlung
REFERENDAR    bereitet vor, entwirft     — keine
ASSISTENZ     arbeitet zu                — keine

ist_rechtsanwalt ist die einzige Tür zu BRAO-Handlungen.
Kein Rang öffnet sie.
Die Sperre ist die Zulassung, nicht der Rang. Auch mit den höchsten Rechten kann niemand eine anwaltliche Handlung freigeben, für die er nicht zugelassen ist — es gibt keine Hintertür für den Super-Admin.

Bei einem Rechtsprodukt ist »wer darf was« keine Einstellungs-Kleinigkeit — es ist der Kern. Eine Kanzlei hat jetzt vier Rollen: Admin, Anwält:in, Referendar:in, Assistenz. Darüber steht eine reine Plattform-Rolle, Super-Admin. So weit, so gewöhnlich.

Die tragende Entscheidung ist nicht die Rollenliste — es ist das Tor davor. Eine der BRAO vorbehaltene Handlung, etwa einen Schriftsatz freizugeben oder eine Rüge zu senden, hängt an genau einem Schalter: ist_rechtsanwalt. Nicht an der Rolle, nicht am Rang. Und, das ist der Punkt: es gibt keine Hintertür für den Super-Admin. Selbst wer im System die höchsten Rechte hat, kann keine anwaltliche Handlung freigeben, für die er nicht zugelassen ist.

Praktisch heißt das: die Assistenz kann einen Schriftsatz vorbereiten, aber nicht freigeben; die Referendarin kann entwerfen, aber nicht senden; und selbst die Gründerin kann, wenn sie keine Anwältin ist, die letzte Freigabe nicht setzen. Das ist kein Misstrauen — es ist die Berufsordnung, in Code gegossen.

Die Sperre ist die Zulassung, nicht der Rang.

Was bleibt, wenn eine Kanzlei geht

Dieselbe Frage eine Ebene höher: was passiert mit den Daten, wenn eine Kanzlei Mila verlässt? Sie werden nicht gelöscht — sie werden archiviert. Denn die Aufbewahrungspflicht läuft sechs Jahre, und sie gilt dem Mandanten, nicht dem Abonnement der Kanzlei. Eine verlassene Kanzlei wird stillgelegt, ihre Akten bleiben — lesbar und herausgebbar, falls ein Mandant oder eine Kammer sie verlangt, aber unveränderlich: niemand schreibt mehr hinein. Löschen wäre der bequeme Weg. Er wäre auch der falsche.

  • Spine Jede Kanzlei wählt selbst: beratend (das System warnt) oder erzwungen (das System sperrt) — dieselben Regeln, zwei Härtegrade.
  • Spine »Inhaber:in« wird nicht gesetzt, sondern unterschrieben — die Rolle folgt aus der Signatur des Rahmenvertrags, nicht aus einem Häkchen.
  • Spine Drei Wege, das Zulassungs-Tor zu umgehen, aufgespürt und geschlossen — jeder mit einem Angriffs-Test belegt.

Upload-Gedächtnis: nicht nur gesehen, gemerkt.

Ein Dokument hielt bisher, solange das Gespräch lief — aber wer Tage später zurückkam oder zwischendurch Neues hochlud, verlor seine Daten, gerade die aus Bildern. Jetzt bleiben sie.

Mila · Durchlauf
Turn 1   [Wohnflächen-Gutachten.pdf abgelegt]
         → Kurzbefund: 78,2 / 69,4 m², Abweichung 11,3 %

  … vier Fragen später, ohne erneutes Anhängen …

Turn 6   »Wie lautet die Prüfprotokoll-Nummer?«
         → WFM-2024-LICH-00731-K

Turn 7   »Und was war die festgestellte Abweichung?«
         → 11,3 %  (§ 4 WoFlV, raumweise belegt)
Die Daten, nicht nur das Dokument. Vier Fragen später kommen Prüfprotokoll-Nummer, Quadratmeter und Abweichung zurück — ohne erneutes Anhängen, ohne dass das Gespräch zwischendurch darüber gesprochen hätte. Live durchgelaufen.

»Lies dieses Dokument« hat immer funktioniert — und solange das Gespräch lief, blieb das Dokument auch präsent. Der Bruch kam später: wer Tage darauf an den Thread zurückkehrte oder zwischendurch neue Dateien hochlud, bei dem war der Inhalt fort. Was überlebte, war nur, was Mila vorher in Worten dazu gesagt hatte — nicht das Dokument selbst.

Ein Bild sehen ist nicht, seine Daten behalten

Bei Bildern ist dieser Unterschied am schärfsten. Ein Bild zu sehen und die Daten daraus später abzurufen sind zwei verschiedene Dinge. Mila konnte einen Zählerstand, eine Nummer, eine Tabelle aus einem Foto im Moment des Hochladens lesen — aber einige Fragen später war die Zahl nur noch da, wenn sie sie zufällig ausgeschrieben hatte. Das Bild selbst, und damit seine Daten, war weg.

Jetzt wird der Inhalt jedes Dokuments dauerhaft gespeichert — Text, Tabellen und die aus Bildern und Scans ausgelesenen Daten. Du legst ein Foto oder ein PDF einmal ab und fragst später im Gespräch nach einer konkreten Zahl daraus — ohne erneut anzuhängen, und ohne dass das Gespräch zwischendurch darüber gesprochen haben muss.

Wenn der Platz nicht reicht, sagt es das

Unter der Haube hält jedes Dokument zwei Ebenen: eine immer präsente Kurzfassung mit Identität und Anfang — der Boden, der »ist noch da« wahr macht — und den vollen Inhalt, der den begrenzten Platz im Kontext von neu nach alt füllt. Reicht der Platz nicht, verschwindet ein älteres Dokument nicht stillschweigend: es sagt »frag nach dem Wortlaut« und behält seine Kurzfassung. Bilder und PDFs werden dafür einmal ausgelesen und gespeichert, nicht bei jeder Folgefrage neu.

Die Disziplin ist dieselbe wie überall bei Mila: lieber eine ehrliche Lücke als eine erfundene Antwort. Was nicht mehr in den Kontext passt, wird als fehlend markiert — nie halluziniert.

  • UI Randnotizen an Milas Antworten: markiere eine Stelle in einer Antwort — sie wird gelb hervorgehoben und bekommt einen Notizzettel am Rand, zum Nachschlagen, Prüfen oder Festhalten. Bleibt am Thread, privat.
  • UI Export: jeder Mila-Entwurf lässt sich als PDF oder Word-Datei herunterladen — direkt aus dem Menü über dem Entwurf.
  • UI Datei-Ablage auf der ganzen Fläche: ein Dokument, irgendwo in Mila fallen gelassen, hängt jetzt an — nicht nur über dem kleinen Eingabefeld.
  • UI Denk-Anzeige: zwischen Absenden und erster Antwort erscheint jetzt »Mila denkt nach …« statt einer leeren Pause, die wie ein Fehler aussah.
  • UI Anhänge stapeln über der Nachricht statt gequetscht daneben.
  • UI Zeiterfassung, die mitdenkt: der »Wie lange ohne Mila?«-Dialog fragt jetzt einmal pro Arbeitsblock (ab ~10 Min oder fünf Freigaben) statt nach jeder einzelnen Freigabe — systemweit der neue Standard.
  • Infra Export-Dienst (PDF/Word) fiel bei jedem Titel mit Doppelpunkt — also bei »Rüge: …«, »Memo: …« — auf einen 502; der Titel wird jetzt außerhalb des YAML-Blocks übergeben, der Dienst zusätzlich in den Projekt-Code gespiegelt.
  • UI Export-Menü schließt per Klick daneben und Esc.

In die Bibliothek übertragen: nicht alles ist eine Akte.

Ein guter Mila-Entwurf wird mit einer Aktion zu durchsuchbarem Firmenwissen. Die Frage lautet: wo landet der Entwurf — und warum nicht im »Aktenschrank«?

Wo ein Dokument lebt
Mandant:innen-Dokument   →  Akte
                            BRAO-Aufbewahrung · 6-Jahre-Uhr läuft

Kanzlei-Baustein         →  Bibliothek
                            Firmenwissen · keine Frist · kein Mandantsbezug
Nicht alles, was Mila schreibt, ist eine Akte. Ein gespeicherter Baustein ist Firmenwissen ohne Aufbewahrungspflicht — er gehört in die Bibliothek, nicht in den »Aktenschrank« mit laufender Frist.

Mila schreibt Bausteine — eine Rüge-Argumentation, ein Memo, eine Klausel-Prüfung. Bisher lebten die in dem einen Gespräch, in dem sie entstanden. Jetzt kann eine Kanzlei einen guten Entwurf mit einer Aktion in die Bibliothek übertragen: gespeichert, durchsuchbar, wiederverwendbar — Firmenwissen statt Wegwerf-Antwort.

Der naheliegende Bau wäre gewesen, den Entwurf abzulegen wie jedes andere Dokument. Aber genau da steckt eine mietrechtliche Unterscheidung, die zählt.

Eine Akte hat eine Uhr. Ein Baustein nicht.

Ein Mandantsdokument trägt eine Aufbewahrungspflicht — die Sechs-Jahre-Frist der BRAO, gekoppelt an die Akte. Ein wiederverwendbarer Baustein trägt das nicht: kein Mandant, keine Frist, kein Aktenbezug. Ihn in den »Aktenschrank« zu legen, wäre falsch — er bekäme eine Frist, die ihm nicht zusteht.

Also liegt ein gespeicherter Entwurf im Firmenwissen, nicht in der Akte. »Speichern« setzt nur eine Sichtbarkeit — das Dokument bewegt sich nicht — und die Bibliothek zeigt es als direkten Verweis, schreibgeschützt, nie als Kopie. Eine Quelle, zwei Ansichten.

  • Spine Entwurfs-Typen auf eine Quelle vereinheitlicht — Mila wählt jetzt selbst zwischen Argumentation (Baustein), Schriftsatz, Memo, Zusammenfassung und Prüfung, statt jede Anfrage in einen »Schriftsatz« zu zwängen.
  • UI Bausteine entstehen ohne Mandantendaten — nur Platzhalter, damit sie wirklich wiederverwendbar bleiben.
  • Spine Ehrliche Statusanzeige: ein fehlgeschlagener Entwurf zeigt nicht mehr grün »erledigt« — die Anzeige spiegelt jetzt das echte Ergebnis und wird bei einem Fehler rot.

Mandantengeheimnis, kontinuierlich bewiesen.

Mila prüft ab jetzt täglich und bei jeder neuen Version, dass die Trennwände zwischen- und innerhalb von Kanzleien halten — Mandantengeheimnis, Doppelmandat-Sperre, geschützte Nutzer:innen. Drei Garantien, zwei Ebenen, kein Vertrauen auf »haben wir doch geprüft«.

Vertraulichkeit ist bei einem Mietrechts-Produkt nicht ein Feature — sie ist das Produkt. Eine Kanzlei darf die Akten einer anderen nie sehen. Ein Doppelmandat — dieselbe Gegenseite auf beiden Seiten — muss hart blockiert sein. Geschützte Personen müssen geschützt bleiben. Das alles war schon abgesichert. Aber eine Garantie, die man nicht ständig nachprüft, ist keine Garantie — nur Vertrauen.

Deshalb prüft Mila diese drei Garantien jetzt selbst, fortlaufend, auf zwei Ebenen.

Zwei Ebenen, drei Garantien

Ein täglicher struktureller Scan liest die Zugriffsregeln der Datenbank und schlägt an, wenn sich ihre Form verschiebt — etwa wenn jemand eine Regel von Hand lockert. Eine Verhaltensprüfung bei jeder neuen Version spielt die Angriffe tatsächlich durch: sie versucht, fremde Daten zu lesen, ein Doppelmandat durchzudrücken, eine geschützte Person zu anonymisieren — und schlägt fehl, wenn auch nur eine dieser Mauern nachgibt. Die erste Ebene fängt die Regel, die aussieht wie immer, aber gelockert wurde; die zweite fängt die Regel, die richtig aussieht, aber falsch handelt.

Eine Garantie, die du nicht ständig nachprüfst, ist keine Garantie — nur Vertrauen.

Was der Bau selbst zutage förderte

Als wir uns an die Festigung der Trennwände gemacht haben, hat unser Research zwei Stellen aufgedeckt, an denen eine Trennwand dünner war als sie sein durfte. Beide waren latent — das System trägt noch keine echten Mandatsdaten — und beide wurden geschlossen, bevor die erste Kanzlei jemanden einlädt. Genau dafür baut man den Monitor: nicht damit nie etwas driftet, sondern damit das Driften auffällt, solange es noch nichts kostet.

  • Spine Struktureller Scan über sechs Arten von Abweichung (von Hand gelockerte Regeln, fehlende Schreib-Sperren, wieder freigeschaltete anonyme Zugriffe) — täglich, als priorisiertes Signal der Systemüberwachung.
  • Spine Verhaltens-Prüfungen für alle drei Garantien bei jeder neuen Version: Lesen über Kanzlei-Grenzen hinweg, Doppelmandat-Sperre, Schutz vor Anonymisierung — jede als echter Probe-Angriff, der fehlschlagen muss.

2.993 Verweise zwischen Urteilen: deterministisch, kein Modell.

Wo wird welches Urteil zitiert? Jetzt als Netz aus echten Aktenzeichen — jeder Verweis trifft ein echtes Urteil. Hier hat kein Modell geraten.

corpus_citations · Netz
Zitat-Verweise
2.993
deterministisch extrahiert
Halluziniert
0
kein Modell in der Extraktion
Regex zieht das Aktenzeichen, ein Hash-Join trifft das passende Urteil. Existieren beide, entsteht ein Verweis — sonst nicht. VIII ZR 45/19 ist mit 61 eingehenden Zitierungen das meistzitierte Urteil.

Seit dem Rechtsprechungs-Browser steht der Corpus durchsuchbar da — aber durchsuchbar heißt noch nicht vernetzt. Ein Urteil zitiert andere Urteile, und genau diese Verbindungen waren bisher unsichtbar. Jetzt nicht mehr.

Wir haben 2.993 Verweise aus den Volltexten gezogen: ein Suchmuster liest jedes Aktenzeichen im BGH-Format, ein exakter Abgleich trifft es gegen das Aktenzeichen eines anderen Corpus-Urteils. Keine Konfidenz-Schwelle, keine unscharfe Übereinstimmung, kein Modell. 519 Urteile werden zitiert, 762 zitieren — und das meistzitierte Urteil, VIII ZR 45/19, trägt 61 eingehende Zitierungen.

Welches Urteil gilt hier eigentlich

Die Frage in der Beratung ist selten »existiert das Urteil« — sie ist »welches der zitierenden Urteile trägt meinen Fall«. Dafür gibt es jetzt die Zitations-Vorschau: ein Klick auf ein Aktenzeichen unter »Wird zitiert von« öffnet die Kernpassage, den Sachverhalt und die §§ des zitierenden Urteils — ohne die Seite zu verlassen. Mit ↑ und ↓ blätterst du durch alle Zitierenden, Enter springt auf die volle Seite.

Du musst nicht mehr raten, welches Urteil einschlägig ist. Du blätterst durch die, die es tatsächlich zitieren.

Die Vorschau-Daten sind beim Build in die Seite eingebettet — kein Server-Aufruf zur Laufzeit, keine Fabrikation, dieselben Felder, die auch die Vollseite rendert. Und weil das Netz weiß, wie oft ein Urteil zitiert wird, sortiert die Liste jetzt nach Relevanz statt nach Zufall: das meistzitierte Urteil steht oben.

  • UI Öffentliche Corpus-Flächen auf das Monocle-Register umgebaut — Übersicht, Themen, §-Seiten und Urteils-Detail, auf die Corpus-Seiten beschränkt (.corpus-monocle).
  • Search Instanz-Filter (BGH · OLG·LG · AG) grenzen die Liste ohne Neuladen ein; zusätzlich Sortierung nach Datum neben der neuen Relevanz-Reihung.
  • Corpus stripScraperBoilerplate() entfernt Navigations-Reste und Randnummern-Artefakte — der Volltext öffnet jetzt auf dem echten Tenor statt auf den Resten der Quell-Seite.
  • Corpus Echte Zeilen-Inhalte über headnotes || sachverhalt_summary statt des »Leitsatz aus Corpus«-Platzhalters, der echten Text verdeckt hat.
  • UI Nav-Abstand korrigiert — Inhalt lag unter der fixierten Navigation.
  • Copy Entjargonisiert: »Tier« → Instanz, »Federal« → Bundesweit über Sortier-Label, Marginalien und SEO-Beschreibung.

Denken v3: die Vorschau kann nicht lügen.

Unser Editor für die Denken-Essays rendert Web-Vorschau und veröffentlichten Essay durch dieselbe Komponente; die E-Mail-Vorschau ist das Newsletter-Template selbst, im iframe. Was wir im Editor sehen, ist, was erscheint.

_shared/denken-email-template.ts
// ein Template
export function buildNewsletterHtml(essay) { /* ... */ }

// Konsument 1 — der echte Versand
import { buildNewsletterHtml } from "../_shared/denken-email-template.ts"

// Konsument 2 — die Admin-Vorschau (iframe srcDoc)
import { buildNewsletterHtml } from "../_shared/denken-email-template"
Ein Template, zwei Konsumenten. Versand und Vorschau rendern dieselbe Funktion — die Vorschau ist ein iframe srcDoc genau dieser E-Mail. Für die Web-Seite macht DenkenEssayArticle dasselbe: veröffentlichter Essay und Vorschau, eine Komponente.

Wir schreiben die Denken-Essays in einem eigenen Editor — Werkzeug, kein Produkt, sieht außer uns niemand. Aber eine Vorschau darin ist trotzdem ein Versprechen: so wird es aussehen. Und die meisten Editor-Vorschauen brechen dieses Versprechen leise — sie rendern über einen zweiten, nachgebauten Pfad, und irgendwo zwischen Entwurf und Veröffentlichung driftet die Darstellung. Ein Absatz sitzt anders, ein Pullquote bricht um, die E-Mail sieht anders aus als die Seite.

In der dritten Version des Editors gibt es diesen zweiten Pfad nicht mehr.

Eine Komponente für Web und Vorschau

Der veröffentlichte Essay unter /denken/[slug] und die Vorschau im Editor rendern jetzt durch dieselbe KomponenteDenkenEssayArticle, mit derselben ESSAY_CSS. Es gibt keine zweite Implementierung, die abweichen könnte: die Vorschau ist die veröffentlichte Seite, nur mit anderem Inhalt.

Die E-Mail-Vorschau ist die E-Mail

Newsletter sind die klassische Drift-Falle — Mail-Clients rendern anders als Browser. Also liegt das Versand-Template (tabellenbasiert, Charter/Georgia-Serif, paper-ink, mail-client-sicher) in einem einzigen Modul, das beide Seiten importieren: die Funktion, die wirklich verschickt, und die Vorschau im Admin, die es in einem iframe srcDoc zeigt. Was wir vor dem Versand sehen, ist exakt die E-Mail, die im Postfach landet.

Darunter friert ein Snapshot-Modell jede Veröffentlichung ein: die öffentliche Seite liest append-only Snapshots aus denken_essays_live, sortiert nach source_version. Neu veröffentlichen heißt, einen frischen Snapshot zu prägen, der die Ansicht gewinnt — Versionen gehen nie verloren.

  • UI Pullquote, eins pro Essay — markiert die Auswahl und hebt ein vorheriges Pullquote automatisch auf — kein doppeltes Hervorheben mehr.
  • UI Editorial-Register im Editor: Autosave-Pille, Bestätigungs-Modal, eigene Vorschau-Tabs für Web und E-Mail, sechs Tastaturkürzel.
  • Spine Versionierung erfasst jede Änderung an Titel, Dek und Body als Snapshot (autosave / named / restored / published); Wiederherstellen aus dem Versionen-Panel.
  • UI Essay-Liste nach Reihe → Nummer sortiert mit Reihe · NN-Spalte; eine geänderte Nummer ordnet die Liste neu.
  • UI TipTap-Duplicate-Extension-Warnung (link/underline) stillgelegt.
  • UI Höhe des Pullquote-Buttons im Frontmatter an die Zeile angeglichen.

Unterschriften-Set: was angezeigt wird, wird auch unterschrieben.

Die Einwilligung im Mandant:innen-Konto zählt jetzt genau die Dokumente auf, die das Mandat tatsächlich signiert — aufgelöst über denselben Pfad, der die PDFs rendert.

Eine Einwilligung ist nur so viel wert wie ihre Präzision. Wenn jemand einer Liste von Dokumenten zustimmt, muss diese Liste exakt die Dokumente sein, die danach unterschrieben werden — nicht eine fest verdrahtete Annäherung, die mit der Zeit von ihr abdriftet.

Genau das haben wir geschlossen. Die Unterschriftsfläche im mein-Konto — Desktop wie Mobil — leitet die anzuzeigenden Dokumente jetzt aus derselben Quelle ab, aus der auch die PDFs entstehen. Die Einwilligung zählt die vier echten Dokumente auf: Vollmacht, Honorarvereinbarung RVG, Widerrufsbelehrung, Datenschutzerklärung — und nur diese.

Ein Pfad, eine Wahrheit

Darunter sitzt eine neue, strikt lesende Edge-Function, resolve-case-signing-set: sie holt den Fall RLS-geschützt — die Datenbank erzwingt die Eigentümerschaft, nicht der Client — und läuft durch denselben Auflöse- und Render-Pfad wie die signierten PDFs. Bereits unterschriebene Flächen lesen den eingefrorenen Snapshot in signed_template_keys: was unterschrieben wurde, bleibt, was es war.

Die Liste, der du zustimmst, ist die Liste, die du unterschreibst.

Im Browser durchgelaufen — vier Dokumente, korrekte Einwilligung, PDF-Glyphen, scrollbare Seite. Live.

  • UI Unterschriftsfläche poliert: Platzhalter-Icon durch ein PDF-Glyph ersetzt, Vertretungs-Copy vereinheitlicht.
  • UI mein-Desktop »Mein Fall« war nicht scrollbar — fehlender Scroll-Container im Fall-Tab-Wrapper behoben.
  • Spine Signing-Gate abgeglichen: das Desktop-Gate zählte nicht existierende Dokumente als ausstehend, sodass ein fehlendes Dokument die Unterschrift blockieren konnte — an das Mobile-Verhalten angeglichen.
  • Templates Counterparty-Variablen in Vollmacht und Widerrufsbelehrung auf {{kanzlei_name}} vereinheitlicht; auf prod render-verifiziert.
  • UI /changelog re-stylte versehentlich die echte Nav und den Footer — das eingebettete Fragment wird jetzt unter .changelog-root gescoped, sodass seine Resets nicht mehr global lecken.
v1.4.2

Zitat-Disziplin: keine AZs aus dem Gedächtnis.

Die häufigste Halluzination im Mietrechts-RAG ist nicht das erfundene Aktenzeichen — sondern das echte, an die falsche Aussage geheftet. Wave D schließt das.

UI · CITE-GATE v2
BGH Urteil vom 14.03.2024 · VIII ZR 22/23

»Die qualifizierte Rüge nach § 556g BGB erfordert eine Bezifferung der monatlichen Rückforderung.«

Topic-Match · AZ verifiziert · Behauptung gedeckt
Topic-Match-Enforcement · Jedes AZ wird nicht nur auf Existenz, sondern auf Doktrin-Übereinstimmung mit der Aussage geprüft. Binary success criterion. Regex + 9 Wave-D-Files im Scope.

Die Failure-Mode, die uns am meisten gekostet hat, war nicht die klassische Halluzination. Es war das echte Aktenzeichen — verifiziert im Corpus, sauber geschrieben, mit allem drum und dran — angeheftet an eine doktrinale Behauptung, die das Urteil so nie getroffen hat. Das Cite-Gate ging durch. Der Output sah aus wie sauberes Mietrecht. War es aber nicht.

Wir nennen das Proposition-Misattribution. Es ist gefährlicher als reine Halluzination, weil es nicht nur Vertrauen kostet — es passt auch durch jeden naiven Verifier durch. Das AZ existiert. Das Urteil ist real. Die Verknüpfung ist falsch.

Was sich geändert hat

Wave D fügt einen zweiten Gate-Layer über die existierende AZ-Verifikation. Jedes emittierte AZ muss jetzt zusätzlich einen Topic-Match-Test bestehen: gleicht das doktrinale Thema, das die Behauptung trägt, dem doktrinalen Thema, das durch das Urteil tatsächlich entschieden wurde?

Konkret: wir haben Regex-Patterns über alle cite_emit-Stellen gezogen und neun Wave-D-Files in Scope gebracht. Binary success criterion — entweder Topic-Match passt, oder das AZ wird nicht emittiert. Keine Konfidenz-Schwellen, keine fuzzy matches.

Was als Nächstes kommt

Citation-Integrity-Audit, geplant nach 24h Pipeline-Stabilität. Strukturelle Prüfung über alle bisher emittierten Drafts: existiert das AZ, sagt das Urteil tatsächlich was der Draft behauptet. Audit-Output wird hier veröffentlicht.

  • RAG Reranker-Tuning für Mietpreisbremse-Cluster. Topic-Embeddings priorisieren §§ 556d–g vor allgemeinem Mietrecht.
  • UI Befund-Approval: Sidebar-Spacing erhöht. Editorial-Section-Heads jetzt mit Hairline-Top-Rule statt 2px-Ink.
  • Spine Stage 01 analyse-document handler-coverage von 7 auf 9 doc_type-Familien.
  • Auth Bug behoben: accept-invite erlaubte unter bestimmten Race-Conditions doppelte team_members-Einträge. Datenbank-Trigger jetzt durchsetzend.
  • Email Postmark-Bounce-Logs werden bei Soft-Bounces nicht mehr als Hard-Failures markiert.
v1.4.1

Rechtsprechungs-Browser: 1.178 Entscheidungen, neun Themen, eine Tür.

Was bei Grüneberg in 800–1.200 zitierten Entscheidungen steht, steht jetzt auch bei uns — durchsuchbar, gefiltert, mit Topic-Tags.

/rechtsprechung/corpus
Rechtsprechung · Themen 1.178 Urteile
Mietpreisbremse §§ 556d–g BGB · Kappung, qualifizierte Rüge, Rückforderung
312
Mängelanzeige § 536 BGB · Minderung, Mängelrechte
187
Mieterhöhung §§ 558–559 BGB · Vergleichsmiete, Modernisierung
156
Räumungsabwehr § 543 BGB · außerordentliche Kündigung
98
697 BGH · 481 Regionalgericht. Nur Mietrecht. Nicht inflationiert, nicht hochgerechnet.

Der Grüneberg-Kommentar zitiert je nach Auflage 800 bis 1.200 mietrechtliche Entscheidungen. Das ist die Benchmark, an der wir uns gemessen haben — und an der wir uns weiter messen lassen. Mit 1.178 verifizierten Entscheidungen sind wir auf Augenhöhe.

»Verifiziert« heißt: jede Entscheidung wurde händisch geprüft, die Doktrin getaggt, die Zitate normalisiert. Keine Web-Scrapes, keine LLM-generierten Zusammenfassungen, kein Fluff aus 5.181 Nicht-Mietrechts-Urteilen in der gleichen Datenbank.

Neun Themen-Kacheln

Die Themen-Übersicht auf /rechtsprechung/corpus spiegelt jetzt die echten DB-Counts: Mietpreisbremse, Mängelanzeige, Mieterhöhung, Räumungsabwehr, Betriebskosten, Schönheitsreparaturen, Untermiete, Eigenbedarf, Kaution. Vierzehn § -Landing-Pages dazu. Einschätzungs-Tool unter /rechtsprechung/einschaetzung.

Was das für die Beratung verändert: du musst nicht mehr glauben, dass das Urteil existiert. Du siehst es. Mit Volltext, mit Doktrin-Tags, mit verlinkten Folge-Entscheidungen.

  • UI Themen-Kacheln: Hairline-Hover statt Drop-Shadow. Editorial-Register beibehalten.
  • Search Volltext-Search über alle 1.178 Urteile. Inverted Index mit Postgres FTS.
  • Tags Doktrin-Tags über 47 Sub-Themen. Mehrfach-Tagging möglich pro Urteil.
  • SEO 14 § -Landing-Pages für Long-Tail-Suchen. Strukturierte Daten ausgespielt.
v1.4.0

Editorial-Register, end-to-end.

Mila sieht jetzt wie Mila aussehen sollte. Source Serif 4 überall, Cream-Paper statt Weiß, Hairlines statt Schatten, italische Akzente, kein Rounded.

Canonical · Toggle
Fall-Updates per E-Mail
Mila-Toggle · 36 × 20, solid ink an, #d8d8d6 aus, 14 × 14 White-Knob. Verwendet auf Kanzlei-Settings, Mandant-Konto, Vorlagen-Editor.

Der Reskin hat acht Wochen gedauert. Drei Surfaces, ungefähr fünfzig Templates, ein neuer Token-Layer, ein neuer Komponenten-Katalog. Was vorher wie ein generisches SaaS-Dashboard aussah, sieht jetzt wie ein Editorial-Produkt aus — Schriftgröße, Spacing, Hairlines, Farben.

Die wichtigste Entscheidung: kein Mode-Switch zwischen »Marketing« und »Produkt«. Die Login-Seite, das Dashboard, der Vorlagen-Editor, der Mandant-Widget — alle auf der gleichen Tokensauce. Wenn ein Kanzlei-Mitarbeiter morgens auf der Marketing-Seite war und nachmittags im Admin sitzt, soll sich das wie das gleiche Produkt anfühlen.

Was sich konkret geändert hat

  • TypeSource Serif 4 als Body-Schrift überall, mit opsz 8..60 Mapping pro Tier. Inter nur noch für Chrome, Mono für Codes.
  • ColorCream-Paper #f6f4ef als Default-Background. White nur noch für Inputs und Karten.
  • Rule0px Corners überall. Pills nur für Toggles und Status-Dots.
  • ShadowHairlines statt Shadows. Karten-Schatten entfernt, durch 1px-Rule-Borders ersetzt.
  • VoiceItalic-Akzent-Pattern: Headlines mit upright Body, italic em-Sub. Lifted aus Editorial-Register.
  • UI Vorlagen-Editor: TipTap-Mention-Extension kollidierte mit Editorial-Section-Heads. Event-Scoping mit stopPropagation gefixt.
  • UI Mobile-Nav Burger-Animation jetzt mit korrektem Timing.
  • Auth Passwordless-Login-Code-Slab: Auto-Focus nach Code-Eingang.
  • Email Postmark-Templates auf Editorial-Register umgestellt — Source Serif als Body mit Fallback auf Georgia für Mail-Clients ohne Webfont.
  • A11y Toggle-States lesbar für Screen-Reader (aria-checked).
  • Perf Source Serif 4 variable Font preloaded — FOIT auf erstem Page-View reduziert.
v1.3.6

Postmark statt Brevo.

Brevo hat Zustellungen nach Berlin verschluckt. Postmark nicht.

Postmark · Outbound Log
SENT STATUS
19·05 22:15 rechtsanwalt@kanzlei-pankow.de Delivered
19·05 22:14 m.greinke@icloud.com Delivered
19·05 22:13 immi@immi-rechtsanwaelte.de Delivered
19·05 22:08 k.agatsy@mietrecht-pankow.de Delivered
99,7 % Delivery-Rate seit Migration, ~14 s mediane Latenz. Vorher: 87 %, ~45 s, mit unerklärlichen Bounce-Spitzen am Nachmittag.

Brevo hat funktioniert — bis es nicht funktionierte. Wir hatten Wochen, in denen 13 Prozent unserer Bestätigungsmails nie ankamen, ohne Hard-Bounce, ohne Log-Eintrag. Migration ist nie sexy. Aber für ein Produkt, in dem ein verlorener Bestätigungs-Code bedeutet, dass eine Vollmacht-Signatur 24 Stunden später unterzeichnet wird statt sofort, ist Zustellrate das Produkt.

Postmark ist teurer pro Mail. Es ist auch der Anbieter, den Stripe für ihre Tx-Emails nutzt. Damit können wir leben.

v1.3.0

HARD RULE § 3: Anwalt approves alles.

Die größte Architektur-Entscheidung dieses Quartals ist auch die unbeliebteste — bei den LLM-Maximalisten. Jeder Befund, jeder Draft, jeder Send braucht eine Anwalts-Freigabe. Keine Ausnahmen.

Das ist nicht negotiable, und das ist auch nicht Conservatism — das ist Tatsachenanerkennung. Die Berufsordnung verlangt es. Die Mandanten verlangen es. Und ehrlich gesagt: das LLM ist es noch nicht wert, ohne Aufsicht ein Mandat zu führen. Vielleicht in zwei Jahren. Heute nicht.

Wie das in der Praxis aussieht

Stage 01 ist eine Acht-Schritt-Schleife: Dokumente werden hochgeladen, von der KI analysiert, in Befunde überführt, der Anwalt approves einzelne Befunde oder alle, dann approves er die nächste Stage. Stages 02, 03, 04 folgen einer ähnlichen Choreografie: Draft → Review → Approve + Send → Wait → Classify → Approve Classification + Next Stage → Route.

Was das mit der Geschwindigkeit macht: nichts. Die LLM-Arbeit ist parallelisiert. Die Anwalts-Approval-Zeiten sind Minuten, nicht Stunden. Was es mit der Zurechenbarkeit macht: alles. Jeder Befund hat einen Approver. Jeder Draft hat einen Approver. Jeder Send hat einen Approver. Wenn etwas schiefgeht, weiß man wer.