Por qué tu kilo.jsonc no es la lista completa
El modelo de reglas actual de Kilo es explícito y, por sí solo, se comporta bien. Las reglas del proyecto se "configuran a través de la clave instructions en el archivo kilo.jsonc de tu proyecto", donde "cada entrada apunta a una ruta de archivo o patrón glob". Las reglas globales usan la misma clave en la configuración global, "normalmente en ~/.config/kilo/kilo.jsonc".
El orden de carga sigue al array: "Las reglas se cargan en el orden en que aparecen en el array instructions en kilo.jsonc", primero la configuración global, luego la del proyecto. La precedencia se resuelve al revés: "las instrucciones a nivel de proyecto tienen precedencia sobre las instrucciones globales para directivas en conflicto". Incluso puedes pausar una regla sin eliminarla, ya que "JSONC admite comentarios //".
Eso es un manifiesto, y un manifiesto es un buen diseño. Todo lo que se muestra a continuación es lo que queda fuera de él.
Las entradas glob renuncian al orden. La documentación es directa: "Los archivos que coinciden con patrones glob se cargan en orden del sistema de archivos". Dado que la posición del array es tu único control de precedencia, una sola entrada como .kilo/rules/*.md convierte tu lista ordenada en una desordenada para todo lo que coincida. La configuración de ejemplo en la documentación empareja un archivo específico con un glob que cubre el mismo directorio, lo que parece conveniente y elimina silenciosamente tu capacidad de decidir qué regla gana.
El directorio heredado se carga sin estar listado. Esto es lo que le cuesta días a la gente:
"Si existen directorios.kilocode/rules/en tu proyecto, sus contenidos se incluyen automáticamente por compatibilidad con versiones anteriores. Para migrar por completo, mueve tus archivos de reglas y haz referencia a ellos enkilo.jsonc."
Lee eso como un comportamiento activo, no como una simple nota. Kilo cambió el nombre de su directorio de .kilocode/ a .kilo/, y el antiguo todavía se carga, automáticamente, sin ninguna entrada en tu array y sin posición en la tabla de prioridades. Un repositorio que pasó por una versión anterior tiene un segundo árbol de reglas ejecutándose en paralelo, y el kilo.jsonc que estás leyendo no lo menciona.
Los archivos AGENTS.md por directorio se inyectan al acceder a los archivos. Kilo admite AGENTS.md en subdirectorios y describe el mecanismo con precisión: "Los archivos AGENTS.md por directorio se cargan dinámicamente cuando el agente lee archivos en ese directorio; no se precargan al inicio de la sesión. Cuando el agente lee un archivo en src/backend/, se descubre el AGENTS.md correspondiente y su contenido se inyecta en la conversación como etiquetas <system-reminder>".
Esa es una buena característica. También significa que tu conjunto de instrucciones efectivo cambia a mitad de la conversación dependiendo de qué archivos haya abierto el agente, y la tabla de prioridades (que cubre solo el archivo raíz) no describe qué rango ocupan esas inyecciones.
El AGENTS.md raíz no se puede desactivar. "AGENTS.md en sí no se puede desactivar individualmente; siempre se carga si está presente. Para anular sus instrucciones, usa fuentes de mayor prioridad como la clave de configuración instructions o prompts específicos del agente". Tanto AGENTS.md como AGENT.md son también "archivos protegidos contra escritura en Kilo Code", por lo que "el agente de IA no puede modificar estos archivos sin la aprobación explícita del usuario". Bueno para la seguridad, y vale la pena saberlo antes de pedirle al agente que los organice.
El nombre del archivo distingue entre mayúsculas y minúsculas de una manera que sorprende a la gente. Kilo advierte: "El nombre del archivo debe estar en mayúsculas (AGENTS.md), no en minúsculas (agents.md)". Los nombres admitidos en orden de precedencia son AGENTS.md y luego AGENT.md. Otros agentes difieren aquí (algunos tratan ambos casos como equivalentes), por lo que un repositorio compartido debería estandarizarse en mayúsculas.
El antiguo banco de memoria sigue activo. El aviso de depreciación de Kilo dice que "la función de banco de memoria de Kilo Code ha sido descontinuada en favor de AGENTS.md", e inmediatamente agrega: "Las reglas existentes del banco de memoria seguirán funcionando". Los indicadores de estado son la parte a vigilar: "los indicadores de estado heredados del Memory Bank como [Memory Bank: Active] y [Memory Bank: Missing] aún pueden aparecer, pero no están garantizados en todos los clientes o modos". Esa advertencia es clave: la insignia está limitada a los clientes y modos donde es compatible, así que trátala como una pista en lugar de como la respuesta definitiva, y verifícalo mediante el comportamiento en su lugar.
Juntas, estas son cinco fuentes más allá de tu array. Esa es la causa real de la mayoría de los informes de "mi regla no se está aplicando", y es un problema de configuración más que un problema del modelo, la distinción que señalamos en por qué los agentes ignoran tus archivos de instrucciones.
Qué intenta la gente en su lugar
Leer kilo.jsonc y confiar en él. El enfoque más común, y es incorrecto por diseño. El array es uno de varios datos de entrada, y los dos silenciosos (el directorio heredado y las inyecciones por directorio) son exactamente los que un archivo de configuración no te puede mostrar.
Agregar un glob amplio para capturar todo. ".kilo/rules/**/*.md" garantiza que no se pierda nada y renuncia al orden para todo el conjunto, ya que las coincidencias de glob se cargan "en orden del sistema de archivos". Has cambiado una lista incompleta por una desordenada.
Eliminar .kilocode/ de inmediato. Destino correcto, primer paso arriesgado. Esos archivos han estado vigentes, posiblemente durante meses, y parte del comportamiento en el que confías puede provenir de ellos. Muévelos fuera de la ruta de carga y ponlos bajo revisión, luego decide.
Poner todo en AGENTS.md. Ocupa el tercer lugar, no se puede desactivar y es el formato que leen otras herramientas. Pero no admite frontmatter ni carga condicional, por lo que un solo archivo raíz se convierte en contexto siempre activo para cada tarea. La cuestión del presupuesto de contexto siempre activo es la misma que examinamos en qué leen realmente los agentes de programación.
Convertir reglas en habilidades. Las habilidades se cargan bajo demanda, lo que suena como condicionalidad gratuita, y Kilo es inusualmente sincero sobre cómo funciona la selección: "El agente (LLM) decide si usar una habilidad en función del campo description de la habilidad. No hay coincidencia de palabras clave ni búsqueda semántica: el agente evalúa tu solicitud frente a todas las descripciones de habilidades disponibles y determina si una 'se aplica de manera clara e inequívoca'". Una convención que siempre debe cumplirse no sobrevive a un juicio de relevancia, razón por la cual una habilidad no es un sustituto de una regla, y tampoco un sustituto de la memoria, como argumentamos en por qué las habilidades de los agentes no son memoria.
La solución: Construir una sola lista ordenada y luego demostrar que es la lista completa
Tres pasos. El tercero es el que la gente se salta, y es el único que detecta las fuentes silenciosas.
Paso 1: Inventariar cada ruta desde la que Kilo puede cargar
Recorre el repositorio y anota lo que existe en cada una de estas ubicaciones, antes de cambiar nada.
Comienza con el conjunto declarado: el array instructions en el kilo.jsonc del proyecto, y la misma clave en ~/.config/kilo/kilo.jsonc. Expande cada glob a mano en los nombres de archivo reales con los que coincide, en orden del sistema de archivos, para que puedas ver el orden que usará Kilo.
Luego, el conjunto no declarado. Busca .kilocode/rules/ en cualquier parte del proyecto (el aviso dice "directorios", en plural, así que busca también en los subdirectorios). Busca .kilo/rules/memory-bank/ y el heredado .kilocode/rules/memory-bank/. Encuentra cada AGENTS.md y AGENT.md en el árbol, no solo el de la raíz, y anota qué directorio gobierna cada uno. Si usas la CLI, verifica también .claude/ y .agents/, ya que se leen "por compatibilidad con otras herramientas"; los directorios de habilidades externas se pueden desactivar con la variable de entorno KILO_DISABLE_EXTERNAL_SKILLS si quieres dejarlos fuera de juego.
Ahora tienes una lista. Será más larga que tu kilo.jsonc, y la diferencia es aquello que no sabías que se estaba ejecutando.
Paso 2: Reducir la lista a un solo array declarado y ordenado
Decide un destino para cada elemento, luego haz que el array coincida con la realidad.
Las convenciones de todo el repositorio que siempre deben aplicarse van en el AGENTS.md raíz: no se puede desactivar, otras herramientas lo leen y está protegido contra escritura para evitar ediciones accidentales del agente. Mantenlo corto; está siempre activo.
Las reglas que necesitan un orden explícito van en .kilo/rules/ como archivos individuales, cada uno listado por su ruta completa en el array instructions del proyecto. Lístalos uno por línea en el orden que desees. No uses un glob aquí; un glob es precisamente lo que descarta tu orden.
La guía específica del directorio va en los archivos AGENTS.md por directorio, que es el único mecanismo que documenta Kilo para el contenido que se carga según el lugar donde esté trabajando el agente.
Las preferencias personales van en el array global de kilo.jsonc, recordando que lo global se sitúa en la prioridad 4, por debajo tanto del array del proyecto como del AGENTS.md raíz.
Luego vacía la ruta heredada. Mueve el contenido de .kilocode/rules/ a algún lugar fuera de la ruta de carga (un subdirectorio docs/ funciona) y vuelve a agregar solo lo que realmente deseas, mediante una ruta explícita en el array. Lo mismo para el banco de memoria: la propia instrucción de migración de Kilo es "examinar el contenido en .kilo/rules/memory-bank/ (o el heredado .kilocode/rules/memory-bank/)" y "mover ese contenido al archivo AGENTS.md de tu proyecto". Mueve las partes que sigan siendo verdaderas; elimina las partes que describan una versión anterior de la base de código.
Paso 3: Demostrar la lista por contradicción, no por lectura
Un archivo de configuración no puede verificarse a sí mismo frente a archivos que no menciona. Así que prueba el límite directamente.
Coloca una instrucción deliberadamente inusual e inofensiva al final de tu fuente de menor prioridad prevista, algo como una convención inconfundible de nomenclatura de variables que nunca usarías de otra manera. Pídele al agente que escriba una función pequeña. Si aparece la convención, la fuente se está cargando y nada por encima de ella la contradice.
Luego invierte la prueba. Coloca una instrucción directamente contradictoria en una fuente que creas que no se está cargando: la ruta heredada .kilocode/rules/, antes de vaciarla. Pregunta de nuevo. Si la versión contradictoria gana, esa ruta está activa y supera a lo que creías que era autoritativo. Kilo no muestra conflictos entre fuentes de instrucciones, por lo que una prueba de contradicción es la única forma de ver la resolución; el patrón general se cubre en detección de conflictos de memoria.
Repite una vez desde un subdirectorio que tenga su propio AGENTS.md, ya que los archivos por directorio se inyectan solo cuando el agente lee un archivo allí. Una ejecución de prueba desde la raíz del repositorio no los ejercitará.
Configuración en MemoryLake
La consolidación te proporciona una lista ordenada. No te dice por qué hay alguna línea en ella, y una regla sin una razón registrada es lo primero que se descarta durante la próxima limpieza.
MemoryLake guarda las razones: qué regla existe debido a qué incidente, qué se intentó y se rechazó, y qué restricciones provinieron de una persona en lugar del código. Se sitúa fuera del array instructions, por lo que el reordenamiento, el cambio de nombre y las migraciones de directorios no pueden hacer que se pierda. Comienza aquí.
Paso 1: Crear una clave API
Crea un espacio de trabajo para el repositorio y genera una clave API. Limítala al repositorio, no a Kilo, para que la próxima migración de herramienta sea un cambio de configuración en lugar de una reescritura.

