docs: finalize Gemini privacy handoff

This commit is contained in:
2026-07-30 18:13:01 +02:00
parent a0af15a037
commit a6e4576848
7 changed files with 108 additions and 49 deletions
+13 -10
View File
@@ -8,12 +8,12 @@ Javis beginnt als modularer Monolith. Module besitzen klare Zuständigkeiten und
1. Interface: implementierte CLI; später möglicherweise Sprache, Mobilzugriff und Living Mind.
2. Core: implementierter Gesprächsablauf und Sitzungslogik.
3. Providers: kleine Schnittstelle und implementierter lokaler Ollama-Adapter.
4. Memory: implementierte SQLite-Sitzungen; ein semantischer Index ist nur geplant.
3. Providers: kleine Schnittstelle, lokaler Ollama- und optionaler Gemini-Adapter.
4. Memory: SQLite-Sitzungen und separates inhaltsfreies Provider-Audit.
5. Obsidian: zunächst lesender Adapter, später eng begrenzte Entwürfe.
6. Tools und Status: feste Schemas, Allowlists, Timeouts und bereinigte Ausgaben.
7. Security: Freigaben, Secret-Provider und Berechtigungsprüfung.
8. Audit: nachvollziehbare Aktionen ohne geheime Inhalte.
7. Security: lokaler Datenschutzrouter, Freigaben und Betriebssystem-Keyring.
8. Audit: Provider-Metadaten ohne Prompts, Antworten oder geheime Inhalte.
## Plattformgrenzen
@@ -24,10 +24,13 @@ Javis beginnt als modularer Monolith. Module besitzen klare Zuständigkeiten und
## Implementierter Chatfluss
`interface.cli` nimmt Text an, `core.chat_service` verbindet Sitzungsverlauf und
Provider, `providers.ollama` spricht nur die lokale Ollama-HTTP-API an und
`memory.sqlite_store` speichert erfolgreiche Benutzer-/Assistentenpaare atomar.
Scheitert das Modell, wird keine erfundene Antwort gespeichert.
`interface.cli` nimmt Text an und verbindet den `core.provider_router`.
Dieser klassifiziert die aktuelle Anfrage vollständig lokal, minimiert den
freigegebenen Kontext und wählt Gemini oder Ollama. `core.chat_service` speichert
erst eine erfolgreiche Antwort zusammen mit der Benutzernachricht atomar.
Es existiert kein Cloudadapter, Toolaufruf, Obsidian-Zugriff oder eigener
öffentlicher Netzwerkdienst. Der Ollama-Endpunkt muss eine Loopback-Adresse sein.
Gemini ist nur bei lokaler Aktivierung, vorhandenem Key, `free_only = true`,
bestätigtem Nicht-Billing und passender Datenschutzentscheidung erreichbar.
Ollama bleibt Loopback-, Datenschutz-, Offline-, Quota- und Fehlerfallback.
Es existiert weiterhin kein Toolaufruf, Obsidian-Zugriff oder eigener öffentlicher
Netzwerkdienst.
+21 -11
View File
@@ -58,11 +58,12 @@ Rootserver:
- Modelle liegen außerhalb von Git unter `D:\Javis-Data\ollama-models`.
- Der lokale Ollama-Dienst bindet nur an `127.0.0.1:11434`; PATH, Registry,
Autostart und Windows-Dienste blieben unverändert.
- CLI-Befehle: `/new`, `/sessions`, `/load <ID>`, `/clear`, `/help`, `/exit`.
- CLI-Befehle: `/new`, `/sessions`, `/load <ID>`, `/clear`, `/provider`,
`/privacy`, `/status`, `/help`, `/exit`.
- Sitzungsdaten liegen über `JAVIS_DATA_DIR` außerhalb von Git; der bestätigte
Smoke-Test nutzte `D:\Javis-Data\runtime\core-chat-smoke`.
- Kein Obsidian-, Laptop- oder Rootserverzugriff wurde implementiert.
- Keine Tool-, Sprach-, Mobil-, Status- oder Living-Mind-Funktion ist implementiert.
- Keine Tool-, Sprach-, Mobil- oder Living-Mind-Funktion ist implementiert.
- Offizielle Gemini-Prüfung abgeschlossen: `gemini-3.6-flash` und
`gemini-3.5-flash-lite` sind stabile GA-Modelle mit Free-Tier-Textnutzung;
Standard dieses Pakets wird ausschließlich `gemini-3.6-flash`.
@@ -107,8 +108,8 @@ Rootserver:
- Ollama-Provider akzeptiert nur lokale HTTP-Loopback-Adressen
- SQLite-Sitzungsspeicher mit atomaren Benutzer-/Assistentenpaaren
- Laufzeitdaten außerhalb von Git über `JAVIS_DATA_DIR` oder sicheren Plattformstandard
- aktuell ausschließlich lokales Modell; als separates Folgepaket ist Gemini als
bevorzugter kostenloser Provider für ausdrücklich cloudgeeignete Inhalte geplant
- Hybridprovider bevorzugt Gemini für cloudgeeignete Inhalte und verwendet
Ollama bei Datenschutz, Ablehnung, Offline-, Quota- und Providerfehlern
- strikter Nullkostenmodus ohne Billing-Aktivierung oder kostenpflichtigen Fallback;
lokales Modell bleibt Offline-, Datenschutz-, Ausfall- und Quota-Fallback
- Secret-Werte außerhalb von Code, Git, Prompts und Logs
@@ -202,6 +203,9 @@ Abnahmestatus:
- manuell durch Pascal getestet: am 30.07.2026 erfolgreich; CLI-Start, echte
deutsche Antworten, Sitzungskontext, `/sessions`, `/exit`, Neustart,
`/load <UUID>`, vollständiger Verlauf und Fortsetzung
- Gemini/Datenschutz/Fallback automatisiert durch Codex getestet: ja, nur mit
Test-Doubles und lokalem nachrichtenfreiem CLI-Smoke
- Gemini/Datenschutz/Fallback manuell durch Pascal getestet: noch nicht
- von Pascal für produktive Verwendung freigegeben: noch nicht ausdrücklich erklärt
## Git-Stand
@@ -219,6 +223,13 @@ Abnahmestatus:
- lokaler Merge nach `main`: `f3d6dfb`
- geprüfter und gepushter Abschlussstand vor diesem Handoff-Update: `0a550e6`
- Secret-Provider: `570e7fa`
- Datenschutz/Nullkosten: `286d96d`
- isolierter Gemini-Provider: `f3e1183`
- Hybridrouter: `e57186f`
- lokale Konfiguration: `ab6ea48`
- CLI-Verdrahtung: `af9426e`
- Startskript: `141ff2e`
- Resttests: `a0af15a`
- `origin` verwendet HTTPS
- kein Force-Push und keine umgeschriebene Historie
@@ -231,11 +242,13 @@ Abnahmestatus:
- aktuell: isolierte Python-Toolchain und reproduzierbare Entwicklungsumgebung
- aktuell: portable Ollama-Laufzeit und `qwen3:8b` außerhalb von Git verifiziert
- aktuell: lokaler CLI-Chat und persistente SQLite-Sitzungen vollständig abgenommen
- aktuell: Gemini-Free-Hybridrouting, Datenschutz und Nullkostenmodus
automatisiert vollständig geprüft; manueller Live-Test steht aus
## Offene Entscheidungen und Fehler
- endgültiger Produkt-/Repositoryname bleibt offen
- Startmechanismus für Ollama ist noch bewusst manuell und nur pro Prozess konfiguriert
- Startskript startet Ollama bei Bedarf pro Prozess; kein Autostart oder Dienst
- Antworten werden noch nicht gestreamt; Sitzungen besitzen noch keine Titel oder Suche
- genauer späterer Obsidian-Schreibbereich ist nicht freigegeben
- normaler Secret-Provider ist festgelegt: Betriebssystem-Keyring; eine
@@ -260,12 +273,9 @@ Abnahmestatus:
## Nächster sinnvoller Auftrag
Auf dem bestehenden Feature-Branch als nächstes einzelnes Arbeitspaket:
1. veraltete Architektur-, Sicherheits-, Changelog- und Nächste-Sitzung-Texte
auf den tatsächlich implementierten Stand bringen
2. Feature-Branch pushen und vor Pascals manuellem Live-Test stoppen
3. nicht nach `main` mergen
Pascal führt anhand `docs/NEXT_SESSION.md` den echten Gemini-, Ask- und
Never-Test mit ausschließlich künstlichen beziehungsweise unpersönlichen Daten
durch. Bis zu seiner Bestätigung nicht nach `main` mergen.
Keinen API-Key in Chat, Git, Obsidian, Logs oder Dokumentation übernehmen.
+2 -1
View File
@@ -10,7 +10,8 @@
| ADR-0006 | Ollama und qwen3:8b für den ersten Windows-Chat verwenden | angenommen |
| ADR-0007 | Gemini kostenlos bevorzugen, sensible Inhalte lokal halten und niemals Billing aktivieren | angenommen |
Offen bleiben insbesondere das endgültige Runtime-Secret-System, der genaue
Der normale Runtime-Secret-Speicher ist mit dem Betriebssystem-Keyring festgelegt;
keine XML-Secret-Datei. Offen bleiben insbesondere der genaue
Obsidian-Schreibbereich, das spätere Laptop-Modell und der Produktname.
Ausführliche Begründungen stehen unter [`docs/adr`](adr/README.md).
+35 -20
View File
@@ -2,29 +2,44 @@
## Ziel
Nächstes separates Featurepaket: kostenlose Gemini-Anbindung mit strikt lokalem
Datenschutzrouting und Ollama als Ausfall-, Quota-, Offline- und Sensitivitätsfallback.
Pascal nimmt den Gemini-Free-Provider und die lokalen Fallbacks manuell ab.
Bis dahin bleibt `feat/gemini-privacy-router` ungemergt.
## Vor Änderungen erneut prüfen
## Vorbereitung durch Pascal
1. `git status --short --branch`
2. `git log -1 --oneline`
3. `docs/PROJECT_STATUS.md`
4. offene Entscheidungen in `docs/DECISIONS.md`
1. In Google AI Studio einen neuen, nur für Javis verwendeten Gemini-Auth-Key
erstellen.
2. Für das zugehörige Google-Projekt kein Billing verbinden beziehungsweise den
externen Billingstatus selbst prüfen.
3. Den Key niemals in Chat, Codex, Git, Obsidian oder einen sichtbaren
Kommandozeilenparameter kopieren.
4. Im Repository ausführen:
## Vorgeschlagener Umfang
```powershell
& 'D:\Javis-Tools\uv\uv.exe' run javis configure gemini
& 'D:\Javis-Tools\uv\uv.exe' run javis secrets set gemini
powershell -ExecutionPolicy Bypass -File .\scripts\start-javis.ps1
```
- aktuelle kostenlose Gemini-Modelle, Kennungen und Kontingente ausschließlich in
offizieller Google-Dokumentation prüfen; Kandidaten nicht ungeprüft übernehmen
- Providerrouter mit `free_only = true` und ohne Billing-Konfiguration entwerfen
- lokale Datenschutzentscheidung `allowed`, `ask` oder `never` vor jedem Cloudaufruf
- Gemini-Key nur über lokalen Secret-Provider; Wert niemals an Modell, Git,
Obsidian, Logs, Dokumentation oder Chat geben
- Gemini-Erfolg, fehlenden/ungültigen Key, 429, Netzwerkausfall, lokalen Fallback,
`never`, `ask` und ausbleibende Billing-Aktivierung testen
Die erste Einrichtung verlangt zwei lokale Bestätigungen. Der zweite Befehl liest
den Key verdeckt ein und speichert ihn im Windows Credential Manager.
## Nicht beginnen
## Manueller Test
Keinen echten Schlüssel anfordern oder dokumentieren, kein Billingkonto verbinden,
keine kostenpflichtigen Fallbacks, keinen vollständigen Vault übertragen und
weiterhin kein Obsidian-Schreiben, SSH-/Serverzugriff, Sprache oder Living Mind.
1. `/status`: Key und Konfiguration `ja`, Nullkostenmodus `aktiv`.
2. Unpersönlich: `Erkläre in zwei Sätzen, was eine SQLite-Transaktion ist.`
3. `/privacy`: `allowed`, Provider `gemini`, kein Fallback.
4. Ask ohne private Details: `Ich habe eine private Alltagssituation. Nenne nur
allgemeine Möglichkeiten.` Bei der Freigabe Enter drücken; Antwort muss lokal
über Ollama kommen.
5. Never mit Kunstbeispiel: `Nur lokal: Der Beispiel-API-Key ist absichtlich
erfunden.` Es darf keine Cloudfreigabe angeboten werden; Antwort bleibt lokal.
6. `/status`: bereinigte Zähler prüfen, danach `/exit`.
Erst wenn Pascal diese Punkte bestätigt, darf über den Merge nach `main`
entschieden werden. Google-Quoten sind projektabhängig und in AI Studio zu prüfen.
## Weiterhin nicht beginnen
Kein Obsidian-Zugriff, SSH-/Serverzugriff, Sprache, Mobile Client, Tools oder
Living Mind. Keine echten persönlichen Daten für Cloudtests verwenden.
+9 -6
View File
@@ -1,6 +1,6 @@
# Projektstatus
Stand: lokaler Textchat auf `main`, 30.07.2026.
Stand: Gemini-Free-Feature automatisiert geprüft, 30.07.2026.
## Erreicht
@@ -30,8 +30,10 @@ Stand: lokaler Textchat auf `main`, 30.07.2026.
## Abnahmestatus
- automatisiert durch Codex getestet: ja
- manuell durch Pascal getestet: ja, am 30.07.2026
- Core-Chat automatisiert durch Codex getestet: ja
- Core-Chat manuell durch Pascal getestet: ja, am 30.07.2026
- Gemini/Datenschutz/Fallback automatisiert durch Codex getestet: ja
- Gemini/Datenschutz/Fallback manuell durch Pascal getestet: noch nicht
- von Pascal für produktive Verwendung freigegeben: noch nicht ausdrücklich erklärt
## Aktuelles Featurepaket
@@ -66,7 +68,7 @@ Stand: lokaler Textchat auf `main`, 30.07.2026.
## Nicht implementiert
Obsidian-Adapter, Tools, Serverzugriff, Sprache, Mobile Client,
Living-Mind-Frontend und automatische Ollama-Prozessverwaltung.
Living-Mind-Frontend.
## Git
@@ -86,5 +88,6 @@ Living-Mind-Frontend und automatische Ollama-Prozessverwaltung.
Ollama wird bewusst manuell in einem eigenen Terminal gestartet. Antworten werden
noch nicht gestreamt; Sitzungen haben noch keine Titel, Suche oder Löschfunktion.
`qwen3:8b` ist nicht automatisch für die GTX 1050 des späteren Zielhosts geeignet.
Nur Abschlussdokumentation und Feature-Branch-Push fehlen. Es wurde kein echter
API-Key angefordert, angezeigt oder konfiguriert und keine Cloudanfrage ausgeführt.
Der echte Gemini-/Fallback-Test durch Pascal und danach die Mergeentscheidung
fehlen. Es wurde kein echter API-Key angefordert, angezeigt oder konfiguriert und
keine Cloudanfrage ausgeführt.
+14 -1
View File
@@ -14,10 +14,23 @@
Secrets dürfen nie in Code, Git, Prompts, Chatverläufe oder Logs gelangen. Das Modell erfährt nur den Namen, die Verfügbarkeit und ein bereinigtes Aktionsergebnis.
Bevorzugt wird eine Secret-Provider-Abstraktion. Eine optionale lokale XML-Datei wie `key-pw.xml` oder `secrets.local.xml` ist nur als restriktiv geschützte, Git-ignorierte Klartextdatei zulässig. Ins Repository darf höchstens eine leere Beispielstruktur.
Die Secret-Provider-Abstraktion verwendet im normalen Betrieb das
Betriebssystem-Keyring, unter Windows den Credential Manager. Der Gemini-Key wird
verdeckt eingegeben, nie ausgegeben und erst unmittelbar vor einem zulässigen
Cloudaufruf gelesen. Für API-Keys wird keine XML-Secret-Datei verwendet.
Eine vorhandene SSH-Schlüsseldatei aus früherer LS25-/Gitea-Arbeit bleibt lokal. Pfad, privater Inhalt und Gerätekennung werden nicht dokumentiert.
## Cloud und Nullkostenmodus
- Datenschutzklassifizierung `allowed`, `ask` oder `never` erfolgt lokal.
- `ask` ist ohne ausdrückliches Ja abgelehnt; `never` ist nicht übersteuerbar.
- Prompts werden auf den minimal freigegebenen Kontext begrenzt.
- Gemini bleibt ohne Aktivierung, Key und lokale Nicht-Billing-Bestätigung aus.
- Javis aktiviert kein Billing und nutzt keine kostenpflichtigen Zusatzfunktionen.
- Die externe Billingfreiheit kann Javis nicht technisch garantieren; Pascal muss
sie in Google AI Studio beziehungsweise dem Google-Projekt selbst prüfen.
## Obsidian
- gesamter Vault zunächst nur lesend