Memories / Documentación

En esta página

Registro de validación

Compilaciones locales de desarrollo. Los resultados están fechados por sección; los hashes de artefactos anteriores se aplican únicamente a las compilaciones registradas con ellos. Los ejemplos de comandos usan la denominación actual del proyecto; los hashes históricos no describen los binarios con el nuevo nombre. Estos resultados describen comprobaciones realmente ejecutadas; la configuración de CI no demuestra una ejecución remota exitosa de CI ni una auditoría de seguridad independiente.

Cuentas SaaS y registro configurable (2026-10-14)

La versión 20261014-83aca4d86199 está desplegada en ldny. SHA-256 del binario Linux: 83aca4d86199718587da2fe812471bffb6ea7aefd499c52ed53e6566a7dd4c73. Despliegue de la interfaz de cuentas: 908a7085.memories-ap4.pages.dev.

  • cargo fmt --all --check, cargo clippy --workspace --all-targets --locked -- -D warnings y cargo test --workspace --locked pasaron en Windows. Las pruebas opcionales existentes dependientes del entorno conservan su estado declarado de ignoradas.
  • cargo build --workspace --release --locked pasó en Windows. La compilación de lanzamiento de memories-center para Linux pasó con el grafo de dependencias bloqueado y se probó en el contenedor Ubuntu compatible con producción descrito a continuación.
  • Pruebas de Center: 79 pasaron, incluidas siete pruebas de cuentas/configuración que cubren registro por nombre de usuario, identidades canónicas, verificación/caducidad/reutilización de correo, fallos del transporte SMTP, entrega real a una instancia SMTP de prueba en bucle local, hashing de contraseñas, trabajo/solicitudes de autenticación limitados, denegación de lectura/escritura entre cuentas, cambios/eliminación por administrador, cierre de sesión, persistencia tras reiniciar y escrituras de miembros con denegación ante fallos.
  • Pruebas Node del cliente web y del proxy de API: 13 pasaron. La generación de documentación verificó enlaces y anclas locales en 32 páginas HTML.
  • Chromium real se registró/inició sesión contra un Center aislado y creó una memoria. Las transiciones del formulario de correo se comprobaron con respuestas de API simuladas; esas comprobaciones del navegador no enviaron correo. La entrega de correo del backend se comprobó por separado mediante la instancia SMTP local de prueba, no mediante un proveedor externo.
  • La imagen exacta de producción pasó una prueba canario en un contenedor aislado de ldny con dos cuentas, bóvedas distintas, denegación entre cuentas, cierre de sesión, persistencia tras reiniciar e inicio de sesión con el registro cerrado. Se eliminaron el contenedor canario y sus datos sintéticos. No se usaron datos de producción en esa prueba.
  • El reinicio de producción conservó la identidad de bóveda y el token de miembro del propietario existente a través del dominio público. El contenedor PostgreSQL existente y el servicio cloudflared siguieron ejecutándose. Los recursos integrados de /app/ coinciden con los recursos públicos de Pages. Las páginas públicas de escritorio/móvil no tienen errores de consola ni desbordamiento horizontal a 390px.
  • Producción selecciona el modo de correo en /etc/memories-center/auth.toml. SMTP se configuró el 2026-10-14 con correo empresarial Tencent y TLS implícito con verificación de certificado en el puerto 465. La autenticación del proveedor pasó, el servicio se reinició correctamente y la configuración pública indica que el registro está habilitado. Una solicitud pública de registro devolvió 200 con verification_required: true después de enviar un correo de verificación al proveedor. La recepción en la bandeja de entrada y el envío final del código/contraseña por el usuario siguen sin verificarse. Las contraseñas se guardan únicamente en configuración protegida fuera del repositorio.
  • Copia de seguridad coherente protegida: /var/backups/memories-center/20261014-before-accounts-83aca4d86199/state-and-config.tar.gz. Evidencia, parche de código fuente y constancia de compilación: dist/saas-accounts-20261014/. El parche se aplica a la base limpia registrada; Git normaliza los finales de línea del texto.

SaaS alojado en ldny (2026-10-14, despliegue inicial)

memories.ivjn.us ahora sirve la API de Center alojada mediante un Cloudflare Worker y el Tunnel existente de ldny. El sitio estático, el cliente web y la documentación independiente siguen en Pages. ldny ejecuta la versión Linux en un contenedor Podman Ubuntu 24.04, con datos cifrados persistentes fuera de la imagen y gestión de arranque/reinicio por systemd.

  • El /health público devuelve ok; /v1/public-key identifica memories-saas. /v1/session anónimo devuelve 401 y un miembro/concesión con ámbito devuelve la sesión autorizada. Las respuestas de API usan Cache-Control: no-store.
  • El contenido sintético sobrevivió a un reinicio del servicio. Chromium real creó, editó y reabrió una memoria mediante https://memories.ivjn.us y luego la eliminó. La versión final del contenedor pasó dos reinicios consecutivos de systemd con un nuevo elemento de prueba persistido. Un archivo binario de 1 MiB cargado/descargado mediante la API pública coincidió en SHA-256; las concesiones de solo lectura rechazaron escrituras con 403.
  • Las comprobaciones del navegador en escritorio y móvil de 390px no presentaron desbordamiento horizontal ni errores de consola. Los tokens/contenido estaban ausentes del almacenamiento del navegador. Se borró el contenido de QA y se revocaron las concesiones temporales. Un token de propietario existente siguió funcionando después de la actualización final; se conservó una copia de seguridad protegida del estado/configuración anterior a la actualización.
  • Las 10 pruebas Node de la API web y el proxy de borde pasaron. La compilación de lanzamiento de Linux y las comprobaciones básicas locales de autenticación/persistencia/recursos integrados de Linux pasaron.

Consulte deploy/README.md del repositorio para la disposición del servicio y la reversión. Los secretos se generaron en el servidor y se mantuvieron fuera del repositorio. Estas comprobaciones no establecen una certificación de seguridad independiente ni el registro público de cuentas de autoservicio. La evidencia local está en dist/saas-ldny-20261014/.

Memories Web (2026-10-14, despliegue inicial del frontend)

Se añadió el cliente estático de Center en /app/ y se integraron los mismos recursos en memories-center. Es un cliente de Center alojado, no una bóveda de navegador sin conexión. Este despliegue inicial del frontend precedió al despliegue SaaS registrado arriba.

  • La secuencia completa de Rust pasó: comprobación de formato, Clippy del espacio de trabajo/todos los destinos con advertencias denegadas, pruebas del espacio de trabajo con dependencias bloqueadas y compilación de lanzamiento del espacio de trabajo con dependencias bloqueadas. La batería de Center incluye validación de origen explícito y pruebas de ámbito/autenticación de CORS.
  • node --test scripts/tests/web-client.test.mjs: 6 pasaron, cubriendo vinculación del token al origen, restricciones de redirección/cookies/caché, actualizaciones parciales, cancelación y respuestas obsoletas, carreras de conexión fallidas, errores genéricos y codificación binaria.
  • Chromium real conectó el sitio estático del puerto 8097 a un Center alojado desechable del puerto 9297. Pasaron la creación/edición/reapertura de memorias, creación/eliminación de tarjetas y carga/descarga de archivos. Una descarga binaria de 10,240 bytes coincidió con el SHA-256 del origen. Las concesiones de lector deshabilitaron mutaciones; una concesión de solo escritura creó una memoria que se leyó de forma independiente mediante la concesión del propietario, y la tarjeta eliminada estaba ausente.
  • Se inspeccionaron los diseños del espacio de trabajo en escritorio y móvil de 390px. La desconexión explícita borró el contenido visible y el campo del token; también se observó el bloqueo por inactividad de cinco minutos. Ni localStorage ni sessionStorage contenían tokens o contenido.
  • El Center de lanzamiento sirvió los siete recursos integrados coincidiendo byte a byte con los fuentes del sitio. Su página /app/ cargó sin errores ni advertencias de consola, y se comprobaron CSP y las cabeceras de seguridad.

Solo se usaron datos sintéticos de bóveda y concesiones desechables. Estas comprobaciones no afirman una conexión a una bóveda de producción, una auditoría de seguridad independiente ni paridad de funciones con clientes nativos. La evidencia se conserva localmente en dist/site-update-7647166/output/playwright/ y dist/web-client-qa/.

Actualización del cliente del sitio web (2026-10-14)

Seguimiento del sitio web: las tarjetas de descarga ahora comparten filas de cuadrícula para hashes, botones principales y enlaces de metadatos. La documentación independiente en /docs/ contiene 29 páginas generadas con navegación, enlaces de encabezados y un menú móvil plegable. python scripts/build-website-docs.py verifica enlaces locales y destinos de fragmentos en las 30 páginas HTML. node --check pasó para ambos scripts del sitio. Las comprobaciones del navegador cubrieron la página de inicio, el centro de documentación, las guías en inglés y chino y la configuración a 390px, 900px y 1440px, sin desbordamiento horizontal de página ni errores de consola. Los botones de descarga, hashes y enlaces BUILD-INFO tienen posiciones verticales coincidentes en las cuatro tarjetas de escritorio.

Base de código: 7647166a6d97e59e9a466fec5ead287892b428af (main, sincronizada con origin/main). Los paquetes de Windows y Linux usan este código confirmado. Android también incluye la corrección local de conservación de constructores de R8 descrita a continuación; su BUILD-INFO.json registra source_dirty: true y el parche de código publicado.

