Consent-Pflicht für Personen liegt im Datenbank-Schema, nicht nur im Code
Das Tool darf Personen als Eintrag erfassen, etwa Gründerinnen oder akademische Autorinnen. Damit greift die DSGVO-Informationspflicht, auch wenn die Daten aus öffentlichen Quellen stammen. Reine Validierung im Server-Code wurde verworfen, weil sie über direkten Datenbank-Zugriff umgangen werden kann, über Migrations, manuelle Importe oder ein DB-Studio. Stattdessen sitzt die Garantie eine Ebene tiefer als harte Sperre im Schema: ein Check-Constraint weist jeden Insert oder Update einer Person ohne gesetzten Consent-Zeitpunkt zurück. Dazu kommen zwei weitere Linien, ein signierter Opt-Out-Token pro Person für ein formloses Austragen und ein Pflicht-Template für die Informations-Mail, deren Versand protokolliert wird. Der Preis ist ein zweistufiges Onboarding für Personen, Insert, Mail, dann Consent setzen, das nicht in einem einzigen Worker-Durchlauf erledigt werden kann. Lehre: wenn eine Regel nicht verletzt werden darf, gehört sie an die Stelle, die kein Pfad umgeht, und das ist die Datenbank, nicht die Anwendung.
Sichtbares Ranking als offengelegte Formel statt gelerntem Modell
Für die Reihung der Akteure nach Prominenz wurde bewusst keine gelernte Rangordnung gebaut, sondern eine deterministische, vollständig offengelegte Formel: ein gewichteter Wert aus sechs Faktoren wie unabhängige Quellen, Aktualität und Reichweite, nächtlich neu berechnet und auf einer eigenen Methodik-Seite veröffentlicht. Die Gewichte leben in einer einzigen Konstante, die sowohl die Berechnung als auch die öffentliche Seite verwendet, dadurch kann die gezeigte Formel niemals von der gerechneten abweichen. Zwei Gründe trugen die Entscheidung. Erstens muss die Frage warum steht X über Y eine ehrliche Antwort haben, ein gelerntes Modell könnte das nicht erklären. Zweitens ist ein festes Regelwerk mit publizierten Gewichten kein KI-System im Sinne der EU-Regulierung, was den rechtlichen Rahmen vereinfacht. Eine wichtige Fairness-Eigenschaft: fehlt einem Akteur ein Signal strukturell, etwa wissenschaftliche Zitationen bei einem Mode-Startup, fällt dieser Faktor aus Zähler und Nenner heraus und wird nicht als Null gewertet. Lehre: ein nach außen sichtbares Ranking sollte erklärbar und reproduzierbar sein, sonst wird jede spätere Gewichtsänderung zu einem Vertrauensbruch.
Öffentliche DB-Routen auf force-dynamic statt Build-Time-Prerender
Next.js 16 hat die öffentlichen Routen /entities, /e/[slug] und /v/[vertical] zur Build-Zeit vorgerendert. Da der Build-Container keine erreichbare Datenbank-Verbindung kennt, schlug der Build mit ECONNREFUSED fehl. Die Routen wurden auf export const dynamic = 'force-dynamic' umgestellt. Der Lesezugriff erfolgt nun pro Request auf dem laufenden Container, auf dem die Datenbank erreichbar ist. Bei der aktuellen Größe von unter 250 Einträgen ist der fehlende Edge-Cache kein Problem. ISR oder ein ephemeres Build-Postgres wurden geprüft und verworfen, da sie die Ursache nicht treffen.