Communitygithub.com

vima-tech/Innate

Capa de conocimiento procedimental auto-creciente para agentes de IA. Servidor MCP en Rust + CLI: recupera conocimiento relevante antes de tareas, registra resultados después y destila la experiencia en ideas reutilizables. Funciona con Claude Code, Codex, opencode.

¿Qué es Innate?

Innate es una capa de conocimiento procedimental que se auto-expande, diseñada para mejorar el rendimiento de agentes de IA como Claude Code, Codex y opencode. Actúa como un servidor MCP en Rust y CLI que permite a los agentes recordar conocimiento relevante antes de comenzar una tarea, registrar resultados después y destilar experiencias en ideas reutilizables. La operación es auxiliar y de mejor esfuerzo, sin bloquear la tarea principal. Los agentes deben usar consultas con intención canónica para recuperar fragmentos de conocimiento, inyectarlos en su contexto de trabajo y, al finalizar la tarea, proporcionar un veredicto por fragmento indicando si fue útil, engañoso o no se usó. La retroalimentación explícita (feedback_up / feedback_down) es esencial para mejorar la calidad del conocimiento: los fragmentos con múltiples valoraciones negativas se revisan o archivan, mientras que los útiles ascienden a activos. También permite guardar ideas rápidas (sparks) o principios confirmados (add), y al final de la sesión se puede ejecutar innate_evolve para destilar registros y curar la base de conocimiento.

Compatible con✓Claude Code✓Codex CLI~Cursor✓OpenCode
npx skills add vima-tech/Innate

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

Rol de la Capa

Innate es auxiliar — nunca debe bloquear la tarea principal. Todas las operaciones de innate son de mejor esfuerzo. Ante cualquier error de herramienta: reintentar una vez con una llamada corregida, luego abandonar y continuar.

Cuándo Recordar

Recordar al inicio de una tarea solo si la tarea es:

  • De un dominio con patrones recurrentes conocidos (p. ej., un código base, framework o protocolo específico)
  • Sobre depuración o corrección de algo que pueda haberse encontrado antes
  • Arquitectónica/de diseño — las decisiones previas importan

Omitir recordar para: tareas rápidas de una línea, preguntas con respuestas claras, tareas que el usuario haya delimitado como territorio completamente nuevo sin contexto previo.

Formulación de Consultas

Utiliza intención canónica, no las palabras literales del usuario. Mantén las consultas consistentes entre sesiones — la misma clase de problema siempre debe usar la misma forma canónica, porque Innate acumula estadísticas de contexto por patrón de consulta.

El usuario diceBuena consultaMala consulta
"¿por qué falla esto al iniciar?"fallo inicio sqlite init"¿por qué falla esto al iniciar"
"refactoriza el flujo de autenticación"flujo auth manejo token sesiónrefactorizar flujo auth
"añade limitación de tasa a la API"patrón middleware limitación tasaañadir limitación tasa
"depura la prueba inestable"prueba inestable condición carrera sincronizacióndepurar prueba inestable

Llamar: innate_recall(query=<intención_canónica>, budget=4000, source="mcp")

Inyecta los fragmentos recuperados en tu contexto de trabajo. Menciona al usuario cuál (si hay) conocimiento previo relevante fue encontrado — una frase es suficiente.

Gancho de Recuperación Automática

Cuando Innate está instalado con ganchos, un gancho UserPromptSubmit puede inyectar automáticamente un bloque <innate-recall> en la conversación — ya ejecutó una recuperación filtrada por relevancia para el prompt y lleva un trace_id. Cuando veas ese bloque:

  • Reutiliza su trace_id para el innate_record de cierre — no llames innate_recall de nuevo para la misma tarea (eso crearía un rastro duplicado y colgante).
  • Trata sus fragmentos exactamente como si los hubieras recuperado tú mismo: aplica lo que ayude, luego cierra con un veredicto por fragmento (ver más abajo).
  • Si el bloque está ausente y la tarea lo justifica, recupera manualmente como se indicó.

El gancho está filtrado por relevancia, por lo que su silencio significa "nada obtuvo una puntuación suficientemente alta" — no "no existe conocimiento". Recupera manualmente si sospechas que hay conocimiento relevante que la puerta pudo haber pasado por alto.

Cuándo Registrar

Registrar después de una tarea que produjo un resultado real (éxito o fracaso). Omitir registro para:

  • Intercambios exploratorios sin resultado definitivo
  • Tareas donde el usuario interrumpió antes de completar
  • Recuperación pura (el usuario solo hizo una pregunta, no se construyó ni cambió nada)

Reglas de Resultado

Situaciónresultado
Tarea completada, usuario confirmó o aceptó el resultadook
Tarea fallida, el enfoque fue incorrecto, el usuario tuvo que corregir el rumbofail
Sesión interrumpida, resultado poco clarounknown