Artefacto publicado Bytes SHA-256
Windows x86_64 v0.1.7 ZIP 51646344 755663b54323bfcf4ba9bef474c10599542372416ac6b50dcc4bd0d3f75fdcad
Linux x86_64 v0.1.7 tar.gz 44817901 2a58ab5702e82baa4dc7fcc30a42b4ca01811d3a9312facf5429d444b0f64b7d
Android v0.1.7, versionCode 8 APK 146722216 74256790a248ea17b0f9ad60aa74be311da7ef77b243023fa8d4490b76a1d24d

Las bases públicas son https://r2.ivjn.us/memories/7647166/windows/, https://r2.ivjn.us/memories/7647166/linux/ y https://r2.ivjn.us/memories/7647166/android-cc5ac4b5/. Los tres paquetes y sus metadatos publicados se descargaron de nuevo y coincidieron con los hashes SHA-256 locales. El SHA-256 de SOURCE.patch de Android es cc5ac4b57ced3bc87738d51da5ded84822627b5f05f8db024d323bde98dda4c2; git apply --check pasó contra la copia de trabajo de la base limpia.

Validaciones realizadas:

  • Rust 1.98.0 en Windows: cargo fmt --all --check, cargo clippy --workspace --all-targets --locked -- -D warnings, cargo test --workspace --locked y cargo build --workspace --release --locked pasaron. Las pruebas configuradas como ignoradas siguen ignoradas; persisten las advertencias de compatibilidad futura de dependencias.
  • Paquete Windows: se verificaron 47 archivos del manifiesto y entradas del archivo comprimido; --version del CLI extraído devolvió memories 0.1.7 y --help del relay pasó.
  • Paquete Linux: compilado con bash scripts/package-linux.sh en una copia de trabajo GNU limpia de WSL (glibc 2.39, OpenSSL 3). Se verificaron los 45 archivos del manifiesto, entradas del archivo comprimido y permisos de ejecución. --version y file exec --help del CLI extraído pasaron; ldd resolvió todas las dependencias.
  • Flutter 3.44.2 / Dart 3.12.2: flutter pub get, dart format --output=none --set-exit-if-changed lib test integration_test, flutter analyze y flutter test pasaron (126 pruebas).
  • Se recompilaron las bibliotecas Rust FFI ARM64/x86_64 y se ejecutó correctamente flutter test integration_test/native_smoke_test.dart -d emulator-5680 en Android API 35 x86_64. Se actualizó la aserción obsoleta de ID de ocho caracteres para ajustarla al contrato del núcleo de 6-16 caracteres hexadecimales de longitud par. Después se recompiló el APK normal de depuración y se verificaron sus bibliotecas nativas.
  • Se compiló el APK de lanzamiento con flutter build apk --release --target-platform android-arm64,android-x64 --build-number 8, se alineó y se firmó con la configuración externa documentada en AGENTS.md. apksigner verify pasó con el SHA-256 del certificado de lanzamiento existente d637a37d5dd77aa5753722eccf53ab1b84baed2189e603cef9c34dbf354948f8. Se comprobaron las bibliotecas FFI de origen, fusionadas, sin símbolos y empaquetadas para ambas ABI.
  • Las pruebas reales de la versión firmada encontraron un fallo de arranque de R8: Room construye androidx.work.impl.WorkDatabase_Impl mediante reflexión, pero su constructor público sin argumentos había sido eliminado. Se añadió una regla de conservación de ámbito reducido, se recompiló y se verificaron dos arranques en frío y la entrada al modo Standalone sin excepción fatal de AndroidRuntime. El candidato fallido se retiró antes del despliegue del sitio; su URL pública del APK devolvió HTTP 404.
  • Pasaron las comprobaciones de sintaxis JavaScript del sitio y de recursos HTML locales, IDs y destinos de fragmentos. Las comprobaciones locales del navegador a 1440px y 390px pasaron el cambio bilingüe sin desbordamiento horizontal ni errores de consola.

El despliegue de producción de Cloudflare Pages se completó en https://09253fe4.memories-ap4.pages.dev para el proyecto memories, rama main, con metadatos de código modificado sin confirmar. https://memories.ivjn.us/ devolvió HTTP 200 y coincidió byte a byte con website/index.html local. Los 12 enlaces de descarga/metadatos devolvieron HTTP 200, incluidos los enlaces de macOS conservados. Estaban presentes las cabeceras CSP, nosniff, denegación de marcos, referente y permissions-policy. Las comprobaciones del navegador en producción pasaron a 1440px y 390px con cambio inglés/chino, sin desbordamiento horizontal y con cero errores o advertencias de consola. Las capturas están en dist/site-update-7647166/output/playwright/live-*.png.

La evidencia y las herramientas auxiliares locales están en dist/site-update-7647166/; el paquete Windows está en dist/v0.1.7/. Los secretos de firma permanecieron fuera de la copia de trabajo. macOS conserva la descarga existente v0.1.3: el host macOS estaba desconectado y GitHub Actions fue bloqueado por el límite de facturación/gasto de la cuenta. No se afirma una nueva compilación macOS o iOS, ejecución física ARM64, publicación en tiendas ni auditoría de seguridad independiente. La validación Linux anterior sustituye la limitación Linux de la base más antigua para este paquete.

Configuración de CI nativa sin supervisión (2026-10-01; programada, no ejecutada)

La matriz de sistemas operativos Rust en .github/workflows/ci.yml ahora programa comprobaciones nativas explícitas después de las pruebas ordinarias del espacio de trabajo:

  • Windows: cargo test -p memories --lib native_dpapi --locked ejecuta las pruebas existentes de ida y vuelta DPAPI del usuario actual y denegación por vinculación modificada. Solo usan búferes sintéticos en memoria, liberados y puestos a cero por el guardián del búfer nativo; nunca se accede a la ruta de custodia de ejemplo.
  • macOS: cargo test -p memories --lib unattended_backend::macos::tests::native_roundtrip_when_keychain_is_unlocked --locked -- --exact --ignored ejecuta únicamente la prueba nativa ignorada de ida y vuelta de Keychain, no otras pruebas ignoradas. Crea una entrada sintética sin sincronización vinculada a un directorio temporal único y luego elimina esa entrada exacta antes de comprobar el resultado de lectura o afirmar igualdad. Los errores de aprovisionamiento, lectura y limpieza hacen fallar la prueba; una creación fallida nunca provoca la eliminación de una entrada preexistente.

El ejecutor macOS debe proporcionar un llavero de usuario disponible y desbloqueado que permita crear/leer/eliminar sin interfaz. No se añade desbloqueo del llavero, interfaz de autenticación, debilitamiento de ACL, cambios globales del llavero ni inyección de contraseñas. Los llaveros ausentes o bloqueados provocan fallos en lugar de omitir silenciosamente o recurrir a alternativas. Si falla la eliminación nativa, la prueba falla y su entrada sintética puede permanecer en el ejecutor desechable. Los fallos previos de formato/lint/pruebas pueden impedir que se alcancen estos pasos.

Estos pasos están configurados para futuras ejecuciones CI de push/pull-request, no son evidencia nativa ejecutada. No se lanzó ningún flujo y no se ejecutaron localmente pruebas nativas de Windows ni macOS: este entorno de implementación es Linux sin hosts nativos configurados. La ejecución nativa real y la validación sin interfaz con bloqueo/necesidad de aprobación siguen siendo requisitos para lanzamiento; la configuración de CI por sí sola no los completa.

Scripts de compilación y empaquetado Linux (2026-09-18)

Se validaron los nuevos scripts de shell Linux en Ubuntu sobre WSL2 desde una copia de trabajo Windows. bash -n pasó para ambos scripts. Repositorios de prueba desechables con commits y herramientas de compilación simuladas ejercitaron la selección lanzamiento/depuración, selección explícita del destino nativo pese a un CARGO_BUILD_TARGET contradictorio, rutas con espacios, directorios de destino Cargo personalizados, disposición del archivo x86_64/aarch64, permisos de ejecución, documentación/licencias versionadas, metadatos del commit de origen y todas las sumas de comprobación de archivos y archivos comprimidos. Se rechazaron como se esperaba sistema operativo incorrecto, destinos no admitidos, argumentos inválidos, OpenSSL ausente, compilaciones fallidas, copias de trabajo modificadas y directorios de paquete existentes; los archivos comprimidos existentes permanecieron sin cambios.

El entorno WSL no tiene herramientas de compilación Rust/C, por lo que esto valida el comportamiento de los scripts con artefactos de prueba, no la compilación Linux ni la ejecución nativa. El flujo manual de escritorio actualizado incluye instalación de dependencias Linux, ShellCheck, comprobaciones Rust, empaquetado, verificación de sumas y comandos básicos de CLI/relay extraídos; ese flujo remoto no se ha ejecutado para este cambio. ARM64 nativo y la compatibilidad de distribución/glibc/OpenSSL siguen sin verificarse.

Windows v0.1.3: recuperación, modelos integrados e IDs de seis caracteres (2026-09-18)

