diff --git a/README.es-ES.md b/README.es-ES.md
index 6da2d86..bc1db5d 100644
--- a/README.es-ES.md
+++ b/README.es-ES.md
@@ -1,92 +1,211 @@
+
+
+
+
-# session-recall
+
+
-*Traducción de la comunidad (gracias, @webbrain-one). Puede ir por detrás del
-[README en inglés](README.md), que es la referencia; versión en ruso:
-[docs/README.ru.md](docs/README.ru.md).*
+
Memoria semántica compartida para Claude Code, Codex y Cursor.
+Encuentra una decisión antigua por su significado. Abre la evidencia en bruto. Continúa el trabajo.
-**Memoria compartida para Claude Code, Codex y Cursor.** Retoma el trabajo de hace un mes sin tener que reexplicarlo: Claude puede leer lo que Codex o Cursor resolvieron ayer, porque los tres alimentan un mismo índice. No es un archivo de resumen que alguien mantiene a mano: son los turnos reales, incluidas las llamadas a herramientas y el razonamiento, buscables por significado.
+
+
-```console
-$ session-recall index
-indexed 2175 chunks from changed transcripts
+[](LICENSE)
+[](pyproject.toml)
+[](src/session_recall/server.py)
+[](https://github.com/AbsoluteMode/session-recall/actions/workflows/test.yml)
-your history: 1053 sessions spanning 168 days, 40,037 searchable fragments
- Claude Code 372 · Codex 680 · Cursor 1
- busiest: sidekey, trend_detection, glitch
-```
+
-Entonces, tu agente dejará de preguntarte qué estabas haciendo:
+[English](README.md) · [Русский](docs/README.ru.md) · Español · [中文](README.zh-CN.md)
-> **tú:** estábamos arreglando el conflicto del token de autenticación entre los dos servicios, ¿en qué quedamos?
->
-> **agente:** *(recall_search → expand_around)* Ambos servicios compartían una cuenta OAuth, y el proveedor rota los tokens de refresco por cuenta, por lo que cada refresco invalidaba la copia del otro. Rechazaste el parche de directorio de credenciales compartidas por estar demasiado acoplado, y te decidiste por un servicio gestor propietario de la sesión. Las especificaciones nunca se escribieron: ese era el siguiente paso.
+*La versión en inglés es la de referencia; las traducciones pueden quedar rezagadas.*
-Cinco herramientas a través de MCP:
+
-- `recall_search(query)` — encuentra una discusión pasada **por significado** (no por subcadena). Responde `{"anchors": [...], "degraded": null | str}`; `degraded` se establece cuando el proveedor de incrustaciones es inalcanzable y solo se ejecutó la coincidencia literal, para que el agente pueda indicarlo en lugar de confundir un fallo léxico con un historial vacío.
-- `expand_around(session_id, uuid)` — un cursor en el turno raw (llamadas a herramientas, salidas, pensamiento).
-- `step(session_id, uuid, direction)` — muévete a un turno adyacente (paso de cursor económico).
-- `grep(pattern)` — exploración bajo demanda de subcadenas en **todos** los transcripciones indexadas, incluidos los turnos internos (salida de herramientas, pensamiento) que nunca se convirtieron en fragmentos de búsqueda.
-- `recent_sessions()` — las sesiones pasadas más recientes primero (qué está activo, qué tan fresco es el índice).
+---
-Bajo demanda (sin autoinyección proactiva en v1). Local y de código abierto.
+Tus agentes de código recuerdan el chat actual. Tu trabajo vive repartido en meses de chats:
+sesiones retomadas, suscripciones en paralelo, worktrees, agentes distintos.
-`recall_search`, `grep` y `recent_sessions` también aceptan un opcional `scope_cwd`: pasa tu directorio de trabajo actual para limitar los resultados al repo actual (los worktrees colapsan a la raíz del repo); omítelo para recordatorios entre proyectos. Los resultados clasificados incluyen una marca de tiempo legible por humanos `when_human` junto con la época raw. Cada herramienta MCP acepta un `source` opcional (`claude`, `codex` o `cursor`); omítelo para usar el historial unificado. Los resultados incluyen la procedencia correspondiente. Las tres herramientas de descubrimiento también aceptan `on_date` para un solo día o `start_date` / `end_date` inclusivos (`YYYY-MM-DD`) más un `timezone` IANA opcional, para que un agente pueda restringir la recuperación a un día calendario local real en lugar de esperar que una fecha escrita en la consulta semántica afecte la clasificación. Si se omite `timezone`, Session Recall usa la zona horaria de la computadora que ejecuta el servidor MCP.
+Session Recall convierte ese historial en un único índice local-first y lo sirve de vuelta a
+través de cinco herramientas MCP bien acotadas. Una sesión recién abierta puede recuperar lo
+que Codex resolvió ayer y lo que Claude Code rechazó hace tres meses — con enlaces a los
+turnos reales, la salida de las herramientas y el razonamiento. No es un archivo de resumen
+que alguien mantiene a mano: la conversación original sigue siendo la fuente de verdad.
-**Estado:** v1, construido y validado con historial real. La clave del razonamiento de diseño está en [docs/decisions/](docs/decisions/).
+> **tú:** estábamos arreglando el conflicto del token de autenticación entre los dos
+> servicios — ¿en qué quedamos?
+>
+> **agente:** *(recall_search → expand_around)* Los dos servicios compartían una misma cuenta
+> OAuth, y el proveedor rota los tokens de refresco por cuenta, así que cada refresco
+> invalidaba la copia del otro. Rechazaste el parche del directorio de credenciales
+> compartidas por demasiado acoplado, y optaste por un servicio keeper como dueño de la
+> sesión. La especificación nunca llegó a escribirse — ese era el siguiente paso.
+
+## Qué obtienes
+
+| | Capacidad | Qué cambia |
+|---|---|---|
+| **Una sola memoria** | Claude Code, Codex y Cursor alimentan el mismo índice | Cambia de agente sin reiniciar la historia del proyecto |
+| **Recuperación semántica** | Busca por significado, no solo por palabras exactas | Recupera decisiones que puedes describir pero no citar |
+| **Navegación profunda** | Abre los turnos en bruto: llamadas a herramientas, salidas, razonamiento | Verifica la respuesta en lugar de fiarte de un resumen |
+| **Degradación honesta** | Una caída de la parte semántica se comunica explícitamente | Un respaldo solo literal nunca se hace pasar por búsqueda semántica |
+| **Local por defecto** | Incrustaciones ONNX incluidas y SQLite local | Empieza sin clave, sin servidor y sin cuenta |
+| **Recall acotado** | Filtra por repo, origen o fechas del calendario local | Deja los proyectos ajenos fuera de la respuesta |
+| **Respuestas de equipo** | Pregunta a la memoria local de un colega, con aprobación del dueño | Comparte contexto duramente ganado sin exponer sesiones en bruto |
+
+## Dónde compensa
+
+- **Arranque de sesión.** Una sesión nueva empieza ya en contexto — tanto si haces malabares
+ con varias suscripciones, como si saltas entre agentes o vuelves a una tarea que
+ «comentaste en algún momento».
+- **Bugs y regresiones.** Antes de arreglar nada, el agente pregunta al historial: *¿se había
+ visto ya este bug? ¿cómo se arregló? ¿por qué creímos que estaba arreglado?* Una recaída
+ deja de parecer un bug nuevo — y la corrección pasa de ser un parche a ser una excavación
+ en el componente.
+- **Procedimientos.** Explica un flujo de trabajo una sola vez — cómo leer una traza, cómo
+ desglosar el gasto de tokens por tarea — y cualquier sesión posterior lo repite sin que
+ haya que guiarla de nuevo.
+- **Causa y efecto.** Di «cambiemos esta decisión» y el agente busca el momento en que se
+ tomó: *«elegimos X por compatibilidad con Y — antes de cambiar nada, asegúrate de que Y
+ sobrevive»*.
+
+## Cinco herramientas, un solo flujo de trabajo
+
+La interfaz se mantiene deliberadamente pequeña:
+
+| Herramienta MCP | Úsala cuando |
+|---|---|
+| `recall_search(query)` | Recuerdas la idea, no las palabras exactas |
+| `expand_around(session_id, uuid)` | Encontraste un ancla y necesitas la evidencia que la rodea |
+| `step(session_id, uuid, direction)` | Necesitas el turno en bruto adyacente sin otra búsqueda |
+| `grep(pattern)` | Conoces un error, un símbolo, una ruta o un identificador exactos |
+| `recent_sessions()` | Quieres el trabajo más fresco — y la frescura del índice |
+
+```mermaid
+flowchart LR
+ Q["describe the old problem"] --> S["recall_search"]
+ S --> A["ranked anchor"]
+ A --> E["expand_around"]
+ E --> T["step next / prev"]
+ Q -. exact identifier .-> G["grep"]
+ R["what is current?"] --> RS["recent_sessions"]
+```
-## Cómo funciona
+Cada herramienta de descubrimiento acepta un `source` opcional (`claude` | `codex` | `cursor`),
+un `scope_cwd` para acotar los resultados al repo actual (los worktrees colapsan a la raíz
+del repo) y fechas del calendario local (`on_date`, o `start_date` / `end_date`, más un
+`timezone` IANA). Las anclas clasificadas llevan su procedencia y una marca de tiempo
+legible. `grep` escanea bajo demanda **todas** las transcripciones indexadas — incluidos los
+turnos internos (salida de herramientas, razonamiento) que nunca se convirtieron en
+fragmentos de búsqueda. Solo bajo demanda: sin inyección proactiva de contexto en cada prompt.
-Las transcripciones de Claude Code, las sesiones de Codex desde `~/.codex/sessions` y `~/.codex/archived_sessions`, y las conversaciones de Cursor comparten el mismo índice. Cursor se lee desde su SQLite local y cada conversación se conserva como una instantánea JSONL normalizada dentro del directorio de datos de session-recall; por eso `expand_around`, `step` y `grep` siguen funcionando aunque Cursor esté cerrado o se desinstale.
-Solo se incrusta la "superficie" de la conversación: los prompts del usuario y las respuestas de texto del asistente.
-Las llamadas a herramientas, resultados, razonamiento y otros datos de traza no se incrustan, pero permanecen accesibles bajo demanda mediante `expand_around` (y `step`) o `grep`. Las transcripciones originales de Claude/Codex y las instantáneas raw normalizadas de Cursor permanecen locales; solo la superficie de conversación extraída se envía al proveedor de incrustaciones configurado.
+