Veredicto por Fragmento — Obligatorio

Este es el contrato más importante en Innate: la clasificación de confianza solo es tan buena como la precisión de lo que informes aquí. Cada recuperación que generó fragmentos (manual o inyectada por gancho) debe cerrarse con un veredicto por fragmento. Para cada fragmento que se puso frente a ti, cae exactamente en uno de tres cubos:

VeredictoQué significaDónde va
Usado + ayudóLo aplicaste y ahorró tiempo / evitó un errorused=[id] y feedback_up=[id]
Usado + engañóLo aplicaste pero era incorrecto o te llevó por mal caminoused=[id] y feedback_down=[id]
No usadoRecuperado pero nunca lo aplicasteomitir por completo (no lo incluyas en used)

Reglas que mantienen la señal limpia:

  • used lista solo fragmentos que referenciaste activamente en tu razonamiento o salida — típicamente de uno a tres. Nunca lo rellenes con fragmentos meramente recuperados.
  • Si no aplicaste nada, esa es una señal real y valiosa: establece used=[] explícitamente (conocido-ninguno). No omitas el registro — el silencio no es lo mismo que "nada ayudó".
  • Un fragmento que usaste casi siempre debe llevar también una señal positiva o negativa. Un fragmento usado sin veredicto desperdicia la entrada de clasificación más fuerte que puedes dar.
  • Sé honesto con feedback_down. Un fragmento incorrecto que marcas como negativo se revisa y archiva; un fragmento incorrecto que dejas sin marcar sigue engañando a futuras sesiones.

Resumen de Salida — Formato Estructurado

Escribe una oración autocontenida que un agente futuro pueda usar sin contexto. Usa esta estructura:

<lo que se hizo o aprendió> — <restricción o método clave> — <cuándo aplica esto>

Ejemplos buenos:

  • Corregida la detección del modo WAL de SQLite verificando la respuesta de PRAGMA journal_mode en lugar de asumir WAL — se activa en cualquier conexión nueva a la base de datos en configuraciones multiproceso
  • Resuelta prueba de autenticación inestable inyectando un mock de reloj — el tiempo real del sistema causa condiciones de carrera en la verificación de caducidad del token
  • La limitación de tasa debe aplicarse antes del middleware de autenticación, no después — de lo contrario, las solicitudes no autenticadas evitan el limitador

Ejemplos malos (demasiado vagos para reutilizar):

  • Corregí el error
  • Ayudé al usuario con la autenticación
  • El problema era la sincronización

El output_summary se convierte en el fragmento de conocimiento reutilizable. Si se lee como una historia, reescríbelo como un principio. Prefiere la forma general y transferible — elimina nombres de repositorios/archivos/funciones e identificadores únicos, y reformula la lección para que ayude también en el próximo proyecto; conserva detalles específicos del proyecto solo cuando la lección no se pueda generalizar sin perder su significado. Si no puedes escribir un resumen útil, establece output="unknown" y omite el registro.

Llamar: innate_record(trace_id=<id>, outcome=<ok|fail|unknown>, used=[<id_fragmentos>], output_summary=<oración>)

Retroalimentación Explícita — Por Qué Importa

Las listas feedback_up / feedback_down de la tabla de veredictos son la señal más rápida para la calidad del conocimiento, y dirigen directamente la clasificación y el ciclo de vida: dos señales negativas en el mismo fragmento desencadenan una revisión de gobernanza; cinco desencadenan archivo automático. Por el contrario, used + feedback_up repetido es lo que promueve un fragmento pending a active. Omitir la retroalimentación congela la base de conocimiento; darla es cómo el buen conocimiento sube y el mal conocimiento cae.

Nominación — Rara, Explícita

Usa el campo nomination solo para lecciones genuinamente generalizables — patrones que ahorrarán tiempo significativo la próxima vez que aparezca este tipo de problema. Raro. No para cada tarea.

Formato para nominación (principio autocontenido):

<principio> — <cuándo aplica> — <qué evitar>

Ejemplo:

innate_record(..., nomination="El índice ÚNICO de SQLite en una cláusula WHERE parcial requiere una coincidencia exacta de WHERE en ON CONFLICT — aplica a todos los patrones upsert; ON CONFLICT sin WHERE omitirá silenciosamente el upsert")

Referencia de Herramientas MCP

