Un sistema de notas gobernado por contratos: Neovim, Obsidian y Agentes Locales

Autora: Andrea Villar

1. La fragilidad del PKM ante la automatización

La mayoría de los sistemas de gestión del conocimiento personal (Personal Knowledge Management o PKM) funcionan bien mientras la interacción depende exclusivamente del usuario. Sin embargo, al incorporar automatizaciones o agentes de inteligencia artificial para organizar información, el repositorio suele degradarse rápidamente:

Para solucionar este desacoplamiento sin renunciar a la agilidad de edición en terminal (Neovim) ni a las capacidades de navegación gráfica (Obsidian), la arquitectura de mi bóveda se construyó sobre un principio de contrato de interfaz explícito. Cualquier actor —sea un script, un plugin de editor o un modelo de lenguaje— debe respetar invariantes estructurales inmutables.

El ecosistema se divide en cuatro piezas independientes:

┌────────────────────────────────────────────────────────┐
│                   Bóveda Markdown                      │
│            Contrato del Vault (AGENTS.md)              │
│               <templates-path-notes>                   │
└───────────▲──────────────────────────────▲─────────────┘
            │                              │
┌───────────┴───────────┐      ┌───────────┴─────────────┐
│  Edición e Interfaz   │      │    Agentes y Contexto   │
│  Neovim / Obsidian    │      │  MCP RAG / Agent Skill  │
│ <nvim-plugin-notes>   │      │    <mcp-rag-notes>      │
│                       │      │    <skills-notes>       │
└───────────────────────┘      └─────────────────────────┘

2. El contrato del Vault: templates-path-notes

El núcleo del sistema es la plantilla base de la bóveda, materializada en <templates-path-notes>. Su función principal es definir la taxonomía y las reglas invariantes antes de que se cree la primera nota.

En la raíz del repositorio reside AGENTS.md, un documento normativo diseñado específicamente para que los agentes autónomos conozcan los límites operativos:

DirectorioPropósitoRegla de nomenclatura
journal/Bitácoras y notas diariasYYYY-MM-DD.md
finanzas/Balances mensuales, facturas e impuestosfinanzas/YYYY/cuentas/YYYY-MM.md
todo/Tareas detalladas con fechatodo/YYYY-MM-DD/<ID>.md
zettelkasten/Notas atómicas de conocimiento<TIMESTAMP>-<SLUG>.md
projects/Documentación técnica de proyectosprojects/<nombre>/
templates/Plantillas oficialesplantilla-*.md
assets/Adjuntos binarios, PDFs e imágenesassets/

Invariantes estructurales

  1. Raíz limpia: Ningún archivo Markdown puede residir en la raíz del vault; todo recurso pertenece estrictamente a una subcarpeta del sistema.
  2. Normalización temporal: Las notas diarias residen únicamente en journal/. No se admiten nombres alternativos.
  3. Esquema YAML estricto: Toda nota generada debe incluir metadatos mínimos obligatorios:
    ---
    id: <ID-UNICO>
    description: "Resumen conciso del contenido"
    aliases:
      - "Nombre Principal"
    tags:
      - categoria
    ---
  4. Alineación con Obsidian: La configuración interna en .obsidian/ replica exactamente las mismas rutas (attachmentFolderPath: "assets", newFileFolderPath: "zettelkasten", y configuración de Daily Notes hacia journal/).

3. Resolución semántica de entidades: skills-notes

Cuando interactúas con un agente conversacional, las peticiones rara vez contienen rutas completas del sistema de archivos. Expresiones como “añade esta tarea a la nota de hoy” o “revisa las cuentas del mes pasado” requieren una capa de traducción determinista.

El proyecto <skills-notes> implementa este puente como una skill estructurada para agentes locales, disponible tanto en español como en inglés. Su responsabilidad es doble:

  1. Resolución temporal y taxonómica: Mediante utilidades como resolve_note.py, traduce expresiones relativas de lenguaje natural a rutas absolutas normalizadas:
    • “nota diaria” / “hoy” $\rightarrow$ journal/YYYY-MM-DD.md
    • “ayer” / “anteayer” $\rightarrow$ cálculo de desfase y resolución a journal/
    • “cuentas del mes” $\rightarrow$ finanzas/YYYY/cuentas/YYYY-MM.md
    • “idea” / “zettelkasten” $\rightarrow$ generación de timestamp unix con slug descriptivo
  2. Preservación de plantillas: Si el archivo destino no existe, el agente utiliza obligatoriamente la plantilla oficial correspondiente (templates/plantilla-diaria.md, templates/plantilla-cuentas-mes.md), evitando la invención de formatos sobre la marcha.

4. Búsqueda híbrida local sin dependencias pesadas: mcp-rag-notes

Para que un modelo de lenguaje consulte o sintetice información de la bóveda de forma eficiente, no basta con leer archivos individuales ni resulta viable cargar el repositorio completo en la ventana de contexto.

<mcp-rag-notes> implementa un servidor conforme a la especificación Model Context Protocol (MCP) sobre stdio. Sus decisiones técnicas clave fueron:


5. El entorno de edición humana: nvim-plugin-notes

La interacción personal con la bóveda ocurre principalmente desde la terminal mediante Neovim, con soporte secundario en Obsidian para revisión visual o lectura prolongada.

<nvim-plugin-notes> proporciona la capa de configuración en Lua que adapta el editor a las mismas reglas pactadas con los agentes:


6. Conclusión: La necesidad de contratos en la era de los agentes

La utilidad a largo plazo de una base de conocimiento no depende de la sofisticación del modelo de IA que la asista, sino de la coherencia interna de los datos.

Al formalizar un contrato claro en templates-path-notes, dotar a los modelos de herramientas de resolución deterministas con skills-notes, proveer recuperación híbrida privada con mcp-rag-notes y alinear el editor con nvim-plugin-notes, el sistema permite:

Volver al blog