KDAI unter der Haube
Die Grundidee: Ein KI-orchestrierter Desktop — nicht installiert, sondern instanziiert. Grundlage ist ein Persönlichkeits-Kernel: eine kleine, verschlüsselte, versionierte Selbstbeschreibung, die an beliebigen Orten instanziiert und fortgeführt werden kann — auf jedem Rechner, in jeder VM, notfalls im Browser. Jede Instanz kompiliert daraus denselben Desktop, compile(me.md, Umgebung) → Desktop, und was sie lernt, fließt in den Kernel zurück: ein System, das der Person folgt statt der Maschine.
Diese Seite erklärt, wie: das Datenmodell, die Schlüsselarchitektur, die vier Protokolle, die Steuerung über git als Control-Plane — und das Threat-Model mit seinen heutigen Lücken. Alles hier Beschriebene läuft, sofern nicht ausdrücklich als Design markiert (validiert August 2026, Plasma 6.6 / Ubuntu 26.04).
1 · Datenmodell: der Kernel
Eine Markdown-Datei (me.md) mit YAML-Frontmatter. Fünf Sektionen mit explizitem Vertrauensgefälle: identity und facts (verbindlich) · preferences (weich) · rules (unverletzlich ohne Zustimmung je Sitzung) · episodic (aktuell, möglicherweise veraltet). Jeder Eintrag trägt eine stabile ID ({#r-001}) und eine Provenienz-Zeile — wann, von wem (Mensch, KI, Maschine). Das Frontmatter reserviert eine DID (did:kdai:…, bislang ohne externe Registry). Sektionen sind als MCP-Ressourcen (me://rules …) adressierbar gedacht — der eine Engpass, an dem Regeln durchgesetzt und Zugriffe protokolliert werden.
Das Invariant: Der Kernel speichert Bedeutung, nie Konfiguration. „Vormittags fokussiert, minimale Ablenkung" — nicht „Panel unten, Widget X". Plattform-Backends übersetzen; deshalb ist derselbe Kernel auf Plasma, in einer VM oder in einem Chat-Client brauchbar.
2 · Schlüsselarchitektur
| Material | Typ | Entsteht | Liegt | Zweck |
|---|---|---|---|---|
| Master-Identität | age X25519 | einmal, bei der Gründung (Browser oder vertraute Maschine) | nur passphrase-verschlüsselt (scrypt) als master-key.age im Repo; Klartext nie persistent | Wurzel der Autorisierung: entschlüsselt den Kernel, nimmt neue Geräte auf |
| Passphrase | menschliches Geheimnis | bei der Gründung gewählt | ausschließlich im Kopf; wird bei Eingabe direkt an scrypt verfüttert | Wächter der Master-Identität — bewusst austauschbar (später FIDO2/Biometrie) |
| Maschinen-Identität | age X25519, je Gerät | beim Erstboot, lokal aus dem CSPRNG | privat: nur auf dem Gerät (~/.config/kdai/age.key, 0600); öffentlich: im Register | Alltagsentschlüsselung ohne Passphrase |
| Deploy-Key | ssh ed25519, je Gerät | beim Erstboot, lokal | privat auf dem Gerät; öffentlich beim Repo-Host | Transport-Autorisierung zum Repo (read/write) — orthogonal zur Inhalts-Verschlüsselung |
3 · Die vier Protokolle
Gründung (einmal pro Person — im Browser, komplett clientseitig)
- Deterministischer Dialog erfragt Name, Präferenzen, Passphrase, Repo-Ziel; Sprache/OS/Zeitzone werden erkannt, nie gefragt.
- Im Browser: Master-Identität erzeugen (age-js) →
master-key.age(scrypt via Passphrase) → Kernel aus Vorlage generieren (inkl. Default-Regeln r-001…r-003) → an Master verschlüsseln → Register mit Master-Pubkey. - Publikation: GitLab-API (Token) oder ein kopierbares Bundle-Skript (armored age-Dateien als Heredocs,
git init && push). Geheimnisse werden nach Gebrauch aus dem Speicher gelöscht; nichts davon verlässt den Browser unverschlüsselt.
Beitritt / Enrollment (einmal pro Gerät — Selbst-Autorisierung)
- Gerät erzeugt lokal age-Schlüssel + Deploy-Key (CSPRNG); Deploy-Key wird beim Repo-Host hinterlegt (heute manuell — der eine menschliche Trust-Schritt).
git clone→ Gerät hat Ciphertext, kann nichts lesen.- Passphrase-Eingabe → Master-Identität wird nur im RAM entsperrt → Kernel entschlüsselt → Gerät hängt seinen Pubkey ans Register → verschlüsselt den Kernel an die erweiterte Empfängermenge neu → committet + pusht („enroll").
- Ab jetzt Alltagsbetrieb ohne Passphrase; Klartext-Master und Passphrase werden verworfen.
Jeder Boot (Steady State)
- systemd-User-Instanz startet beim Boot (Linger):
git pull --rebase→age -dmit Maschinenschlüssel →me.md; OrdnungBefore=plasma-workspace.targetgarantiert: Kernel vor Shell. - Grafische Sitzung startet (Autologin + sofortige Sperre); Begrüßung meldet Namen + Kernel-Commit-Zeit.
- Reconciler: liest Ist-Zustand der Shell (DBus), diff't gegen
desktop-spec.jsonaus dem Repo, wendet nur die Differenz an. Idempotent — zweiter Lauf: null Operationen.
Sync (fortlaufend)
- Alle 10 min und bei Logout/Shutdown: SHA-256-Wächter über
me.md— nur bei echter Änderung wird neu verschlüsselt (age ist nicht deterministisch; ohne Wächter gäbe es Phantom-Commits), committet, gepusht. - Andere Geräte erhalten den Stand bei ihrem nächsten Pull. Konflikte:
--rebase --autostash; die git-Historie ist zugleich das Audit-Log (welches Gerät wusste wann was).
4 · Steuerung: git als Control-Plane
Es gibt keinen Steuer-Port und keine Fernsteuerungs-Session. Wer das System ändern will — Mensch oder Agent, von jedem Gerät — ändert Deklarationen im Repo: den Kernel (Bedeutung) oder die Desktop-Spec (abgeleitetes Soll). Jede Maschine reconciled sich beim nächsten Pull selbst. Eingehende Konnektivität ist ausschließlich Debug-Werkzeug. Das ist dieselbe Bewegung wie GitOps, nur dass die „Infrastruktur" hier eine Person samt ihrer Arbeitsumgebung ist — und der Diff-and-Apply-Schritt nötig bleibt, weil Plasmas eigener Layout-Load additiv ist (validierter Befund, nicht Annahme).
5 · Agenten: Rolle statt Modell, Regeln als Policy
Die KI ist eine Rolle mit Regressionskaskade: Frontier-Cloud → alternative Cloud (der Kernel ist vendor-neutral) → lokales Modell → deterministischer Boden: alle Mechanik (Sync, Enrollment, Reconciler, Storage) ist skriptbasiert und läuft ohne jede KI — Totalausfall aller Modelle degradiert das System zu „dümmer, aber betriebsfähig". Der Router ist Policy-Gate und Dispatcher zugleich: rules aus dem Kernel binden jede Stufe (nichts aus dem Kernel ohne Zustimmung je Sitzung in die Cloud; keine identitätsgebundenen Anfragen; Speicherentscheidungen ≥ 7 Tage umkehrbar und protokolliert). „Nicht erreichbar" und „darf nicht erreichbar sein" lösen dieselbe Regression aus.
6 · Threat-Model — was hält, was (noch) nicht
| Angriff / Verlust | Stand |
|---|---|
| Repo-Host kompromittiert | liest nur Ciphertext (Kernel) + Klartext-Mechanik/Spec + Metadaten (Commit-Zeiten, Größen, Gerätenamen in Kommentaren). Kann Historie manipulieren — Commits sind nicht signiert (Lücke, s. u.). |
| Gerät verloren/gestohlen | Widerruf: Registerzeile streichen, neu verschlüsseln, Deploy-Key beim Host löschen. Aber: alte Ciphertexte der Historie bleiben für den alten Schlüssel lesbar (kein Re-Key der Vergangenheit) und der Klartext-Kernel liegt auf dem Gerät — ohne Festplattenverschlüsselung real exponiert. |
| Passphrase-Bruteforce offline | möglich für jeden mit Repo-Kopie; scrypt verteuert, ersetzt aber keine starke Passphrase. Der Wächter ist als austauschbar entworfen (FIDO2/Biometrie statt Passphrase — Design). |
| Böswilliger Kernel-Push | wer Schreibzugang + Registerplatz hat, ist eine autorisierte Maschine — by design. Schutzlinie ist das Register + Transport-Tor, nicht der Inhalt. |
| Lücke: unsignierte Commits | Enrollment- und Sync-Commits sind nicht kryptografisch ans Gerät gebunden; Gerätesignaturen (ssh-Signing mit dem Deploy-Key) wären der natürliche nächste Schritt. |
| Lücke: Schlüssel auf Platte | Maschinen-age-Schlüssel ist eine Datei (0600), kein TPM/Keychain/Secure-Enclave-Gating; Seed ohne LUKS. Beides Design-Backlog (§4 der Architektur). |
| Lücke: keine Forward Secrecy | statische age-Empfänger; ein später kompromittierter Maschinenschlüssel öffnet alle Ciphertexte, die je an ihn gingen. Mitigation heute: Historie neu aufsetzen bei Schlüsselverlust. |
| Lücke: Frühe Historie | das Laborsystem trägt Klartext-Beispieldaten in alten Commits; produktive Systeme starten mit frischer Historie (Gründungsseite tut das bereits). |
7 · Status
Validiert (Aug 2026): Gründung im Browser · Enrollment per Passphrase in frischer VM · Multi-Device (3 Registereinträge) · verschlüsselter Sync mit Audit-Historie · Boot-Ordnung Kernel-vor-Shell · idempotenter Reconciler · Storage-Tier (Nextcloud, protokolliert/umkehrbar) · generisches Seed-Image (arm64). Design: MCP-Modul-Laufzeit mit Manifest/Sandbox · lokales Modell als Default-Agent · Hardware-Gating der Schlüssel · Commit-Signaturen · x86_64/VHDX-Pipeline · Launcher-Kaskade bis zum Browser-Boden.