HerramientaUsoNotas
innate_recallInicio de tarea (cuando sea relevante)Usa forma de consulta canónica — la redacción consistente acumula estadísticas de contexto
innate_recordFin de tarea (cuando exista un resultado real)output_summary estructurado + IDs de usado precisos
innate_addCapturar conocimiento confirmadoSiempre source="mcp"; va a pendiente, espera revisión
innate_sparkIdea rápida para despuésForma breve destilada; sin necesidad de revisión
innate_evolveFin de sesióntrigger="manual"; destila registros + cura la base de conocimiento
innate_inspectVerificación de saludconteos de fragmentos, ratio de deuda, cola de reconstrucción
innate_appraiseVerificación rápida antes de un paso arriesgadoSeñal de referencia solamente — intuición, NO una respuesta precisa. Pésalo como una entrada; nunca permitas que anule tu propio análisis. abstained=true significa sin base — eso es correcto, no un fallo

Nunca llamar sin solicitud explícita del usuario: innate_approve, innate_archive, innate_invalidate, innate_restore, innate_mature_spark, innate_promote_spark, innate_drop_spark.

Decisión de Escritura

Antes de finalizar una sesión larga, ejecuta esta lista de verificación silenciosamente:

  1. ¿Se encontró una solución no obvia? (solución alternativa, restricción oculta, patrón de error sutil)
  2. ¿Se identificó una habilidad, método o técnica general y transferible? (prefiere estas — abstrae las lecciones específicas del proyecto a una forma reutilizable; mantén una regla específica del proyecto solo cuando genuinamente no se pueda generalizar)
  3. ¿Corrigió el usuario una suposición incorrecta mía que probablemente repetiría?
  4. ¿Se alcanzó una idea difícilmente ganada después de múltiples intentos fallidos?
  5. ¿Ayudó activamente un fragmento recuperado? (registrar feedback_up)
  6. ¿Engañó un fragmento recuperado? (registrar feedback_down)

Si cualquiera de 1-4 → proponer al usuario:

"Esta sesión descubrió [descripción de una línea]. ¿Quieres que lo guarde en Innate?"

Solo llama a innate_spark o innate_add después de la confirmación del usuario. Nunca escribas silenciosamente.

Regla Anti-Verbatim

El texto de conversación en bruto nunca debe almacenarse. Siempre destilar a la forma de principio reutilizable:

<principio> — <contexto desencadenante> — <qué evitar>

❌ Verbatim✅ Destilado
"El usuario me dijo que usara el modo WAL y lo arreglé cambiando la pragma""El modo WAL de SQLite debe verificarse mediante la respuesta de PRAGMA, no asumirse — se activa en cualquier apertura de base de datos en configuraciones multiproceso con mucha escritura"
"Pasamos 2 horas depurando autenticación debido a desviación del reloj""La validación de JWT debe tener en cuenta la tolerancia a la desviación del reloj (≥30s) — se activa en autenticación distribuida entre servicios con relojes de sistema independientes"

Preferir General sobre Específico del Proyecto

Innate está sesgado hacia habilidades, métodos y técnicas generales y transferibles — conocimiento que da frutos en todos los proyectos, no solo en el código base actual. Cuando una lección es específica del proyecto:

  1. Intenta abstraerla — elimina nombres de repositorios/archivos/funciones e identificadores únicos, y reformúlala como un principio que el próximo proyecto pueda reutilizar.
  2. Guarda la forma abstraída. Conserva detalles concretos específicos del proyecto solo cuando la lección genuinamente no se pueda generalizar sin perder su significado.
❌ Vinculado al proyecto✅ Generalizado
"En este repositorio, record() debe ejecutarse dentro de BEGIN IMMEDIATE""Las mutaciones de estado de múltiples pasos que deben ser atómicas pertenecen a una transacción exclusiva, no a confirmaciones por paso — aplica a cualquier escritor SQLite con procesos concurrentes"
"Establece recall.budget=4000 en la tabla meta""Expone el presupuesto de recuperación como un parámetro ajustable en lugar de codificarlo — permite que la recuperación escale con la ventana de contexto sin cambios de código"

Chispas vs. Notas

Usar innate_sparkUsar innate_add
Idea rápida, intuición a medio formarPrincipio reutilizable confirmado
Aún no validadoValidado en esta sesión
El usuario dice "anota esto para después"El usuario dice "recuerda esta regla"

Fallback CLI (si MCP no está configurado)

# Recuperar
innate recall "<intención_canónica>" --top 5 --format json --source cli

# Registrar con resumen estructurado
innate record <trace_id> --outcome ok \
  --used <id1>,<id2> \
  --output-summary "Corregí X haciendo Y — aplica cuando Z" \
  --feedback up  # o down

# Capturar conocimiento
innate add "<principio> — <desencadenante> — <qué evitar>" \
  --trigger "<contexto de 2-5 palabras>" \
  --source agent

# Chispa rápida
innate spark "<idea destilada en 1-2 oraciones>"

# Fin de sesión
innate evolve --trigger manual
innate inspect

