
HiddenSteps — une plateforme locale de renseignement sur les flux de travail personnels
Ceci est le complément honnête et à jour de la carte des modules cible de docs/design/02-system-architecture.md. Il indique ce qui est réellement construit, ce qui est vérifié contre un vrai backend plutôt qu'un mock, et ce qui manque réellement — pas ce qui est prévu (c'est le rôle de docs/roadmap/01-implementation-roadmap.md).
Exécutez cargo build --workspace && cargo test --workspace && cargo clippy --workspace --all-targets -- -D warnings depuis la racine du dépôt. Au moment où ces lignes sont écrites : 12 crates, 193 tests réussis, zéro avertissement clippy, cargo fmt --check propre — 183 sur les 11 crates qui ne nécessitent ni affichage ni service externe, plus 10 dans hiddensteps-observation qui nécessitent un affichage X11 actif (vérifié là où il en existe un ; voir cette ligne). Quatre tests sont #[ignore]d par conception (voir ci-dessous) et ne sont comptés ni comme échecs ni comme faisant partie des 193.
| Crate | Implémente | Vérifié comment |
|---|---|---|
hiddensteps-domain | Types de base : PrivacyLevel/PrivacyState, EventSummary/SignalType, Pattern, Recommendation, AuditEntry, et CapturedSignal — un type qui ne peut structurellement pas être persisté (pas de Serialize), appliquant la règle des données brutes de l'ADR-0006 au niveau du type | Tests unitaires : aller-retour/ordonnancement des niveaux, contrôle du TTL en mode Deep |
hiddensteps-security | SecretStore (ADR-0008) : vrai coffre-fort OS (KeyringSecretStore) + implémentations en mémoire (test) ; génération de clé maîtresse CSPRNG (retournée dans un wrapper zeroize::Zeroizing pour que la clé soit effacée à la libération plutôt que de subsister en mémoire libérée) ; dérivation de phrase secrète Argon2id pour le mode portable (PassphraseKey efface sa clé dérivée à la libération, conservant le sel non secret). hiddensteps-event-store conserve de même le texte SQL PRAGMA key/rekey contenant la clé dans Zeroizing | Tests unitaires contre le stockage en mémoire et la KDF ; l'aller-retour avec le vrai coffre-fort est #[ignore]d (voir ci-dessous) |
hiddensteps-event-store | SqlCipherEventStore (ADR-0003) : le schéma complet de docs/design/07-database-schema.md, CRUD pour l'état de confidentialité, les événements, le journal d'audit, les motifs, les liens motif↔événement, les plongements de motifs (voir la note ci-dessous), les recommandations, la configuration du fournisseur LLM et les paramètres génériques, plus delete_all_data (transactionnel ; effectue aussi un rekey pour un « tout supprimer » qui survit à un redémarrage)/export_data/count_rows (diagnostics)/delete_expired_events (le balayage TTL du mode Deep, appelé depuis la boucle de recommandation périodique de apps/desktop/src-tauri — ttl_expires_at était persisté depuis la v0.1.0 mais rien ne supprimait une ligne au-delà avant cela) ; application des clés étrangères (PRAGMA foreign_keys = ON) pour que le ON DELETE CASCADE de schema.sql sur les liens motif↔événement s'exécute réellement | 33 tests contre un vrai fichier SQLCipher : une mauvaise clé ne permet pas l'ouverture, la même clé rouvre correctement, la suppression totale efface toutes les tables y compris les plus récentes, l'aller-retour rekey fonctionne, le balayage TTL laisse les événements non expirés intacts, la suppression en cascade ne laisse aucun lien motif↔événement orphelin |
hiddensteps-redaction | Le moteur de rédaction (docs/design/05-privacy-model.md §4) : détecteurs regex+Luhn pour clés API/jetons/clés PEM/emails/NSS/numéros de carte bancaire, un détecteur de secrets ambigus basé sur l'entropie, et la politique d'abandon en cas d'incertitude | 30 tests, y compris des entrées délibérément adverses (secrets intégrés dans de la prose, quasi-secrets non secrets comme des SHA git, NSS sans tirets/espacés, numéros de carte avec chiffres ajoutés, jetons à haute entropie tout en une seule casse) |
hiddensteps-pipeline | Le pipeline d'événements (ADR-0006) : Classifier → Rédiger → Résumer, contrôle du niveau de confidentialité par type de signal, attribution du TTL en mode Deep | 8 tests couvrant les abandons déclenchés par la rédaction, les abandons par contrôle de niveau et la réussite de la synthèse |
hiddensteps-observation | ObservationSource (ADR-0005) + Linux : ActiveWindowSource (X11 GetInputFocus), FileOperationSource (inotify via notify), ClipboardMetadataSource (sélection X11, métadonnées uniquement), GlobalShortcutSource (X11 XGrabKey). Plus les fichiers de sources macOS/Windows (voir ci-dessous) | 10 des 11 tests s'exécutent contre de vrais backends dans cet environnement — un affichage X11 actif (DISPLAY=:0 de WSLg) et un vrai inotify, pas des mocks. 1 test (la vraie capture de GlobalShortcutSource) est #[ignore]d par conception |
hiddensteps-llm-provider | LlmProvider (ADR-0004) : client Ollama (avec un champ de requête think: Option<bool> pour les modèles à raisonnement hybride), un client compatible fil OpenAI (couvre OpenAI/Azure/OpenRouter/Together/Groq/DeepSeek/LocalAI), un client Anthropic Messages, et une auto-détection du runtime local. Chaque client définit un délai d'expiration de requête (build_http_client) pour qu'un serveur distant bloqué ne puisse pas bloquer un appel indéfiniment ; Ollama transmet max_tokens comme son options.num_predict imbriqué | 19 tests contre des serveurs mock wiremock (y compris une véritable vérification de déclenchement du délai d'expiration et que Ollama envoie réellement num_predict), plus 2 tests d'intégration réels Ollama (tests/ollama_live.rs, #[ignore]d — voir ci-dessous) qui ont trouvé et corrigé un vrai problème : la même invite prenait plus de deux minutes contre un vrai modèle local à raisonnement hybride avec think laissé à sa valeur par défaut, et quelques secondes avec think: Some(false) |
hiddensteps-patterns | Détection de motifs (correspondance de séquences n-grammes à fenêtre glissante) + graphe de flux de travail (graphe de transition avec poids d'arêtes) — couche 1 de l'ADR-0010 | 16 tests, y compris un analogue direct de l'exemple « observé 31 fois » de PROMPT.md et un test de régression vérifiant que les fenêtres qui se chevauchent sur une répétition continue ne sont pas comptées deux fois |
hiddensteps-recommendations | La couche 2 du moteur de recommandations (ADR-0010) : synthèse LLM avec un contrat d'invite JSON structuré, un validateur de contradiction narrative et une boucle de nouvelle tentative — surtout, les champs numériques (estimated_time_saved_minutes) ne sont jamais analysés depuis la sortie du LLM, uniquement calculés depuis la couche 1 | 23 tests, y compris nouvelle tentative sur JSON malformé, nouvelle tentative sur contradiction narrative (couvrant les nombres écrits en toutes lettres et chaque champ contrôlé par le LLM, pas seulement why), et extraction JSON sensible aux chaînes, contre un fournisseur de test scripté |
hiddensteps-privacy-engine | La passerelle de dispatch cloud (docs/design/03-data-flow-diagrams.md §5) et le versionnage du consentement (docs/design/05-privacy-model.md §5) ; PrivacyGatedProvider enveloppe n'importe quel LlmProvider pour que la passerelle ne puisse pas être contournée par le chemin d'appel normal | 13 tests, y compris que le contenu de niveau 4 est bloqué même avec tous les consentements accordés |