La etiqueta v0.1.3 y el BUILD-INFO.json de lanzamiento identifican el código y los archivos empaquetados. El motor de inferencia forma parte de la aplicación; los pesos del modelo se instalan por separado como archivos de datos verificados y no se ejecutan mediante otra aplicación.

  • Regresión del espacio de trabajo: 158 pasaron, cero fallos, 17 casos auxiliares/dependientes de herramientas/modelos ignorados intencionalmente. La batería final de seis pruebas de recuperación también pasó por separado, incluida una nueva regresión de cambio de documento público a privado en curso añadida después de iniciar la ejecución del espacio de trabajo.
  • EmbeddingGemma nativo se ejecutó dentro del proceso con archivos de modelo Q4 reales fijados. Una pregunta en chino situó el documento pertinente en inglés sobre perros por encima de texto financiero no relacionado, con vectores finitos y normalizados de 768 dimensiones. Una segunda prueba real de CLI/daemon construyó el índice vectorial, recuperó la coincidencia semántica y confirmó rechazo por bloqueo/vaciado de caché. Ambas pruebas opcionales pasaron después de deshabilitar explícitamente la telemetría ONNX antes de crear la sesión.
  • El CLI de lanzamiento Windows optimizado final también se ejercitó directamente mediante IPC real del daemon: pasaron IDs de seis caracteres, dos documentos indexados, la coincidencia semántica entre idiomas y la denegación por bloqueo. Su informe está en target/rag-release-smoke.json; no se usó ninguna aplicación externa de embeddings.
  • La instalación del modelo mediante el CLI de lanzamiento real pasó contra un espejo desechable de bucle local: se recuperaron mediante reintentos/rangos un HTTP 429 inyectado y una respuesta de modelo interrumpida (59 solicitudes, 53 rangos), y los siete archivos del modelo coincidieron con sus SHA-256 fijados. Repetir la instalación con el espejo detenido reutilizó archivos verificados sin conexión. La instalación no inicializó ningún almacén cifrado.
  • Las instancias HTTP de prueba verifican cargas Gemini/compatibles, dimensiones solicitadas, comprobaciones de orden/cantidad/dimensiones de embeddings, reclasificación aprendida, rechazo de citas, reintentos transitorios, errores de autenticación sin reintento, cancelación y CONNECT real de proxy HTTPS. Se suprimen los cuerpos fallidos y los ecos directos de claves de API.
  • Las regresiones de búsqueda/RAG cubren términos chinos, modos any/all/phrase, desplazamientos Unicode de fragmentos, reutilización/invalidación de caché vectorial, contenido oculto de credenciales/privado/eliminado, bloqueo y revocación de concesiones, denegación entre bóvedas, rechazo de revelación remota de contenido solo del dispositivo y documentos modificados durante el trabajo del modelo. La ingesta/recuperación CLI y MCP funciona sin modelo en modo BM25.
  • Pasan IDs de seis caracteres, extensión por colisión de seis/ocho caracteres, compatibilidad con entradas antiguas de ocho caracteres y proyecciones de referencias tipadas junto con las regresiones existentes de autorización/almacenamiento/FFI. Los IDs canónicos almacenados y las huellas de seguridad no cambian.
  • Pasan formato, Clippy del espacio de trabajo/todos los destinos con -D warnings, compilaciones optimizadas y una compilación del núcleo sin la función opcional de embeddings nativos. Persisten las advertencias existentes de compatibilidad futura de dependencias y avisos informativos del enlazador nativo.
  • No se llamaron servicios reales Gemini/generación/reclasificación de clientes; la validación del protocolo usa instancias HTTP sintéticas de prueba. No se ejercitaron aquí la ejecución macOS/Linux ni compilaciones móviles nativas. La FFI móvil expone recuperación léxica pero rechaza operaciones basadas en modelos. No se cambió ninguna interfaz Flutter.

Revisión del modelo: 5090578d9565bb06545b4552f76e6bc2c93e4a66 de onnx-community/embeddinggemma-300m-ONNX. Los registros son target/rag-*.log y los registros de descarga/espejo están en target/. Solo se usaron almacenes, documentos y credenciales sintéticos.

Windows v0.1.2: estado y configuración de escritorio (2026-09-18)

La etiqueta v0.1.2 identifica este código. El BUILD-INFO.json de lanzamiento vincula el commit exacto y cada archivo empaquetado; SHA256SUMS también cubre la configuración de ejemplo independiente. El archivo Windows incluye el ejecutable de bandeja, WebUI integrada, toda la documentación versionada, el ejemplo TOML y las licencias de fuentes integradas.

  • cargo test --workspace --locked -- --test-threads=2: 144 pasaron, cero fallos, 14 casos auxiliares de subprocesos/herramientas externas ignorados intencionalmente. Una regresión reforzada de reenvío de configuración/WebUI real también pasó por separado contra el código final (dos pruebas de integración de escritorio).
  • Formato, Clippy del espacio de trabajo/todos los destinos con -D warnings y compilaciones optimizadas del espacio de trabajo pasaron con Rust 1.98.1 MSVC. Persisten las advertencias existentes de compatibilidad futura de dependencias y avisos informativos del enlazador FFI.
  • Las regresiones cubren rechazo por capacidad/Host/Origin/fetch-site, ausencia de rutas de mutación o IPC genérico, rotación de token, apagado con conexiones HTTP parciales, caducidad pasiva por inactividad, detalles ocultos durante el bloqueo y denegación MCP. La integración real daemon/WebUI cubre configuración inicial, recuentos desbloqueados, bloqueo y desconexión.
  • Las pruebas de configuración cubren precedencia CLI/entorno/archivo, almacenamiento relativo, inspección sin almacén, reenvío explícito de configuración a sondas, idioma guardado en el home seleccionado, valores predeterminados de relay, valores malformados, errores censurados y conservación de archivos de configuración existentes.
  • Los procesos reales de CLI/bandeja de lanzamiento Windows arrancaron con un archivo TOML desechable y un almacén sintético. El navegador verificó estados bloqueado/desbloqueado y tres bibliotecas sintéticas, los cinco idiomas y diseños de escritorio/390 píxeles sin desbordamiento horizontal ni errores del navegador. El proceso de bandeja siguió respondiendo sin errores de arranque. No se verificaron clics de menú nativo porque la superficie de automatización no exponía una ventana de barra de tareas/bandeja.
  • cargo package --list incluye los recursos/fuentes integrados, plantilla de configuración y fuentes del lanzador. Pasaron las comprobaciones de sintaxis de empaquetado de shell/Python integrado de macOS. En este host Windows no estaban disponibles compilación macOS, ejecución de barra de menús, firma/notarización ni comprobaciones de ejecución Linux.
  • No cambiaron recursos móviles ni código Flutter; no se repitieron ejecuciones Flutter/dispositivo nativo ni los casos opcionales de herramientas criptográficas externas para esta versión.

Los registros son target/desktop-config-*.log y target/config-tests.log. El flujo manual Build desktop packages proporciona tareas de paquetes Windows/macOS; una definición de flujo no demuestra una compilación macOS exitosa.

Windows v0.1.1: documentación y alias de IDs de contraseñas (2026-09-18)

La etiqueta v0.1.1 identifica el código. Esta versión preliminar solo para Windows incluye todos los archivos versionados de docs/ con su estructura de directorios intacta; su BUILD-INFO.json registra el commit de origen y el SHA-256 de cada archivo empaquetado, y SHA256SUMS cubre el archivo comprimido y el manifiesto de compilación.

  • cargo test -p memories --locked --test crypto_jobs --test localization: siete pasaron, cero fallos; tres pruebas de herramientas externas ignoradas intencionalmente. La cobertura de regresión confirma que --password_id, --password y --password-id producen planes/resúmenes de aprobación idénticos; un ID de credencial modificado cambia la aprobación. La ayuda en cinco idiomas anuncia los alias.
  • cargo fmt --all --check, Clippy del espacio de trabajo/todos los destinos con -D warnings y cargo build --workspace --release --locked pasaron con Rust 1.98.1 MSVC. Persisten los avisos existentes de compatibilidad futura de dependencias y del enlazador FFI.
  • Pasaron las comprobaciones básicas de versión CLI/relay de lanzamiento y ayuda de criptografía.
  • Los resultados completos del espacio de trabajo, herramientas externas y Flutter que siguen se aplican a v0.1.0; esas baterías más amplias no se repitieron para esta actualización de alias/documentación CLI. No se recompiló ningún artefacto móvil; la versión de la aplicación Flutter no cambia.
  • El comando de empaquetado repetible es pwsh -File scripts/package-windows.ps1. Los registros de esta ejecución están en target/release-0.1.1-*.log.

Versión preliminar Windows v0.1.0 (2026-09-18)

Compilada localmente en Windows x86_64 con Rust 1.98.1 MSVC y Flutter 3.44.2. La etiqueta v0.1.0 identifica el código; el BUILD-INFO.json de lanzamiento registra su commit completo y SHA256SUMS cubre los recursos descargables.

  • cargo test --workspace --locked -- --test-threads=2: 131 pasaron, cero fallos, 14 pruebas ignoradas intencionalmente. El escritorio estaba activo y desbloqueado; ambas pruebas IPC previamente bloqueadas por bloqueo de pantalla pasaron sin exclusiones.
  • Las tres pruebas opcionales de interoperabilidad criptográfica pasaron por separado con identidades sintéticas: S/MIME, OpenPGP y firma en formato Android APK/AAB.
  • Pasaron formato Rust, Clippy del espacio de trabajo/todos los destinos con -D warnings y cargo build --workspace --release --locked. Persisten los avisos existentes de compatibilidad futura de dependencias.
  • Pasaron análisis Flutter, formato Dart y las 36 pruebas Flutter.
  • Pasaron versión/ayuda criptográfica del CLI de lanzamiento, ayuda del relay y una prueba básica real de DLL de lanzamiento (inicializar, bloquear, desbloquear, bloquear todo, cerrar) con una base de datos desechable.
  • GitHub Actions no pudo iniciarse porque GitHub notificó una restricción de pago o límite de gasto de la cuenta. Son resultados locales, no resultados de CI remota.
  • Los recursos son binarios de desarrollo Windows sin firmar. La configuración/descarga del Android NDK no terminó; en esta ejecución no se produjeron artefactos Android/iOS ni pruebas de dispositivos nativos. Siguen pendientes las compilaciones Linux/macOS y la aceptación de lanzamiento de producción.