Comandos

Los comandos de barra inclinada a continuación se instalan automáticamente en ~/.claude/commands/ mediante innate install y se actualizan en cada re-ejecución de innate install. Cada bloque command define un comando: metadatos antes de ---, cuerpo (el prompt del agente) después de ---.

name: innate-recall
description: Recuperar conocimiento previo de Innate para el contexto de la tarea actual
---
Ejecuta innate_recall para el contexto de la tarea actual e inyecta el resultado en esta conversación.

Si el usuario proporcionó una consulta después del comando, usa esa como la consulta de recuperación exactamente.
Si no se proporcionó consulta ($ARGUMENTS está vacío), infiere la consulta del mensaje de usuario más reciente
o de la intención de la tarea actual — usa la **intención canónica** (p. ej., `sqlite wal mode init`,
no `por qué falla esto`). Mantén la forma de la consulta consistente con cómo formularías la misma
clase de problema en el futuro.

Pasos:
1. Formula la cadena de consulta canónica (de $ARGUMENTS o intención inferida).
2. Llama a `innate_recall` con `query=<consulta>`, `budget=4000`, `source="mcp"`.
3. Si se devuelve conocimiento: resume en una oración lo que se encontró, luego inyecta los
   fragmentos relevantes en el contexto.
4. Si está vacío: di "No se encontró conocimiento previo para: <consulta>" — no inventes.
5. Guarda el `trace_id` para usarlo en `/innate-record` más tarde.
name: innate-record
description: Cerrar el rastro Innate actual con un resultado y resumen estructurado
---
Cerrar el rastro Innate actual con un resultado y resumen.

Analiza $ARGUMENTS en busca de:
- outcome: uno de `ok`, `fail`, `unknown` (por defecto: `ok` si no se especifica)
- Cualquier texto restante se convierte en la anulación del output_summary

Pasos:
1. Identifica el trace_id activo de la llamada más reciente a `innate_recall` en esta sesión.
   Si no hay trace_id disponible, di "No hay rastro activo — ejecuta /innate-recall primero."
2. Determina qué IDs de fragmentos recuperados fueron **realmente usados** en la respuesta final (no
   solo candidatos recuperados). Sé preciso — los fragmentos recuperados no usados NO deben listarse.
3. Escribe un output_summary estructurado para un agente futuro que lea sin contexto:
   Formato: `<lo que se hizo> — <restricción/método clave> — <cuándo aplica esto>`
   Si el usuario proporcionó texto de resumen en $ARGUMENTS, usa eso.
4. Evalúa la retroalimentación:
   - Si algún fragmento fue directamente útil → incluye `feedback_up=[id_fragmento]`
   - Si algún fragmento fue incorrecto/engañoso → incluye `feedback_down=[id_fragmento]`
5. Llama a `innate_record` con `trace_id`, `outcome`, `used=[<id_fragmentos>]`,
   `output_summary` y retroalimentación si aplica.
6. Confirma: "Registrado el rastro <trace_id> como <outcome>."
name: innate-save
description: Guardar un conocimiento confirmado en Innate como un fragmento pendiente
---
Guardar un conocimiento confirmado en Innate como un fragmento pendiente.

$ARGUMENTS es el texto del conocimiento a guardar (obligatorio). Si está vacío, pregunta: "¿Qué conocimiento
quieres guardar?"

Pasos:
1. Analiza $ARGUMENTS como el contenido del conocimiento.
2. Destila a la forma de principio: `<principio> — <contexto desencadenante> — <qué evitar>`
3. Llama a `innate_add` con el principio destilado.
4. Confirma: "Guardado en Innate como fragmento pendiente."
name: innate-spark
description: Guardar una chispa rápida (idea no confirmada) en Innate
---
Guardar una chispa rápida (idea no confirmada) en Innate.

$ARGUMENTS es el texto de la idea (obligatorio). Si está vacío, pregunta: "¿Qué idea
quieres guardar?"

Pasos:
1. Analiza $ARGUMENTS como el texto de la chispa.
2. Destila a 1-2 oraciones si es necesario.
3. Llama a `innate_spark` con el texto destilado.
4. Confirma: "Chispa guardada en Innate."
name: innate-evolve
description: Ejecutar evolución de Innate al final de la sesión
---
Ejecutar evolución de Innate al final de la sesión.

Sin argumentos. Pasos:
1. Llama a `innate_evolve` con `trigger="manual"`.
2. Reporta el resultado.
name: innate-inspect
description: Verificar el estado actual de la base de conocimiento de Innate
---
Verificar el estado actual de la base de conocimiento de Innate.

Sin argumentos. Pasos:
1. Llama a `innate_inspect`.
2. Presenta la información al usuario en un formato legible.

Skills relacionados