Paso 2: Subir tus primeras memorias
Haz esto durante el Paso 1 de la consolidación, mientras lees archivos que no sabías que se estaban cargando. Para cada regla que encuentres en .kilocode/rules/, registra por qué se escribió antes de decidir si conservarla; ese juicio es mucho más difícil de hacer más adelante. Agrega los contenidos del banco de memoria que aún sean precisos y anota qué partes eliminaste y por qué.

Paso 3: Conectar tu IA y agentes
Conecta Kilo Code a través de las interfaces que utilices; la extensión de VS Code y la CLI comparten la tabla de prioridades pero difieren en los directorios externos, por lo que ambos deberían leer el mismo conjunto de decisiones. Si todavía ejecutas Cline en el mismo repositorio, conéctalo también: ambos comparten la herencia de archivos de reglas, y una capa compartida evita que se desvíen.

Qué cambia esto en la práctica
"Mi regla no se está aplicando" se convierte en una comprobación de cinco minutos en lugar de una tarde entera. Tienes un inventario, por lo que la pregunta es cuál de las fuentes conocidas está ganando, no si existe algún archivo desconocido.
El orden se vuelve real. Reemplazar los globs con rutas explícitas significa que la posición del array realmente determina la precedencia, por lo que un conflicto tiene una respuesta predecible que puedes señalar.
El directorio heredado deja de ser una segunda fuente de verdad. Una vez que .kilocode/rules/ está vacío, la tabla de prioridades más tu mapa de AGENTS.md por directorio es la imagen completa.
And las razones sobreviven a la limpieza. La consolidación elimina archivos por diseño. Eliminar una regla está bien; eliminar el único registro de por qué existía es la forma en que se vuelve a tener la misma discusión en seis meses.
Buenas prácticas para los archivos de reglas de Kilo Code
Lista las rutas explícitamente, no con globs. Una línea por archivo en el array instructions es más detallada y es la única forma de controlar el orden. Reserva los globs para directorios donde el orden realmente no importe.
Comenta en lugar de eliminar. Los comentarios de JSONC te permiten pausar una regla con una nota sobre por qué está pausada, lo cual es más informativo que una línea faltante.
Mantén corto el AGENTS.md raíz. No se puede desactivar y siempre se carga, por lo que cada línea es un costo de contexto permanente. Envía cualquier cosa específica de un área a un archivo por directorio.
Estandariza en mayúsculas AGENTS.md. Kilo lo requiere, y las herramientas no coinciden en la distinción entre mayúsculas y minúsculas, por lo que las mayúsculas son la opción sin costo para un repositorio compartido.
No confíes en los indicadores de estado del banco de memoria. Kilo dice que "aún pueden aparecer, pero no están garantizados en todos los clientes o modos". Verifícalo por contradicción en su lugar.
Vuelve a ejecutar la prueba de contradicción después de cualquier actualización de dependencia o versión. Las rutas de compatibilidad con versiones anteriores son exactamente el tipo de cosas que cambian entre lanzamientos, y un cambio silencioso aquí parece que el modelo empeoró, el diagnóstico erróneo detrás de mucho de lo que cubrimos en Cline olvida el contexto del proyecto, sobre la herramienta de la cual Kilo hizo un fork. Si todavía estás planeando ese paso, migrar de Cline a Kilo Code cubre el mapeo de archivos; esta guía trata sobre qué hacer una vez que estés allí.
Conclusión
El array instructions de Kilo Code es un manifiesto real, y los manifiestos son la idea correcta. El truco es que tres de los comportamientos de carga de Kilo quedan fuera de él: el directorio heredado .kilocode/rules/ se carga automáticamente, los archivos AGENTS.md por directorio se inyectan cuando el agente lee archivos cerca de ellos, y la CLI lee directorios de compatibilidad de otras herramientas.
Consolidar significa nombrar cada ruta explícitamente, vaciar las que no nombraste y luego probar por contradicción, porque un archivo de configuración no puede auditar fuentes que nunca menciona. Haz eso una vez y la tabla de prioridades se convertirá en una descripción precisa de tu proyecto en lugar de una parcial.