Artefacto Windows SHA-256
memories.exe b8c2598e946bf1bcaca0cfb103ab1f4530b4f168579a5788a9ad73d86b252497
memories-relay.exe a810a647fea9a1a94a67a89e3c53801a38d46e41218f013b8394d176bb008d55
memories_ffi.dll b18925b45b84c4fdc1dafa16f6db5e4ea226629ff5d971a9289170c1c5cc4375

Los registros están en target/release-20260918-*.log.

Criptografía de correo y firma de aplicaciones (2026-09-17)

  • Pasan tres pruebas de interoperabilidad opcionales solo con identidades generadas: firma/verificación S/MIME y cifrado/descifrado PKCS#12; firma/verificación separada y cifrado/descifrado OpenPGP; alineación/firma/verificación de APK Android y firma/verificación JAR en formato AAB. El APK de prueba tiene un manifiesto Android binario real; la prueba AAB usa un contenedor JAR sintético, no un App Bundle desplegable. No se usó ninguna cuenta, identidad ni aplicación real.
  • Herramientas del equipo: OpenSSL 3.5.6 de Git for Windows, GnuPG 2.4.9 de MSYS, Adoptium JDK 17, Android Build Tools 35.0.0 y el JAR de la plataforma Android 36. Las pruebas GPG usan --msys-gpg y llaveros desechables. Ejecute las pruebas opcionales con las rutas de herramientas MEMORIES_TEST_* indicadas en crates/cli/tests/crypto_jobs.rs y cargo test -p memories --locked --test crypto_jobs -- --ignored --test-threads=1.
  • Las regresiones del núcleo cubren elevación local, denegación MCP, aprobaciones alteradas, entradas/herramientas modificadas, salidas existentes, auditoría/resultados sin secretos, limpieza de credenciales temporales, ejecución fallida de herramientas y herramientas que terminan correctamente sin generar salida. También se prueban la ayuda de CLI en cinco idiomas y el rechazo de iOS fuera de macOS.
  • Excluyendo los dos casos IPC que dependen del bloqueo de pantalla descritos abajo, la ejecución del espacio de trabajo pasa 129 pruebas, sin fallos y con 14 pruebas ignoradas intencionalmente (auxiliares de subprocesos y las tres pruebas de herramientas ejecutadas por separado). El comando es cargo test --workspace --locked -- --test-threads=2 --skip actual_daemon_enforces_unlock_sudo_and_suppresses_child_secrets --skip catch_cli_stores_secrets_without_disclosure_and_requires_sudo.
  • Pasan cargo build --workspace --locked, Clippy del espacio de trabajo/todos los destinos con -D warnings, el formato Rust, los espacios en blanco del diff y la comprobación quick_validate.py de la skill actualizada.
  • La ejecución completa del espacio de trabajo encontró dos fallos existentes del daemon/IPC real mientras la sesión de Windows estaba desconectada/bloqueada (query user indicaba Disc, con LogonUI en esa sesión). El enlace de bloqueo de pantalla del daemon revocó las sesiones sintéticas, produciendo errores LOCKED o de sesión remota eliminada. Al repetir esas pruebas en serie se observó el mismo comportamiento de bloqueo. Requieren un escritorio activo y desbloqueado; no se desactivó la protección de bloqueo para las pruebas.
  • La firma iOS está implementada, pero no se validó en ejecución en macOS. No hay ningún dispositivo Android conectado ni un NDK instalado aquí; no se recompilaron las bibliotecas móviles nativas, los APK ni los artefactos iOS. La FFI móvil sigue rechazando trabajos de procesos de escritorio. No se afirma haber validado instalación física, aceptación del aprovisionamiento de Apple, integración PGP/MIME con clientes de correo ni publicación en tiendas.

Inyección de skills en clientes de IA (2026-09-17)

  • Antes de hacer push, se exportó la instantánea preparada que solo contenía la skill a un directorio aislado y pasó cargo test -p memories --locked --bin memories --test skill_injection --test localization: 25 pasaron, sin fallos, con cuatro auxiliares de subprocesos ignorados intencionalmente. El formato también pasa allí.
  • Validación completa del árbol de trabajo, incluidos los cambios preexistentes de wiki/portapapeles: cargo test --workspace --locked -- --test-threads=2: 127 pasaron, sin fallos, con diez auxiliares de subprocesos ignorados intencionalmente e invocados por los escenarios principales. Las regresiones existentes de autorización, MCP, almacenamiento, sincronización, FFI y relay pasan junto con las nuevas pruebas de instalación.
  • Windows: pasan nueve regresiones nuevas (tres pruebas unitarias y seis pruebas de integración de CLI). Cubren directorios de usuario/proyecto, anulaciones de configuración, destinos duplicados, rutas de anulación compartidas, simulación, idempotencia, sustitución explícita, comprobación previa de conflictos, entradas no válidas, conservación de archivos vecinos y ayuda en cinco idiomas. Las pruebas usan directorios desechables y no inician un daemon ni inicializan un almacén de Memories.
  • Una comprobación independiente de uniones de Windows confirma que --force rechaza un directorio de skill enlazado antes de escribir otros destinos y conserva su archivo original. Se incluye la regresión de enlaces simbólicos Unix, pero no se ejecutó en este equipo.
  • Pasan cargo build --workspace --locked, cargo fmt --all --check, cargo clippy --workspace --all-targets --locked -- -D warnings y git diff --check. Se mantienen los avisos informativos existentes de compatibilidad futura de dependencias Rust y del enlazador FFI.
  • Pasa la comprobación quick_validate.py de skill-creator. cargo package -p memories --list --allow-dirty --locked confirma que el SKILL.md incluido se distribuye con el paquete CLI. La instalación no requiere acceso a la red.
  • Se comprobaron las rutas de descubrimiento con la documentación actual de Codex, OpenCode y Claude Code. No se probaron el descubrimiento real de los clientes ni el comportamiento de los modelos, la ejecución en Linux/macOS, Claude Desktop/Cowork ni las cargas de skills a la nube. No se modificaron directorios personales de skills ni configuraciones de clientes durante la validación.

Referencias a secretos en wiki y portapapeles (2026-09-17)

  • Espacio de trabajo Rust en Windows: 118 pasaron, sin fallos, con diez auxiliares de subprocesos ignorados intencionalmente e invocados por los escenarios principales. Pasan la compilación del espacio de trabajo, el formato Rust y las comprobaciones de espacios en blanco del diff. Las rutas actualizadas de CLI, IPC y FFI también se comprobaron en ejecuciones específicas tras sus cambios finales.
  • Pasan cuatro regresiones de funciones del núcleo: sustitución exacta, proyecciones seguras, elevación local/aislamiento MCP, rechazo de metadatos (incluido texto escapado), copias de tarjetas protegidas, rechazo de binarios/NUL, sincronización, persistencia y recuperación independiente de copias de seguridad. Una ejecución específica adicional verifica la reversión atómica cuando la sustitución amplía un documento más allá del límite de tamaño del cuerpo, después de preparar la credencial. El contenido histórico firmado se conserva intencionalmente sin cambios.
  • Pasa la suite IPC de CLI/daemon real (tres pruebas y cuatro auxiliares de subprocesos invocados explícitamente), incluidas la sustitución, las lecturas enmascaradas y la entrega de copias autorizadas. La regresión FFI pasa con las mismas operaciones JSON y deniega copias después del bloqueo nativo. Todos los datos de prueba usan secretos sintéticos y almacenes desechables; no se usó ningún almacén instalado ni el portapapeles del usuario.
  • Flutter: 36 pruebas pasaron, incluidos cinco casos nuevos de entrada de sustitución oculta, elevación antes de escribir en el portapapeles, descarte de respuestas tardías tras el bloqueo en segundo plano, fallos de copia y conservación de referencias durante la edición. La entrega al portapapeles usa un canal de plataforma simulado. Pasan el análisis de Flutter, el formato Dart y Clippy del espacio de trabajo/todos los destinos con -D warnings.
  • Las llamadas nativas al portapapeles de Windows compilan, pero no se probaron con el portapapeles interactivo. No se ejecutaron los auxiliares de portapapeles de Linux/macOS ni la entrega al portapapeles de los SO móviles. No había ningún dispositivo Android conectado ni un NDK instalado en el SDK configurado; no se recompilaron las bibliotecas/APK Android ni los artefactos iOS.
  • Registros: target/wiki-secret-tests.log, target/wiki-atomic-tests.log, target/wiki-ipc-tests.log, target/wiki-ffi-tests.log, target/wiki-flutter-tests.log, target/wiki-clippy.log, target/wiki-workspace-tests.log y target/wiki-build.log.

Preferencias de idioma guardadas (2026-09-17)

  • Pruebas de CLI: 19 pasaron, ocho auxiliares de subprocesos ignorados intencionalmente. Las pruebas de persistencia lanzan procesos CLI independientes con directorios de inicio desechables y verifican el guardado/sustitución de una preferencia, la selección al iniciar y en la ayuda, el aislamiento por directorio de inicio, las anulaciones temporales, el borrado del ajuste, los ajustes malformados y la limpieza tras fallos de escritura.
  • Pruebas de Flutter: 31 pasaron. Las nuevas regresiones verifican que los cambios en vivo de la configuración regional del sistema actualicen la interfaz y las fuentes alternativas sin escribir una preferencia. Las opciones guardadas permanecen fijas; restablecer el valor predeterminado del sistema persiste tras reiniciar.
  • Pasan el análisis de Flutter, Clippy del espacio de trabajo/todos los destinos con -D warnings, el formato Rust/Dart y las comprobaciones de espacios en blanco del diff. No se probaron dispositivos nativos.
  • Registros: target/i18n/persistence-rust.txt y target/i18n/persistence-flutter.txt.

