
HiddenSteps — una plataforma local-first de inteligencia de flujo de trabajo personal
Este es el complemento honesto y de estado actual del mapa de módulos objetivo de docs/design/02-system-architecture.md. Dice lo que realmente está construido, lo que está verificado contra un backend real en lugar de un mock, y lo que todavía falta de verdad — no lo que está planeado (eso está en docs/roadmap/01-implementation-roadmap.md).
Ejecuta cargo build --workspace && cargo test --workspace && cargo clippy --workspace --all-targets -- -D warnings desde la raíz del repositorio. A fecha de hoy: 12 crates, 193 pruebas que pasan, cero advertencias de clippy, cargo fmt --check limpio — 183 en los 11 crates que no necesitan pantalla ni servicio externo, más 10 en hiddensteps-observation que necesitan una pantalla X11 activa (verificadas donde existe una; ver esa fila). Cuatro pruebas están marcadas como #[ignore] por diseño (ver más abajo) y no se cuentan como fallos ni forman parte de las 193.
| Crate | Implementa | Verificado cómo |
|---|---|---|
hiddensteps-domain | Tipos principales: PrivacyLevel/PrivacyState, EventSummary/SignalType, Pattern, Recommendation, AuditEntry y CapturedSignal — un tipo que estructuralmente no puede persistirse (sin Serialize), lo que aplica la regla de datos sin procesar de ADR-0006 a nivel de tipos | Pruebas unitarias: ida y vuelta/ordenación de niveles, control de TTL en modo profundo |
hiddensteps-security | SecretStore (ADR-0008): implementaciones reales de almacén del sistema operativo (KeyringSecretStore) + en memoria (para pruebas); generación de clave maestra CSPRNG (devuelta en un envoltorio zeroize::Zeroizing para que la clave se borre al soltar el objeto en lugar de quedar en memoria liberada); derivación de contraseña Argon2id para el modo portátil (PassphraseKey pone a cero su clave derivada al soltar el objeto, conservando la sal no secreta). hiddensteps-event-store también mantiene el texto SQL PRAGMA key/rekey, que contiene la clave, en Zeroizing | Pruebas unitarias contra el almacén en memoria y el KDF; la prueba de ida y vuelta con el almacén real está marcada como #[ignore] (ver más abajo) |
hiddensteps-event-store | SqlCipherEventStore (ADR-0003): el esquema completo de docs/design/07-database-schema.md, CRUD para el estado de privacidad, eventos, registro de auditoría, patrones, enlaces patrón↔evento, embeddings de patrones (ver nota más abajo), recomendaciones, configuración del proveedor LLM y ajustes genéricos, además de delete_all_data (transaccional; también ejecuta rekey para un "borrar todo" que sobrevive a un reinicio)/export_data/count_rows (diagnósticos)/delete_expired_events (la limpieza TTL del modo profundo, llamada desde el bucle periódico de recomendaciones de apps/desktop/src-tauri — ttl_expires_at se persistía desde v0.1.0 pero nada borraba una fila pasada esa fecha antes); aplicación de claves foráneas (PRAGMA foreign_keys = ON) para que el ON DELETE CASCADE de schema.sql en los enlaces patrón↔evento se ejecute de verdad | 33 pruebas contra un archivo SQLCipher real: una clave incorrecta no abre, la misma clave reabre correctamente, borrar todo limpia todas las tablas incluidas las más nuevas, rekey hace correctamente la ida y vuelta, la limpieza TTL deja intactos los eventos no caducados, el borrado en cascada no deja enlaces patrón↔evento huérfanos |
hiddensteps-redaction | El motor de redacción (docs/design/05-privacy-model.md §4): detectores regex+Luhn para claves API/tokens/claves PEM/emails/SSN/tarjetas de crédito, un detector de secretos ambiguos basado en entropía y la política de descartar ante la incertidumbre | 30 pruebas, incluidos inputs deliberadamente adversariales (secretos incrustados en prosa, no-secretos casi coincidentes como SHAs de git, SSN sin guiones o con espacios, números de tarjeta con dígitos de relleno, tokens de alta entropía con un solo tipo de caja) |
hiddensteps-pipeline | El pipeline de eventos (ADR-0006): Clasificar → Redactar → Resumir, control de nivel de privacidad por tipo de señal, asignación de TTL del modo profundo | 8 pruebas que cubren descartes provocados por la redacción, descartes por control de nivel y resúmenes exitosos |
hiddensteps-observation | ObservationSource (ADR-0005) + Linux: ActiveWindowSource (X11 GetInputFocus), FileOperationSource (inotify mediante notify), ClipboardMetadataSource (selección X11, solo metadatos), GlobalShortcutSource (X11 XGrabKey). Además archivos de fuentes para macOS/Windows (ver más abajo) | 10 de 11 pruebas se ejecutan contra backends reales en este entorno — una pantalla X11 activa (el DISPLAY=:0 de WSLg) e inotify real, no mocks. 1 prueba (la captura real de GlobalShortcutSource) está marcada como #[ignore] por diseño |
hiddensteps-llm-provider | LlmProvider (ADR-0004): cliente Ollama (con un campo de solicitud think: Option<bool> para modelos de razonamiento híbrido), un cliente compatible a nivel de protocolo con OpenAI (cubre OpenAI/Azure/OpenRouter/Together/Groq/DeepSeek/LocalAI), un cliente Anthropic Messages y auto-detección del runtime local. Cada cliente establece un tiempo de espera de solicitud (build_http_client) para que un remoto colgado no pueda bloquear una llamada para siempre; Ollama reenvía max_tokens como su anidado options.num_predict | 19 pruebas contra servidores mock wiremock (incluida una verificación real de que el tiempo de espera se dispara y de que Ollama realmente envía num_predict), más 2 pruebas de integración con Ollama real (tests/ollama_live.rs, marcadas como #[ignore] — ver más abajo) que encontraron y corrigieron un problema real: el mismo prompt tardó más de dos minutos contra un modelo local real de razonamiento híbrido con think en su valor predeterminado, y unos segundos con think: Some(false) |
hiddensteps-patterns | Detección de patrones (coincidencia de secuencias n-gram con ventana deslizante) + Grafo de flujo de trabajo (grafo de transición con pesos en las aristas) — Capa 1 de ADR-0010 | 16 pruebas, incluido un análogo directo del ejemplo "observed 31 times" del propio PROMPT.md y una prueba de regresión que verifica que las ventanas superpuestas sobre una repetición continua no se cuentan dos veces |
hiddensteps-recommendations | La Capa 2 del motor de recomendaciones (ADR-0010): síntesis LLM con un contrato de prompt JSON estructurado, un validador de contradicciones narrativas y un bucle de reintentos — lo crítico es que los campos numéricos (estimated_time_saved_minutes) nunca se parsean de la salida del LLM, solo se calculan a partir de la Capa 1 | 23 pruebas, incluidos reintentos por JSON malformado, reintentos por contradicción narrativa (que cubren números escritos con letras y todos los campos controlados por el LLM, no solo why) y extracción JSON consciente de cadenas, contra un proveedor de prueba con guion |
hiddensteps-privacy-engine | La compuerta de envío a la nube (docs/design/03-data-flow-diagrams.md §5) y el versionado de consentimiento (docs/design/05-privacy-model.md §5); PrivacyGatedProvider envuelve cualquier LlmProvider para que la compuerta no se pueda eludir mediante la ruta de llamada normal | 13 pruebas, incluida la de que el contenido de Nivel 4 se bloquea incluso con todos los consentimientos concedidos |