
HiddenSteps — eine Local-First-Plattform für persönliche Workflow-Intelligenz.
Dies ist die ehrliche, den aktuellen Stand abbildende Ergänzung zur Zielmodul-Karte aus docs/design/02-system-architecture.md. Sie sagt, was tatsächlich gebaut ist, was gegen ein echtes Backend statt gegen einen Mock verifiziert wurde und was wirklich noch fehlt — nicht, was geplant ist (dafür gibt es docs/roadmap/01-implementation-roadmap.md).
Führen Sie cargo build --workspace && cargo test --workspace && cargo clippy --workspace --all-targets -- -D warnings vom Repository-Stammverzeichnis aus. Zum Zeitpunkt dieses Schreibens: 12 Crates, 193 bestandene Tests, keine Clippy-Warnungen, cargo fmt --check sauber — 183 verteilt auf die 11 Crates, die weder ein Display noch einen externen Dienst benötigen, plus 10 in hiddensteps-observation, die ein aktives X11-Display benötigen (verifiziert, wo eines vorhanden ist; siehe diese Zeile). Vier Tests sind bewusst mit #[ignore] markiert (siehe unten) und zählen weder als Fehlschläge noch als Teil der 193.
| Crate | Implementiert | Wie verifiziert |
|---|---|---|
hiddensteps-domain | Kern-Typen: PrivacyLevel/PrivacyState, EventSummary/SignalType, Pattern, Recommendation, AuditEntry und CapturedSignal — ein Typ, der strukturell nicht persistiert werden kann (kein Serialize), wodurch die Rohdaten-Regel aus ADR-0006 auf Typebene durchgesetzt wird | Unit-Tests: Level-Roundtrip/-Reihenfolge, TTL-Freigabesteuerung im Deep-Modus |
hiddensteps-security | SecretStore (ADR-0008): echte OS-Vault-Implementierung (KeyringSecretStore) sowie In-Memory-Implementierung (für Tests); CSPRNG-Master-Key-Erzeugung (in einem zeroize::Zeroizing-Wrapper zurückgegeben, sodass der Schlüssel beim Drop gelöscht wird, statt im freigegebenen Speicher zu verweilen); Argon2id-Passphrase-Ableitung für den Portable Mode (PassphraseKey löscht seinen abgeleiteten Schlüssel per Zeroize beim Drop und behält das nicht geheime Salt). hiddensteps-event-store hält ebenso den schlüsseltragenden SQL-Text von PRAGMA key/rekey in Zeroizing | Unit-Tests gegen den In-Memory-Store und die KDF; der Roundtrip gegen die echte Vault ist mit #[ignore] markiert (siehe unten) |
hiddensteps-event-store | SqlCipherEventStore (ADR-0003): das vollständige Schema aus docs/design/07-database-schema.md, CRUD für Datenschutzstatus, Ereignisse, Audit-Log, Patterns, Pattern↔Ereignis-Verknüpfungen, Pattern-Embeddings (siehe Hinweis unten), Empfehlungen, LLM-Provider-Konfiguration und allgemeine Einstellungen, plus delete_all_data (transaktional; führt auch rekey für ein "Alles löschen" durch, das einen Neustart übersteht)/export_data/count_rows (Diagnose)/delete_expired_events (die TTL-Bereinigung im Deep-Modus, aufgerufen aus der periodischen Empfehlungsschleife von apps/desktop/src-tauri — ttl_expires_at wurde seit v0.1.0 persistiert, aber zuvor löschte nichts eine Zeile, deren Zeitpunkt überschritten war); Fremdschlüssel-Erzwingung (PRAGMA foreign_keys = ON), sodass das ON DELETE CASCADE aus schema.sql für Pattern↔Ereignis-Verknüpfungen tatsächlich greift | 33 Tests gegen eine echte SQLCipher-Datei: falscher Schlüssel verhindert das Öffnen, derselbe Schlüssel öffnet korrekt erneut, Alles-löschen leert jede Tabelle einschließlich der neuesten, Rekey-Roundtrip funktioniert, TTL-Bereinigung lässt nicht abgelaufene Ereignisse unangetastet, Kaskadenlöschung hinterlässt keine verwaisten Pattern↔Ereignis-Verknüpfungen |
hiddensteps-redaction | Die Redaktions-Engine (docs/design/05-privacy-model.md §4): Regex- und Luhn-Detektoren für API-Schlüssel/Tokens/PEM-Schlüssel/E-Mails/SSNs/Kreditkarten, ein entropiebasierter Detektor für mehrdeutige Geheimnisse sowie die Richtlinie "Bei Unsicherheit verwerfen" | 30 Tests, einschließlich bewusst adversarischer Eingaben (Geheimnisse in Fließtext eingebettet, Beinahe-Nicht-Geheimnisse wie Git-SHAs, SSNs ohne Bindestriche/mit Leerzeichen, mit Ziffern aufgefüllte Kartennummern, durchgängig gleich geschriebene Hochenergie-Tokens) |
hiddensteps-pipeline | Die Ereignis-Pipeline (ADR-0006): Klassifizieren → Redigieren → Zusammenfassen, Freigabesteuerung nach Datenschutzstufe je Signaltyp, TTL-Zuweisung für den Deep-Modus | 8 Tests, die Verwerfungen durch Redaktion, Verwerfungen durch die Stufen-Freigabe und erfolgreiche Zusammenfassungen abdecken |
hiddensteps-observation | ObservationSource (ADR-0005) + Linux: ActiveWindowSource (X11 GetInputFocus), FileOperationSource (inotify über notify), ClipboardMetadataSource (X11-Auswahl, nur Metadaten), GlobalShortcutSource (X11 XGrabKey). Dazu macOS-/Windows-Quelldateien (siehe unten) | 10 von 11 Tests laufen in dieser Umgebung gegen echte Backends — ein aktives X11-Display (DISPLAY=:0 von WSLg) und echtes inotify, keine Mocks. 1 Test (der echte Grab von GlobalShortcutSource) ist bewusst mit #[ignore] markiert |
hiddensteps-llm-provider | LlmProvider (ADR-0004): Ollama-Client (mit einem think: Option<bool>-Request-Feld für Hybrid-Reasoning-Modelle), ein OpenAI-wire-kompatibler Client (deckt OpenAI/Azure/OpenRouter/Together/Groq/DeepSeek/LocalAI ab), ein Anthropic-Messages-Client sowie automatische Erkennung lokaler Laufzeitumgebungen. Jeder Client setzt ein Request-Timeout (build_http_client), sodass ein hängendes Remote-System einen Aufruf nicht für immer blockieren kann; Ollama leitet max_tokens als sein verschachteltes options.num_predict weiter | 19 Tests gegen wiremock-Mock-Server (einschließlich einer echten Prüfung, dass das Timeout auslöst, und der Prüfung, dass Ollama tatsächlich num_predict sendet), plus 2 echte Ollama-Integrationstests (tests/ollama_live.rs, mit #[ignore] markiert — siehe unten), die ein echtes Problem gefunden und behoben haben: Derselbe Prompt dauerte gegen ein echtes lokales Hybrid-Thinking-Modell mit auf den Standardwert belassenem think über zwei Minuten, mit think: Some(false) nur wenige Sekunden |
hiddensteps-patterns | Mustererkennung (Sliding-Window-n-Gramm-Sequenzabgleich) + Workflow-Graph (Übergangsgraph mit Kantengewichten) — Layer 1 aus ADR-0010 | 16 Tests, einschließlich eines direkten Analogons zum eigenen Beispiel "31 Mal beobachtet" aus PROMPT.md und eines Regressionstests, der sicherstellt, dass überlappende Fenster über eine durchgehende Wiederholung nicht doppelt gezählt werden |
hiddensteps-recommendations | Layer 2 der Empfehlungs-Engine (ADR-0010): LLM-Synthese mit einem strukturierten JSON-Prompt-Vertrag, einem Validator für erzählerische Widersprüche und einer Retry-Schleife — entscheidend: Die numerischen Felder (estimated_time_saved_minutes) werden überhaupt nie aus der LLM-Ausgabe geparst, sondern ausschließlich aus Layer 1 berechnet | 23 Tests, darunter Retry bei fehlerhaftem JSON, Retry bei erzählerischen Widersprüchen (abdeckend ausgeschriebene Zahlen und jedes von der LLM gesteuerte Feld, nicht nur why) sowie stringbewusste JSON-Extraktion, gegen einen skriptbasierten Test-Provider |
hiddensteps-privacy-engine | Das Cloud-Versand-Gate (docs/design/03-data-flow-diagrams.md §5) und die Einwilligungs-Versionierung (docs/design/05-privacy-model.md §5); PrivacyGatedProvider kapselt jeden LlmProvider, sodass das Gate über den normalen Aufrufpfad nicht umgangen werden kann | 13 Tests, darunter die Prüfung, dass Level-4-Inhalte selbst bei vollständig erteilter Einwilligung blockiert werden |