Cliente y CLI en cinco idiomas (2026-09-17)

Equipo: Windows x86_64, Rust 1.98.1 MSVC, Flutter 3.44.2 / Dart 3.12.2.

  • Pruebas del espacio de trabajo Rust: 112 pasaron, diez auxiliares de subprocesos ignorados intencionalmente. Las pruebas de localización de CLI también pasan con los cambios finales de CLI.
  • Pruebas de widgets/unitarias de Flutter: 29 pasaron, incluidos cinco idiomas del sistema, idioma de reserva inglés, selección de idioma persistente, conservación de sesiones desbloqueadas, diálogos del ancho de un teléfono, recuentos plurales y enmascaramiento de vistas previas protegidas.
  • Pasan el análisis de Flutter, el formato Rust/Dart, Clippy del espacio de trabajo/todos los destinos con -D warnings y las comprobaciones de espacios en blanco del diff. Se mantienen los avisos existentes de compatibilidad futura de dependencias Rust.
  • Se probaron mediante el binario real la ayuda de CLI, la ayuda anidada, la prioridad de configuraciones regionales y los errores no interactivos localizados. Los campos JSON y los códigos de error permanecen estables. Se renderizaron capturas de widgets a 390 x 844 con fuentes cargadas para las pruebas.

Los registros locales están en target/i18n/. Se excluyó el proxy HTTP del equipo de las conexiones locales de las pruebas de Flutter. No se probaron dispositivos Android/iOS, selectores de archivos nativos, proveedores OAuth reales ni ejecución en Linux/macOS para este cambio de localización.

Seguimiento de recuperación en la nube y revocación (2026-09-17)

Equipo: Windows x86_64, Rust 1.98.1 MSVC. Los datos de regresión usan datos sintéticos, bases de datos cifradas temporales y solo HTTP local.

  • cargo test --workspace --locked -j 2 --no-fail-fast -- --test-threads=2: 106 pasaron, diez auxiliares de subprocesos ignorados intencionalmente. Esto incluye las 24 pruebas de integración de sincronización en la nube/HTTP.
  • Pasan cargo fmt --all --check y Clippy del espacio de trabajo/todos los destinos con -D warnings. Se mantienen los avisos existentes de compatibilidad futura de dependencias.

La suite de regresión cubre respuestas de descarga dañadas seguidas de reintentos correctos, objetos rechazados que se mantienen distintos de las importaciones correctas y una exploración única de recibos antiguos. También comprueba las descargas de dependencias con una bandeja de entrada llena, la expulsión de búferes de sobres sin referencias y los cursores de directorio que permanecen en una página admitida parcialmente.

Las pruebas de revocación cubren tanto los datos en cola que nunca deben enviarse como una carga ya en curso: esta última puede finalizar, pero se impide la siguiente solicitud y se rechaza su acuse de recibo obsoleto. El entorno de prueba de Google Drive acepta nombres duplicados y solo rechaza ID de archivo duplicados. Su prueba de reinicio interrumpe al trabajador después de que el servidor acepta un archivo, verifica que el ID ya se almacenó localmente y luego comprueba que el reintento cree exactamente un sobre y un descriptor.

El entorno HTTP de prueba pone explícitamente los sockets aceptados en modo de bloqueo en Windows; de lo contrario, pueden heredar el modo no bloqueante del socket de escucha y restablecer conexiones antes de que lleguen los bytes de la solicitud. El entorno de memoria ahora oculta objetos tanto en el listado como en las descargas directas al simular una publicación incompleta.

No se usó ninguna cuenta real en la nube ni dispositivo nativo Android/iOS para este seguimiento. Siguen aplicándose los límites de aceptación de plataforma y versión registrados abajo.

Seguimiento de fiabilidad y nube móvil (2026-09-17)

Equipo: Windows x86_64, Rust 1.98.1 MSVC, Flutter 3.44.2 / Dart 3.12.2. Se usaron secretos sintéticos y bases de datos desechables en todo momento.

  • Pasan las pruebas del espacio de trabajo Rust, incluida la regresión del daemon real de cliente bloqueado/bloqueo. Las pruebas específicas también verifican que una solicitud HTTP en la nube bloqueada permita bloquear, que se rechacen ejecuciones simultáneas de proveedores y que un acuse de recibo tardío no pueda restaurar una sesión invalidada.
  • Las regresiones de nube cubren redirecciones normales de descarga de OneDrive sin reenviar tokens Bearer, bucles de redirección/destinos inseguros, encolado y reconexión por proveedor, compactación de colas completadas más allá de los antiguos límites 256/4096 y reintentos de objetos temporalmente ausentes tras la espera progresiva. Los destinatarios revocados ya no bloquean la preparación para dispositivos activos ni mantienen una bóveda modificada para siempre. El entorno HTTP de prueba ahora permanece activo hasta que su propietario lo detiene, en vez de caducar después de 30 segundos.
  • La prueba FFI de Windows verifica los bloqueos pendientes en segundo plano en identificadores tanto ocupados como inactivos y el despacho mediante el trabajador nativo de nube. La validación OAuth nativa rechaza devoluciones de llamada inseguras y PKCE malformado antes de la E/S de red.
  • Pasan el formato Rust y Clippy del espacio de trabajo/todos los destinos con -D warnings. Se mantienen los avisos existentes de compatibilidad futura de russh/proc-macro-error2.
  • Pasan el análisis de Flutter y las 16 pruebas de widgets, incluidos el estado de las cuentas y el bloqueo manual mientras hay una solicitud de sincronización en curso. Los tokens de acceso/renovación de Rust nunca se devuelven a Dart; AppAuth proporciona el código de autorización/verificador.
  • La prueba de rendimiento de almacenamiento en modo release se ejecuta con 10, 100 y 1000 registros sintéticos. Los resultados y las definiciones de métricas están en performance.md. La adición de entradas de auditoría ya no deriva la misma clave pública del dispositivo para cada entrada anterior.
  • Se comprueban localmente el YAML de flujos de trabajo, el Python integrado de configuración de firma, el escape Unicode de propiedades Java, los enlaces/cercas Markdown y los espacios en blanco del diff.

Se intentó instalar el SDK/NDK/emulador Android, pero las transferencias de archivos oficiales grandes fueron demasiado lentas para completarse durante esta ejecución. No se afirma ningún resultado de APK Android/dispositivo nativo para este cambio. Las compilaciones iOS requieren macOS y no se ejecutaron. Los nuevos trabajos de CI nativos y el flujo manual de firma Android no se han ejecutado remotamente. Son comprobaciones configuradas, no artefactos de compilación verificados.

No se realizaron registro de cliente OAuth nativo, consentimiento real en la nube, distribución firmada, ejecución en dispositivo físico ni revisión de seguridad independiente. La compatibilidad de Google con redirecciones nativas debe validarse por separado para Android e iOS con el registro elegido. Consulte release-checklist.md para los criterios de aceptación. No se sustituyeron los binarios memories instalados ni las bóvedas reales de usuarios.

Nombre del proyecto en la primera versión (2026-09-17)

El proyecto, el repositorio, la CLI, los paquetes Rust y Dart, los símbolos y la cabecera FFI, los identificadores Android/iOS, los nombres de almacenamiento, las variables de entorno y los dominios criptográficos ahora usan memories de manera uniforme. Esta primera versión no tiene alias del nombre anterior ni rutas de migración. El repositorio es https://github.com/mbcc2006/memories.

Equipo: Windows x86_64, Rust 1.98.1 MSVC, Flutter 3.44.2 / Dart 3.12.2.

  • cargo test --workspace --locked -j 2 -- --test-threads=2: 89 pasaron, diez auxiliares de subprocesos ignorados intencionalmente.
  • cargo fmt --all --check y Clippy del espacio de trabajo/todos los destinos con -D warnings: pasaron.
  • cargo build --workspace --release --locked -j 2: pasó; la versión de CLI y la ayuda del relay indican el nuevo nombre.
  • Pasaron seis comprobaciones básicas de CLI/daemon/FFI en modo release con una biblioteca desechable: inicialización/escritura/copia de seguridad nativas, desbloqueo/lectura del daemon, selección de MEMORIES_HOME, lectura y bloqueo/desbloqueo de CLI, restauración nativa de copias de seguridad y la exportación memories_lock_all que bloquea los identificadores nativos activos.
  • Formato Dart y flutter analyze: pasaron. Pruebas de widgets de Flutter: 14 pasaron. La primera ejecución de widgets no pudo conectarse al ejecutor local de pruebas debido al proxy HTTP del equipo; la repetición eliminando las variables de proxy de ese proceso y con la interfaz local en NO_PROXY pasó.

Las evidencias locales están en target/rename-tests.log, target/rename-clippy.log, target/rename-release-build.log, target/rename-e2e.log, target/rename-e2e-report.json, target/rename-flutter-analyze.log y target/rename-flutter-tests.log. El informe E2E vincula su resultado al hash de CLI. No se ejecutaron compilaciones APK Android/iOS ni pruebas de integración en dispositivos nativos para este cambio de nombre. Los resultados E2E de proxies con servicios reales de la siguiente sección describen su compilación anterior; esta sección registra las comprobaciones básicas locales de la nueva versión.

Artefacto de lanzamiento de Windows SHA-256
target/release/memories.exe 3820d6d0d1effb64a98f3672cf7d8235739b22989c16c1c4112a1d2282012e5e
target/release/memories-relay.exe 9e92d253572f57256b423dd893dde5d580d711ffd84d22e39e8eceb3f5235221
target/release/memories_ffi.dll 0cefa06d8527b5a9c9003636a1425cd7e2d0708f6b1d380ffaad9fc508b2c9af

Proxies SSH/bases de datos y E2E de la versión (2026-09-16)

Equipo: Windows x86_64, Rust 1.98.1 MSVC. Se probó la CLI/daemon en modo release con servidores desechables OpenSSH 8.9p1, PostgreSQL 14.24, MySQL 8.0.46 y Redis 6.0.16 en Ubuntu 22.04 WSL. Los paquetes de servidor se extrajeron en un directorio privado temporal, con datos, certificados y cuentas sintéticas independientes; no se instalaron servicios del sistema. El daemon de prueba usó un --home desechable. Después se detuvieron todos los servidores de prueba y se eliminaron sus datos/claves privadas.

  • Regresión del espacio de trabajo: 88 pasaron, diez auxiliares de subprocesos ignorados intencionalmente. Comando: cargo test --workspace --locked -j 1 -- --test-threads=1.
  • Las correcciones posteriores de ID cortos pasaron las nueve pruebas remotas y el escenario IPC del daemon real. La corrección final de apagado pasó las cuatro pruebas de proxy, ambos escenarios IPC y una regresión adicional de parada inmediata/bloqueo sin espera de apagado/join en el cliente de prueba. Estas ejecuciones específicas son posteriores a la ejecución completa del espacio de trabajo.
  • Pasaron las comprobaciones finales de Clippy del espacio de trabajo/todos los destinos con -D warnings, formato Rust y espacios en blanco del diff. Se mantienen los avisos existentes de compatibilidad futura de las dependencias russh y proc-macro-error2; no se suprimió ningún error del analizador.
  • Pasó cargo build --workspace --release --locked -j 2. Los comandos de versión/ayuda de la CLI recompilada y de ayuda del relay se ejecutaron correctamente. No se sustituyeron el daemon instalado ni los datos de usuario.
  • Pasaron 11 comprobaciones E2E con servicios reales mediante scripts/test-proxy-e2e.py con el binario release recompilado. Los clientes OpenSSH y SFTP, psycopg2, PyMySQL y redis-py se conectaron a proxies locales creados por el daemon sin secretos del servidor de destino.

La cobertura E2E incluye importación de credenciales por ID corto y denegación de lectura de secretos; rechazo por discrepancia de clave del host SSH; reenvío de stdout, stderr y código de salida; carga/descarga SFTP; rechazo de TLS PostgreSQL no confiable; PostgreSQL SCRAM, TLS verificado, Unicode y reversión de transacciones; MySQL caching-SHA-256, TLS verificado y Unicode de cuatro bytes; Redis AUTH sobre TLS; aislamiento de elevación MCP; parada explícita sin interrumpir otros proxies; y bloqueo que cierra todos los sockets de escucha y las conexiones SSH/bases de datos ya establecidas.

La primera ejecución E2E detectó que proxy stop retornaba mientras el bucle de aceptación todavía podía reenviar solicitudes durante hasta 200 ms. El servicio ahora posee y espera la finalización del trabajador del proxy antes de confirmar la parada/bloqueo. La repetición E2E final comprueba la desconexión inmediatamente después de la respuesta y pasa.

Evidencias locales: target/proxy-20260916-workspace-tests.log, target/proxy-20260916-remote-tests.log, target/proxy-20260916-shutdown-tests.log, target/proxy-20260916-close-regression.log, target/proxy-20260916-clippy.log, target/proxy-20260916-release-build.log, target/proxy-20260916-e2e.log y target/proxy-e2e/results/report.json. El informe vincula el resultado E2E al SHA-256 de CLI indicado abajo. El script reutilizable requiere entornos desechables aprovisionados externamente, según se describe en la documentación de su módulo; no instala servidores.

Artefacto de lanzamiento de Windows SHA-256
CLI de Windows (compilación histórica) eea9ee3db29ea26e0dbf0d8090475eed05e2653936cc70816ea5147b1240447f
Relay de Windows (compilación histórica) 34d4a15094031e47d1d9086291d52d04419caf509b848dbc1ae41fa57f491c3a
Biblioteca FFI de Windows (compilación histórica) f02e7efaff6fa182e3d9cd047289aad184c3c441277539bbf5920038fb149bfd

No se recompilaron ni ejecutaron artefactos Android/iOS ni pruebas de ejecución nativa para este cambio de proxies de escritorio. No se usaron servidores SSH/bases de datos de producción ni cuentas reales en la nube.

Sincronización de objetos en la nube (2026-09-16)

Se añadió un ejecutor de objetos inmutables independiente del proveedor con recibos duraderos de bandeja de salida/entrada. La cobertura está en las pruebas unitarias de crates/core/src/sync.rs y crates/core/tests/cloud_sync.rs:

  • Los bytes exactos del sobre persisten al reabrir el proceso; una escritura fallida reintenta el mismo ID de objeto sin volver a cifrar.
  • Una carga duplicada descarga y verifica el objeto existente antes de marcar el trabajo como cargado.
  • Un descriptor listado antes de su sobre permanece pendiente; revelar el sobre y reordenar/duplicar el listado sigue importándolo una sola vez.
  • Una descarga dañada se registra como corrupt y no combina el estado de la bóveda.
  • El bloqueo y el cierre de sesión incrementan la sesión de sincronización para que un CloudSyncAck tardío no pueda importar; los trabajos incompletos de la bandeja de salida permanecen cifrados tras desbloquear hasta que el cierre de sesión los cancele.
  • Dos dispositivos emparejados intercambian ediciones simultáneas mediante MemoryTransport.
  • Las bóvedas exclusivamente locales y los llamantes MCP no pueden encolar ni inspeccionar trabajos. Las copias de seguridad y las bibliotecas restauradas tienen cloud_sync vacío y ninguna cuenta en la nube.

Se añadieron sesiones SSH/FTP/TCP gestionadas por el daemon con propuesta/aprobación/ejecución por instrucción (crates/core/src/remote.rs, crates/core/tests/remote.rs). Las sesiones MySQL, Redis y PostgreSQL mantienen el estado en la conexión activa y activan TLS de forma predeterminada (verificación del nombre de host; credencial CA PEM opcional). --no-tls es explícito. No se realizaron negociaciones TLS con bases de datos reales. La generación de claves SSH/TLS mantiene las claves privadas dentro del almacenamiento de credenciales; las pruebas comprueban que las respuestas de generación/clave pública no contienen PEM de claves privadas. Los proxies SSH/Redis de bucle local inyectan credenciales almacenadas para que un cliente local pueda conectarse sin el secreto; el bloqueo activa el indicador de parada del proxy. No se utilizaron cuentas reales.

Se añadieron la renovación de tokens, los adaptadores OneDrive/Google Drive, CloudSyncRun del daemon y memories cloud sync. La cobertura está en las pruebas de renovación de cloud.rs y los entornos de prueba de bucle local de crates/core/tests/cloud_drive.rs. No se autorizaron cuentas reales de Microsoft/Google. No se añadió una interfaz móvil de inicio de sesión/sincronización.

Comprobación local del 2026-09-16 (Windows x86_64, rustc 1.98.1 GNU, MinGW-w64 GCC 16.2.0):

  • cargo test -p memories-core --locked -j 1 -- --test-threads=1: 49 superadas, dos auxiliares de subprocesos omitidos intencionadamente.
  • cargo clippy -p memories-core --all-targets --locked -- -D warnings: superada.
  • cargo fmt --all: superada.

Revisión del repositorio (2026-09-09)

  • Espacio de trabajo Rust en Windows: 51 superadas, cero fallos. Diez auxiliares de subprocesos omitidos intencionadamente se ejecutan explícitamente desde sus pruebas principales. Comando: cargo test --workspace --locked -j 1 -- --test-threads=1.
  • Las pruebas de inicialización terminan un proceso después de preparar los datos y antes de publicarlos, y luego recrean/desbloquean correctamente el almacén. Los destinos existentes, incluido un archivo que aparece durante la inicialización, permanecen intactos; el bloqueo del SO sobre el destino sigue retenido hasta finalizar la publicación. Esto no simula una pérdida física de alimentación.
  • La captura de credenciales rechaza claves JSON duplicadas, incluidos objetos anidados y nombres equivalentes mediante escapes. Las pruebas conservan el comportamiento válido de matrices/punteros/cadenas, la ocultación de errores y el rechazo a través del IPC real de CLI/daemon.
  • Un entorno de prueba HTTP de perfil con retraso confirma que la latencia de red OAuth no puede prolongar la validez del token de acceso. Se superan las regresiones existentes de intercambio con proveedores y cancelación por bloqueo/cierre de sesión. Las pruebas WebSocket del relay ahora incluyen Ping/Pong; las respuestas de control usan el mismo tiempo de espera de envío de diez segundos que los datos encolados. No se realizó una prueba prolongada con sockets saturados.
  • Se superaron Clippy para el espacio de trabajo/todos los destinos con -D warnings, el formato Rust/Dart, los espacios en diferencias y las comprobaciones locales de enlaces/bloques Markdown. El análisis de Flutter no informó problemas; se superaron las 14 pruebas de widgets.
  • La FFI de Windows recompilada superó comprobaciones desechables con datos sintéticos de inicialización correcta sin archivos temporales residuales, rechazo de tickets obsoletos tras el bloqueo, persistencia de cuentas cifradas al reabrir, estado con solo metadatos y cierre de sesión local. El entorno de prueba se eliminó después.
  • Registros locales: target/review-20260909-rust-tests.log, target/review-20260909-clippy.log y target/review-20260909-flutter-tests.log. Rust usó D:/memories-build-cache/cards con un único trabajo de compilación/hilo de prueba.
  • En esta revisión no se realizó autorización real de Microsoft/Google, ejecución nativa Android/iOS ni comprobación en ejecución de Linux/macOS. No se sustituyeron los binarios instalados; no se validaron CI remoto ni artefactos de publicación.

Autorización en la nube (2026-09-09)

  • Espacio de trabajo Rust en Windows: 47 pruebas superadas, incluidas las regresiones de autorización en la nube y fallos de almacenamiento. Nueve pruebas auxiliares se excluyen del descubrimiento y sus escenarios principales las ejecutan explícitamente.
  • Se superaron Clippy para el espacio de trabajo/todos los destinos con -D warnings, el formato Rust y las comprobaciones de espacios en diferencias. Tras el ajuste final de lanzamiento no bloqueante del navegador se ejecutaron las pruebas de nube de la CLI, Clippy y una nueva compilación de CLI/FFI.
  • Ambos proveedores OAuth se probaron con entornos HTTP locales: PKCE, estado, identidad de cuenta, comprobaciones de ámbito, ausencia de tokens de renovación, límites de respuesta, redirecciones rechazadas y errores genéricos sin reflejar secretos.
  • Una prueba real de socket de bucle local rechazó una devolución de llamada ajena y aceptó la correspondiente sin reflejar su código en la respuesta HTTP.
  • Las regresiones del núcleo comprobaron la vinculación llamante/proveedor, la repetición, la cancelación por bloqueo/cierre de sesión, la persistencia cifrada, el aislamiento de auditoría/MCP y la ausencia de tokens de nube en las cargas descifradas de copias de seguridad y sincronización.
  • Un entorno de prueba temporal de FFI en Windows con tokens sintéticos superó la persistencia de autorización al cerrar/reabrir, la cancelación mediante memories_lock_all y el cierre de sesión. El entorno de prueba se eliminó después.
  • No se proporcionaron configuración de cliente registrado ni cuenta real en la nube, por lo que el consentimiento real y la emisión de tokens de Microsoft/Google siguen sin verificarse. No se cargaron archivos en la nube. No había ningún dispositivo/emulador Android conectado; la ejecución nativa Android/iOS y la interfaz móvil de inicio de sesión no se validaron en este cambio.
  • Se compilaron binarios de desarrollo locales; los binarios instalados de CLI/daemon no se sustituyeron y no se afirma ningún resultado de CI remoto ni de publicación.

Validación previa al envío (2026-09-09)

  • Regresión del espacio de trabajo Rust: 30 superadas; dos auxiliares secundarios de IPC siguen siendo invocados explícitamente por el escenario principal. Se incluyen colisiones de ID cortos, historial, referencias protegidas y ciclos completos de concesiones.
  • Se superaron Clippy para el espacio de trabajo/todos los destinos con -D warnings y el formato Rust. La comprobación de paridad de ID cortos se actualizó a is_multiple_of; ambas pruebas unitarias de ID se superaron de nuevo después de esa corrección equivalente del linter.
  • Se superaron el formato Dart, el análisis Flutter y las 14 pruebas de widgets.
  • Las pruebas de Windows usaron D:/memories-build-cache/cards, un trabajo de compilación y un hilo de prueba. Los archivos PDB antiguos que causaban LNK1201/LNK1207 se conservaron con el sufijo .pre-push-20260909 antes de regenerarlos. El registro satisfactorio del espacio de trabajo es target/push-20260909-rust-tests.log.
  • Durante esta comprobación no se recompilaron binarios de publicación ni artefactos Android; los hashes de artefactos anteriores indicados abajo no validan el nuevo protocolo de ID cortos. Los resultados de CI remoto se registran por separado.

Seguimiento de la longitud de contraseñas (2026-09-09)

Las contraseñas locales y de copias de seguridad ya no tienen una política de longitud mínima ni máxima impuesta por la aplicación. Se acepta la entrada vacía. Se mantienen la confirmación, los parámetros Argon2id, la autenticación, el ámbito de sudo y el almacenamiento cifrado.

  • Se superó una nueva regresión del núcleo para longitudes 0, 1 y 4096: creación de almacenamiento, autenticación, desbloqueo, copia de seguridad y recuperación; se rechazan las contraseñas incorrectas.
  • Se superaron Clippy para el espacio de trabajo/todos los destinos con -D warnings y el formato Rust.
  • Se superaron el análisis Flutter y las 14 pruebas de widgets, incluida la inicialización con contraseñas vacías y de un carácter manteniendo el paso de confirmación.
  • Se recompilaron CLI/FFI de Windows y se reinició el daemon local. Un entorno temporal separado contra la FFI de publicación superó inicialización/desbloqueo/sudo con un carácter, una contraseña de copia de seguridad vacía y recuperación protegida por una contraseña de un carácter.
  • Se recompilaron ambas ABI Android y el APK con punto de entrada normal. Se superaron las comprobaciones de igualdad entre bibliotecas nativas de origen/combinadas y eliminadas de símbolos/APK. No se repitió la integración en ejecución de Android para este cambio exclusivo de longitud; el entorno de prueba nativo ahora usa una contraseña de un carácter para la siguiente ejecución en dispositivo.

Estos hashes sustituyen los registros anteriores de artefactos. El registro de compilación es target/password-length-android-build.log; los hashes detallados por ABI están en target/password-length-artifacts.json.

Artefacto SHA-256
CLI de Windows (compilación histórica) 0b35b8becadccfcb82d41ccca6c231880fa29003f60eb84ac590953ddf4ed10d
Biblioteca FFI de Windows (compilación histórica) 2556e0bc894584520b6b7311e1889680a5cd28bc9c36a180f8b986ce59aca04c
mobile/build/app/outputs/flutter-apk/app-debug.apk 4167422819f7ed8ec5cd41faab7e0ac598b26d40e0869cec8f81906de6efc2d3

Seguimiento de tarjetas, metadatos protegidos y OTP

Las siguientes comprobaciones de funciones y artefactos sustituyen los hashes de compilación de referencia registrados más adelante en este documento. Todas las credenciales utilizadas durante la validación fueron sintéticas; no se utilizaron credenciales de cuentas proporcionadas ni servidores de correo.

  • Regresión del espacio de trabajo Rust: 25 superadas. El escenario ampliado de IPC de CLI y las comprobaciones RFC 6238/entradas malformadas también se superaron tras sus últimas incorporaciones de pruebas. Dos pruebas auxiliares se omiten deliberadamente del descubrimiento y las ejecuta explícitamente el escenario IPC (inyección de credenciales y sudo desde un proceso hermano).
  • Formato Rust y Clippy para el espacio de trabajo/todos los destinos con -D warnings: superados. Las comprobaciones de depuración en Windows usaron D:/memories-build-cache/cards y -j 2.
  • Análisis Flutter y las 12 pruebas de widgets: superados. La cobertura incluye un grafo de tamaño telefónico, enlaces entrantes dirigidos, vistas previas ocultas, autorización OTP privada, caducidad y cierre del diálogo OTP al pasar a segundo plano/bloquear.
  • Se recompiló el espacio de trabajo de publicación de Windows. Una CLI de publicación real con un almacén cifrado temporal registró Python 3.13.1 y el directorio de su ejecutable, marcó la bóveda como exclusivamente local y encontró la observación mediante búsqueda de tarjetas. El entorno de prueba y el daemon se eliminaron tras la comprobación.
  • Se recompilaron las bibliotecas FFI Android ARM64/x86_64. El emulador x86_64 API 35 superó la prueba real de integración FFI: tarjetas/enlaces/grafo, búsqueda de dotenv solo por claves, generación TOTP, denegación de lectura de credenciales, auditoría y bloqueo/desbloqueo. Registro: target/cards-android-native-test.log.
  • Se recompiló e instaló el APK de desarrollo con punto de entrada normal tras la prueba de integración. Se completaron correctamente el inicio, la inicialización de contraseña, la creación de biblioteca y la apertura del nuevo formulario de tarjeta protegida. El envío manual posterior del formulario de cuenta se interrumpió cuando el emulador desapareció de ADB; ese escenario manual adicional no se registra como superado. XML de inicio: target/cards-android-startup.xml; registro de compilación: target/cards-android-build.log.
  • Se comprobaron las bibliotecas nativas empaquetadas por ABI: el origen coincide con la salida combinada de Gradle y la salida sin símbolos coincide con la entrada del APK. Evidencias y tamaños: target/cards-artifacts.json.

Las pruebas de seguridad del núcleo cubren almacenamiento cifrado separado de credenciales, fallos atómicos, ausencia de secretos en búsqueda/listado/grafo/MCP/auditoría y bytes de la base de datos en texto plano, denegación de sustitución de referencias, restricciones de host/inyección de cabeceras, exclusión de bóvedas exclusivamente locales del emparejamiento/sincronización/copia de seguridad y referencias OTP tras sincronización/recuperación. La cobertura RFC 6238 incluye las seis marcas de tiempo estándar para SHA-1/SHA-256/SHA-512, además de salida de seis dígitos y rechazo de semillas/períodos malformados. Las pruebas de cabeceras HTTP usan valores sintéticos y verifican el marcado de cabeceras sensibles; no se realizó ninguna solicitud autenticada a un servicio de producción.

Artefactos actuales (compilación de desarrollo, sin firma para distribución):

Artefacto SHA-256
CLI de Windows (compilación histórica) 9ff3d67b145508935e793dd7ce9b773d9f373549a8b08479de2f9c31a499dbd3
Relay de Windows (compilación histórica) 4aae7b45fbe9e009a7f118a384d246b3c878f2e43da821110c8e4bb5ef5a091a
mobile/build/app/outputs/flutter-apk/app-debug.apk 4551a72acab24cfdfb6279f2e27507ca24a938ee716417fb99e4bad96847a9fe

SHA-256 de Rust empaquetado:

ABI SHA-256
arm64-v8a eb8013d2bde1041412d08deb074f3fbbab7a24400e7cdde4cec890398b58f6a9
x86_64 cf34d3a09ba0c417460625d2f2ddf102cb891241e64de97f09479b63449f1aa9

Siguen siendo aplicables las limitaciones de plataforma al final de este documento. Esta sección registra la validación local; aquí no se afirma ningún resultado de CI remoto.

Espacio de trabajo Rust de referencia en Windows

Host: Windows x86_64, Rust estable 1.98, cadena de herramientas MSVC, SQLite integrado.

Comprobación Resultado
cargo fmt --all --check Superada
cargo clippy --workspace --all-targets --locked -j 1 -- -D warnings Superada
cargo test --workspace --locked -j 1 -- --test-threads=1 18 superadas, 1 auxiliar omitido intencionadamente
cargo build -p memories -p memories-relay --release --locked -j 1 Superada
cargo ndk -t arm64-v8a check -p memories --locked -j 1 Superada; solo compilación de código condicional Unix

La prueba omitida es el ejecutable secundario usado por la prueba IPC y se ejecuta explícitamente allí con inyección de credenciales. No es un escenario de seguridad omitido.

Las pruebas ejercitan el cifrado autenticado y la manipulación del transporte, el estado cifrado de SQLite, contraseñas incorrectas, truncamiento de puntos de control, orden de fragmentos, permisos, aprobación y revocación de dispositivos, denegación de reautorización de identidad, pertenencia compartida, repetición, revisiones simultáneas, resolución de bifurcaciones de políticas y recuperación independiente de copias de seguridad. Una prueba real del daemon CLI cubre desbloqueo, sudo en terminal, denegación de lectura de credenciales, aprobación del resumen del ejecutable, supresión de salida de procesos secundarios, auditoría firmada, ámbito MCP y bloqueo. Una prueba WebSocket real comprueba el enrutamiento activo y la limpieza de salas tras la desconexión.

La implementación de canalizaciones con nombre de Windows usa un enmarcado bloqueante. Un intento de implementación PIPE_NOWAIT falló la regresión del daemon real y fue sustituido; los límites de disponibilidad para el mismo usuario se documentan en SECURITY.md.

Artefactos de referencia de Windows (rutas relativas al repositorio; Git ignora las salidas de compilación). La CLI también superó la ejecución de --version y --help:

Artefacto SHA-256
CLI de Windows (compilación histórica) c9086eb0dfabc0fbdb0ce8ba37a8f82b837c551138aa8d2fe900df2e6d4b7495
Relay de Windows (compilación histórica) 7a3713068f28d10e4c839a5c0587b85e1502b1a8bc7fe4ef6e42b8c349244b77

Flutter y bibliotecas nativas móviles

Cadena de herramientas: Flutter 3.44.2 / Dart 3.12.2, Android NDK 28.2.13676358, plataformas Android SDK 35, 36 y 37.0, Gradle 9.1.0.

Comprobación Resultado
dart format --output=none --set-exit-if-changed lib test integration_test Superada
flutter analyze Superada, sin problemas
flutter test 3 pruebas de widgets superadas
Compilaciones de publicación de FFI Rust para Android ARM64 y x86_64 Superadas
Prueba de integración nativa del emulador Android API 35 x86_64 Superada
Instalación del APK Android normal y flujo básico de interfaz Superados

Las pruebas de widgets verifican que un fallo de inicio nativo deja la biblioteca bloqueada, que pasar a segundo plano cierra los diálogos de contenido y borra el estado de autorización, y que la caducidad por inactividad también cierra un diálogo de contenido ya abierto. Las respuestas asíncronas tardías se rechazan después de cambiar la generación de autorización móvil. La prueba de integración nativa usa una base de datos temporal en el dispositivo en lugar de un backend simulado. Inicializa el servicio Rust real, escribe y lee memoria, exige elevación para añadir credenciales, rechaza lecturas de credenciales, verifica la cadena de auditoría, bloquea todos los identificadores nativos y desbloquea contenido persistido sin restaurar la elevación. El directorio del entorno de prueba se elimina después de la prueba.

El emulador ejecuta una imagen x86_64 API 35 existente en modo de solo lectura, sin guardar instantáneas. La salida de las pruebas está disponible localmente en target/android-native-test.log. La compilación Android emite una advertencia de versión XML del SDK heredado desde la cadena de herramientas de un complemento, pero esto no impidió la compilación ni la ejecución nativa. El SDK de compilación de la aplicación es 37 para cumplir los requisitos del complemento de almacenamiento seguro.

El APK final con punto de entrada normal se recompiló después de las pruebas de integración, se instaló y se probó mediante automatización de interfaz Android. Se superaron las comprobaciones de inicio con el complemento real de almacenamiento seguro, inicialización de contraseña, creación de una biblioteca y memoria, lectura de esa memoria, paso a segundo plano con contenido abierto, regreso a una pantalla bloqueada y desbloqueo para volver a leer el contenido persistido. Esto comprueba la aplicación normal, además del punto de entrada de pruebas de integración. Las evidencias de interfaz se guardan en target/android-ui-startup.xml, target/android-ui-initialized.xml, target/android-ui-memory-saved.xml, target/android-ui-content-open.xml, target/android-ui-background-locked.xml y target/android-ui-unlocked-persisted-content.xml. Solo se utilizaron datos de prueba sintéticos. El emulador de solo lectura se detuvo después de la verificación.

APK de referencia: mobile/build/app/outputs/flutter-apk/app-debug.apk, 177,630,089 bytes. SHA-256: 1d671906316c139eca786e89a5cca2c5d7895a825c0d58f4c32e71e6ff8be382. Es un APK de desarrollo con firma de depuración, no una versión para tienda.

Tanto arm64-v8a como x86_64 incluyen el motor Flutter y la biblioteca FFI Rust. Las bibliotecas JNI de origen coinciden con las bibliotecas combinadas de Gradle; las bibliotecas sin símbolos de Gradle coinciden con el contenido final del APK. La eliminación de símbolos explica la diferencia en la comparación directa entre hashes de origen y APK. Valores SHA-256 de las bibliotecas Rust empaquetadas:

ABI SHA-256
arm64-v8a 6475026924b2e0434b1bbb945b21f9fa1684c53760ba228a72e062e519835d8c
x86_64 3a208026380c0cc164f1f80c25de6daad3120857c4f2c9e96bf34e91912e9c1e

La caché de compilación de depuración de Windows se trasladó a D:/memories-build-cache/20260908/windows-debug para liberar espacio en disco para la validación del emulador. Los archivos fuente y artefactos de publicación permanecen en el repositorio. Las compilaciones Android usaron un target/gradle-home específico de la tarea para evitar la configuración obsoleta de proxy del host, además de un repositorio local con los JAR exactos del motor Flutter verificados contra metadatos HTTPS oficiales. No se modificaron código del motor ni fuentes de caché de complementos. Los directorios caches, wrapper y jdks de este directorio de Gradle son uniones hacia la caché Gradle del host.

Plataformas y validación pendiente

  • No se han ejecutado comprobaciones de funcionamiento de escritorio Linux y macOS en este host Windows. La compilación cruzada Android no demuestra el funcionamiento correcto en Linux o macOS.
  • La compilación iOS con Xcode, la ejecución en simulador/dispositivo, la firma, el comportamiento de Keychain y el XCTest nativo requieren un host macOS y no se han ejecutado aquí.
  • No se ha ejecutado en un dispositivo físico Android ARM64; una compilación cruzada satisfactoria por sí sola no demuestra el comportamiento del hardware ni las garantías de almacenamiento seguro.
  • CI define comprobaciones Rust para Windows/Linux/macOS y comprobaciones Flutter, pero no se afirma ningún resultado de CI remoto. No se ha realizado firma de publicación ni publicación en tiendas.
  • No se ha realizado ninguna revisión criptográfica independiente, prueba de penetración ni prueba de recursos a gran escala. Consulte SECURITY.md antes de utilizar secretos reales.

Valores predeterminados del cliente y generación de habilidades (2026-10-01)

  • memories default set/get/delete completan un ciclo de ida y vuelta con un --home desechable, rechazan claves desconocidas y valores type inválidos, y eliminan defaults.json cuando queda vacío.
  • Los comandos de listado aplican los valores predeterminados vault / type / category cuando se omiten las opciones.
  • Los comandos de mundo/cosa/evento de persona resuelven bóveda/activo omitidos desde los valores predeterminados persona / vault (VAULT/ASSET, forma con barra o activo con bóveda predeterminada).
  • memories skill generate / agents generate escriben AGENTS.md o un SKILL.md con estructura de habilidad sin conexión y sin persona; rechazan sobrescribir sin --force.
  • cargo test --workspace --locked cubre pruebas unitarias y de integración para estas rutas.