Loop Engineering: De Prompts a Sistemas Autónomos en Android
Índice de contenidos
El Fin de la Era del Prompting Manual
Durante años, la interacción con la inteligencia artificial en el desarrollo de software se ha basado en un modelo conversacional intermitente. Escribías un prompt, esperabas una respuesta, copiabas el código, lo ejecutabas, analizabas los errores, y volvías a escribir otro prompt. Este ciclo, aunque revolucionario en sus inicios, ha demostrado ser un cuello de botella. Como desarrolladores, nos convertimos en “niñeras” de la IA, gestionando cada pequeño paso de un proceso que debería ser fluido.
La comunidad de desarrollo está presenciando un cambio de paradigma monumental. Ya no se trata de cómo le pides algo a un agente; se trata de cómo diseñas el entorno en el que el agente opera de forma autónoma. Peter Steinberger, creador de OpenClaw, lo resumió perfectamente en una publicación que superó los cinco millones de visitas en veinticuatro horas: “Ya no deberías estar creando prompts para agentes de código. Deberías estar diseñando bucles que creen prompts para tus agentes.”
Esta afirmación no es un caso aislado. Boris Cherny, líder de Claude Code en Anthropic, respaldó esta visión al afirmar que su trabajo ya no es hacer prompts para Claude, sino escribir bucles que lo hacen por él. Este es el nacimiento del Loop Engineering.
¿Qué es exactamente el Loop Engineering?
En su núcleo, un “bucle agéntico” (agentic loop) es engañosamente simple. Solo requiere dos componentes fundamentales:
- Un disparador (Trigger): El evento que inicia el proceso. Puede ser la apertura de una Pull Request (PR), una tarea programada, una alerta del sistema, o simplemente un comando del usuario como “comienza”.
- Un objetivo verificable (Verifiable Goal): Un estado final claramente definido hacia el cual el agente debe trabajar. No es una instrucción paso a paso, sino una condición de éxito objetiva.
La magia ocurre en el medio. El agente no espera tu siguiente mensaje. Comienza, ejecuta acciones, verifica si el objetivo se ha cumplido y, de no ser así, vuelve a iterar (hace un bucle) hasta lograrlo o hasta que se alcance una condición de parada predefinida (guardrails). Le das al agente un objetivo, no un prompt. Él deduce los pasos, los ejecuta, revisa su propio trabajo y continúa.
Addy Osmani, otra voz influyente en este espacio, describe el Loop Engineering como el proceso de “reemplazarte a ti mismo como la persona que hace el prompt al agente”. Estás diseñando el sistema que lo hace en tu lugar. Es una meta recursiva donde defines un propósito y la IA itera hasta completarlo.
De la Interacción Basada en Turnos a la Autonomía
Para entender la magnitud de este cambio, debemos contrastarlo con el flujo de trabajo tradicional:
El flujo de trabajo tradicional (Ping-Pong):
- Escribes un prompt (“Crea una clase en Kotlin para manejar la base de datos”).
- Proporcionas contexto adicional (esquemas, interfaces).
- El agente genera el código.
- Tú revisas, copias y pegas en tu IDE.
- Ejecutas pruebas. Falla por una dependencia circular.
- Copias el error, escribes otro prompt (“Falla con este error, arréglalo”).
- Repites el ciclo.
Tu atención y tu tiempo son el motor que impulsa el proceso. Si te alejas del teclado, el progreso se detiene.
El flujo de trabajo con Loop Engineering:
- Defines un objetivo: “Migrar la base de datos SQLite actual a Room Database, asegurando que todos los tests unitarios pasen y que no haya pérdida de datos”.
- Inicias el bucle.
- El sistema toma el control:
- Analiza el código actual.
- Crea un plan de migración.
- Modifica las dependencias en
build.gradle.kts. - Crea las entidades y DAOs en Kotlin.
- Ejecuta
./gradlew test. - Lee los errores, ajusta el código y vuelve a ejecutar los tests.
- Finaliza cuando los tests pasan y el código cumple con los estándares definidos en los guardrails.
El motor ya no es tu atención; es el bucle que has diseñado. El modelo no es un colaborador al otro lado de un chat, sino una función que tu programa llama en un ciclo while.
Herramientas y Ecosistema de Loop Engineering
El ecosistema en 2026 ha madurado significativamente para soportar este tipo de arquitectura. Las piezas que antes requerían complejos scripts de bash ahora están integradas en productos robustos o frameworks especializados.
Superficies de Bucle vs. Runtimes
Es importante distinguir entre dónde se define el bucle y dónde se ejecuta.
Superficies de Bucle (Loop Surfaces): Son herramientas integradas que te permiten definir bucles simples de manera rápida, ideales para desarrolladores individuales o pequeños equipos.
- Claude Code y Grok Build: Estas herramientas proporcionan comandos como
/loop, habilidades (skills), subagentes y conectores MCP (Model Context Protocol) en un solo lugar. Son excelentes para tareas limitadas al entorno local.
Runtimes de Bucle: Cuando el bucle supera la capacidad de una sesión de terminal, entra en territorio de runtime.
- LangChain / LangGraph: LangChain ha adoptado el mantra de “Dar a tu agente su propia computadora”. Frameworks como LangGraph permiten construir sistemas multiagente complejos con estado persistente, manejando tareas que pueden durar horas o días, sobrevivir a reinicios de procesos y requerir aprobación humana asíncrona.
- millrace-ai: Un framework reciente para Python que permite crear “bucles gobernados”. Maneja la transferencia de artefactos entre agentes, la recuperación de errores y la configuración a través de grafos de datos, limitando cada paso a una porción estrecha del flujo de trabajo donde el agente tiene altas probabilidades de éxito.
El Estándar MCP (Model Context Protocol)
El Model Context Protocol (MCP) introducido por Anthropic se ha convertido en el tejido conectivo del Loop Engineering. MCP permite a los LLMs conectarse de forma segura a fuentes de datos externas y herramientas locales. Ya no necesitas escribir integraciones a medida para que tu agente consulte la base de datos o lea un log de errores en Android Studio; MCP estandariza estas interacciones, permitiendo que los bucles operen con un contexto rico y actualizado del mundo real.
Casos de Uso y Ejemplos en Desarrollo Móvil (Android/Kotlin)
El desarrollo móvil es un entorno complejo con múltiples dependencias, compilaciones lentas y peculiaridades específicas del ecosistema. Aquí es donde el Loop Engineering brilla con luz propia, automatizando ciclos de retroalimentación que de otro modo consumirían horas de tiempo del desarrollador.
A continuación, analizaremos casos de uso concretos donde el diseño de bucles transforma la forma en que construimos aplicaciones Android.
Caso 1: Refactorización a Jetpack Compose a Gran Escala
El Problema: Tienes una aplicación Android con docenas de fragmentos y actividades antiguas basadas en XML y ViewBinding. La refactorización manual a Jetpack Compose es tediosa, propensa a errores y requiere un conocimiento profundo de ambos sistemas para asegurar una paridad visual y funcional.
El Bucle Agéntico:
- Trigger: Un ticket de Jira etiquetado como
ComposeMigrationy el nombre del Fragmento/Activity objetivo. - Goal Verificable: La pantalla convertida a Compose se compila sin errores, pasa todas las pruebas de interfaz de usuario de Espresso/Compose y visualmente es idéntica a la original (verificado mediante pruebas de captura de pantalla - screenshot testing).
El Diseño del Bucle:
- Agente de Análisis: Lee el archivo XML y la clase Kotlin asociada (ej.
ProfileFragment.kt). Extrae la jerarquía de vistas, el estado (ViewModel) y las interacciones. - Agente de Generación (Compose): Toma el análisis y escribe la versión inicial en Jetpack Compose, utilizando prácticas modernas (state hoisting, modifiers adecuados).
- Agente de Integración: Reemplaza el uso del Fragment antiguo en la navegación (ej. Navigation Component o Compose Navigation) con la nueva pantalla.
- Bucle de Verificación (El motor):
- Ejecuta
./gradlew assembleDebug. Si falla, pasa el error al Agente de Generación para corregir. - Ejecuta pruebas de componentes UI. Si fallan (ej. un botón no es clickeable o el test de UI no lo encuentra), pasa el reporte de error y el jerarquía semántica al Agente de Generación.
- Ejecuta Paparazzi o Roborazzi para screenshot tests comparando la versión antigua con la nueva. Si el diff visual supera un umbral de tolerancia, el Agente Visual recibe la imagen de la diferencia y el código de Compose para ajustar los paddings, colores o tamaños.
- Ejecuta
- Guardrail: Límite de 10 iteraciones. Si no logra la paridad, hace un commit parcial en una rama separada y alerta a un desarrollador humano con un resumen de los conflictos.
En este escenario, el desarrollador se convierte en el revisor final del Pull Request, mientras que el bucle maneja todo el trabajo pesado de adaptación de sintaxis y ajustes visuales finos.
Caso 2: Caza Autónoma de Fugas de Memoria (Memory Leaks)
Las fugas de memoria en Android pueden ser infames por su dificultad de rastreo, especialmente en arquitecturas complejas con múltiples corrutinas y ciclos de vida de UI.
El Problema: La aplicación ocasionalmente se bloquea por OutOfMemoryError en producción. LeakCanary está integrado en builds de depuración, pero los desarrolladores no tienen tiempo para reproducir y arreglar todos los pequeños leaks reportados en el proceso de desarrollo diario.
El Bucle Agéntico:
- Trigger: La integración continua (CI) o una ejecución de prueba instrumentada genera un archivo de volcado de montón (heap dump,
.hprof) y un log de LeakCanary. - Goal Verificable: El código propuesto no debe compilar con advertencias, y la re-ejecución del escenario de prueba específico no debe generar nuevos heap dumps de LeakCanary.
El Diseño del Bucle:
- Agente de Análisis de Leak: Lee el log de LeakCanary y, utilizando herramientas MCP para analizar el código fuente, identifica el “camino de fuga” (leak trace). Encuentra la referencia fuerte exacta (por ejemplo, un contexto de Actividad retenido accidentalmente en una Corrutina de
GlobalScopeo un listener no desregistrado). - Agente de Refactorización: Modifica el código Kotlin para romper la referencia fuerte. Esto podría implicar:
- Cambiar
GlobalScopeaviewModelScopeolifecycleScope. - Utilizar
WeakReferencesi es estrictamente necesario. - Asegurar que los listeners se limpien en
onDestroy()oonCleared().
- Cambiar
- Bucle de Verificación:
- Compila el proyecto.
- Ejecuta la prueba de interfaz de usuario específica que desencadenó el volcado original utilizando un emulador o un dispositivo remoto (Firebase Test Lab).
- Monitorea Logcat para verificar si LeakCanary reporta la misma fuga u otra nueva derivada del cambio.
- Si persiste, reintenta con una estrategia de refactorización diferente.
- Guardrail: No permitir cambios en firmas de interfaces públicas o la adición de nuevas bibliotecas de terceros sin aprobación explícita.
Este tipo de bucle actúa como un mantenedor constante de la salud del código, atacando deuda técnica en segundo plano.
Caso 3: Actualización Autónoma de Dependencias Complejas
Actualizar bibliotecas como Dagger/Hilt, versiones de Kotlin o bibliotecas de Compose a menudo requiere cambios en cascada en todo el código base debido a deprecaciones y cambios en las APIs.
El Problema: Mantener el proyecto al día consume ciclos valiosos de sprint y es trabajo repetitivo.
El Bucle Agéntico:
- Trigger: Un bot como Dependabot o Renovate abre una Pull Request para una actualización mayor (ej. Kotlin 2.0 a 2.1).
- Goal Verificable: El proyecto compila, todas las pruebas unitarias y de integración pasan, y no hay advertencias de deprecación relacionadas con la biblioteca actualizada.
El Diseño del Bucle:
- Agente de Documentación (RAG): Obtiene los changelogs y guías de migración oficiales de la biblioteca en cuestión.
- Bucle de Compilación y Corrección:
- Intenta compilar.
- Si hay errores (ej. una API eliminada), el agente busca el reemplazo en el contexto obtenido en el paso 1.
- Aplica la solución y vuelve a compilar.
- Bucle de Pruebas:
- Ejecuta la suite de pruebas. Si fallan pruebas debido a cambios de comportamiento en la biblioteca, el agente ajusta la lógica de la prueba o la implementación para restaurar el comportamiento esperado, documentando el cambio.
- Guardrail: Límite estricto de gasto de tokens. Las actualizaciones de dependencias grandes pueden provocar “goal drift” si el agente empieza a refactorizar áreas no relacionadas tratando de arreglar un test frágil (flaky test).
Cuando el Bucle Falla: Riesgos y Antipatrones
Diseñar bucles agénticos no es simplemente encadenar LLMs. Requiere disciplina de ingeniería de sistemas. Un bucle mal diseñado es peligroso, costoso y frustrante. Estos son los principales riesgos (y por qué los guardrails son la parte más importante del Loop Engineering):
1. El Bucle Infinito (The Infinite Loop)
El riesgo más obvio y común. Ocurre cuando el agente queda atrapado oscilando entre dos estados erróneos, o intentando repetidamente la misma solución fallida porque no tiene memoria de sus intentos anteriores.
Ejemplo en Android: Un agente intenta resolver un error de dependencias en build.gradle.kts. Añade una exclusión a una biblioteca. La compilación falla con un nuevo error de “clase no encontrada”. Elimina la exclusión. Vuelve a fallar con el error original. Y así sucesivamente.
Solución (Guardrail): Implementar un límite estricto de iteraciones (ej. máximo 5 intentos por sub-objetivo). Además, el estado del bucle debe incluir un registro persistente (memoria de trabajo) de los intentos fallidos que se pasa como contexto al agente en cada iteración para evitar repeticiones.
2. Desplazamiento del Objetivo (Goal Drift)
Esto sucede cuando el agente, en su afán de resolver un problema, comienza a cambiar el alcance del trabajo o a refactorizar áreas no relacionadas del código, a menudo creando nuevos problemas.
Ejemplo en Android: El agente tiene la tarea de arreglar un bug en la lógica de paginación de un RecyclerView. Al revisar el adaptador, nota que no usa DiffUtil y decide implementarlo. Al hacerlo, rompe animaciones personalizadas. Luego intenta arreglar las animaciones modificando componentes de la UI base, alejándose por completo del bug original de paginación.
Solución (Guardrail): El “Goal Verificable” debe ser lo más estricto posible. Las pruebas automatizadas previas a la modificación actúan como anclas. Si un cambio propuesto rompe una prueba en una capa no relacionada (ej. modifica un Repository cuando la tarea era de UI), el bucle debe rechazar el cambio inmediatamente y forzar al agente a buscar una solución más localizada.
3. Explosión de Costos de Tokens (Token Cost Explosions)
Cada iteración en el bucle envía contexto al LLM. Si el agente comete errores, el historial de la conversación (los errores, los intentos, los logs) crece. En proyectos Android grandes, enviar el build.gradle.kts, múltiples archivos Kotlin y extensos logs de compilación en cada iteración puede consumir cientos de miles de tokens muy rápidamente.
Si un bucle entra en un ciclo casi infinito y no tienes controles, podrías encontrarte con una factura sustancial de la API (si estás usando modelos comerciales como Claude o GPT).
Solución (Guardrail):
- Presupuestos por bucle: Define un límite máximo de dólares/tokens por ejecución.
- Modelos pequeños para decisiones, modelos grandes para código: Usa modelos locales, rápidos y económicos (como un LLaMA de parámetros pequeños o similares optimizados para código) para evaluar el progreso y decidir la siguiente acción (el “motor” del bucle). Usa modelos grandes solo para las tareas pesadas de razonamiento o generación de código complejo.
- Resúmenes de contexto: En lugar de pasar todo el log de error de Gradle, pasa un agente intermedio encargado de resumir el error (“El error principal es una falta de coincidencia de versión en la dependencia X”) para mantener el contexto del agente principal pequeño y enfocado.
4. Deuda de Comprensión (Comprehension Debt)
Este es un concepto crucial. Cuando un agente escribe y aprueba su propio código en bucle mientras tú duermes, el código base avanza sin tu conocimiento profundo. A largo plazo, te encuentras manteniendo sistemas completos que no entiendes.
Solución (Guardrail):
- Artefactos de Handoff: El bucle debe estar obligado a generar documentación clara (como un Markdown de resumen arquitectónico) por cada PR que envía, explicando por qué tomó ciertas decisiones.
- El Humano en el Bucle (Human-in-the-loop): Para cambios estructurales o de dominio crítico, el bucle debe detenerse y pedir revisión explícita del plan de implementación antes de escribir código.
Profundización en las Técnicas de Optimización de Bucles para Android
Para garantizar que los bucles agénticos funcionen de manera óptima en proyectos móviles grandes, es esencial aplicar diversas técnicas avanzadas de optimización. Estas técnicas no solo mejoran el rendimiento del agente, sino que también minimizan el consumo de recursos computacionales y el gasto en tokens.
Una de las estrategias más efectivas es la ‘Gestión Contextual Dinámica’. En el desarrollo tradicional de Android, un desarrollador humano navega por cientos de archivos simultáneamente, manteniendo un mapa mental de la arquitectura del proyecto. Los agentes de IA, por otro lado, están limitados por sus ventanas de contexto. Proporcionar el proyecto completo a un agente en cada iteración es ineficiente y propenso a generar alucinaciones debido a la sobrecarga de información.
Para contrarrestar esto, los bucles avanzados utilizan un sistema de indexación semántica. Antes de iniciar la tarea principal, un agente explorador indexa el código base utilizando embeddings vectoriales. Cuando el agente principal necesita resolver un problema (por ejemplo, actualizar la inyección de dependencias con Hilt en una capa de dominio específica), consulta este índice para recuperar solo los fragmentos de código estrictamente relevantes: interfaces de repositorios, módulos de Hilt afectados y los casos de uso dependientes. Esto reduce drásticamente el tamaño del contexto enviado en cada llamada a la API, optimizando tanto los costos como la precisión de las respuestas.
Otra área crítica de optimización es el manejo de la concurrencia y el estado asíncrono. Las aplicaciones Android modernas dependen en gran medida de Kotlin Coroutines y Flow para manejar operaciones en segundo plano de manera fluida y reactiva. Los agentes encargados de refactorizar o implementar esta lógica a menudo tropiezan con los matices de la gestión del ciclo de vida y la cancelación estructurada.
En un bucle agéntico bien diseñado para Coroutines, se implementan guardrails específicos que validan estáticamente el uso correcto de los ‘dispatchers’. Por ejemplo, una regla automatizada dentro del ciclo de verificación puede analizar el código generado para asegurar que todas las operaciones de entrada/salida (I/O), como llamadas a la red o consultas a la base de datos (Room), se ejecuten explícitamente en el Dispatchers.IO. Si el agente intenta realizar estas operaciones en el Dispatchers.Main, el bucle falla la verificación de inmediato, proporcionando una retroalimentación precisa al agente para que corrija el error en la siguiente iteración.
Además, las pruebas de las interfaces de usuario construidas con Jetpack Compose presentan desafíos únicos para la verificación autónoma. A diferencia de las vistas tradicionales (XML) que tienen identificadores estáticos predecibles, la jerarquía de Compose es dinámica y a menudo depende del estado en tiempo de ejecución. Los bucles efectivos en este ámbito emplean agentes especializados en ‘Accesibilidad Semántica’. Estos agentes no verifican componentes visuales basándose en identificadores abstractos, sino que analizan el árbol semántico expuesto para las herramientas de accesibilidad (como TalkBack).
El objetivo verificable para una refactorización de interfaz no solo implica que la pantalla se vea correctamente (validado por pruebas de captura de pantalla), sino que su estructura semántica sea robusta. El agente debe asegurar que elementos interactivos, como botones y campos de entrada, expongan descripciones semánticas claras y precisas, facilitando tanto la accesibilidad para usuarios con discapacidades como la estabilidad de las pruebas automatizadas (Espresso/UI Automator) que confían en estos mismos árboles semánticos para interactuar con la aplicación.
La gestión del estado persistente a través de configuraciones de bucle avanzadas es vital para tareas a largo plazo. Imagina una refactorización masiva de la arquitectura, migrando de un patrón Modelo-Vista-Presentador (MVP) obsoleto a una Arquitectura Limpia con Modelo-Vista-ViewModel (MVVM) reactivo utilizando StateFlow. Esta transición es demasiado grande para resolverse en un solo ciclo de ejecución.
En estos escenarios, el bucle se diseña como una máquina de estados de larga duración. El progreso se guarda meticulosamente después de cada micro-objetivo alcanzado (por ejemplo, “Migrar el Presentador X al ViewModel Y”). Si el proceso se interrumpe (debido a un fallo de conexión, límite de la API o reinicio del sistema), el bucle puede reanudarse exactamente desde el último estado válido conocido, sin necesidad de reiniciar toda la refactorización desde cero. Esta persistencia se logra comúnmente utilizando bases de datos ligeras (como SQLite) integradas directamente en el entorno de ejecución del bucle (runtime).
La sinergia entre el Loop Engineering y la Integración/Entrega Continua (CI/CD) representa el pináculo de la automatización del desarrollo. En flujos de trabajo de vanguardia, los bucles no solo se ejecutan localmente en la máquina del desarrollador, sino que se integran como etapas fundamentales en los pipelines de GitHub Actions o GitLab CI.
Cuando un desarrollador envía código a una rama de características, el pipeline activa un ‘Bucle de Revisión Agéntico’. Este bucle no se limita a un simple análisis estático como lo haría un linter convencional; es capaz de razonar sobre la arquitectura. Evalúa el PR frente a guías de estilo complejas, verifica posibles regresiones de rendimiento y, si detecta áreas de mejora, no solo deja un comentario; automáticamente genera un commit en la misma rama con las correcciones sugeridas, notificando al desarrollador humano para la aprobación final.
Este nivel de integración requiere una robustez extrema en los ‘guardrails’ y mecanismos de contención. Los bucles que operan en entornos de CI deben tener privilegios estrictamente limitados (Principio de Menor Privilegio). No deben poder modificar el código en las ramas principales (‘main’ o ‘master’) directamente, ni acceder a secretos de producción a menos que sea absolutamente necesario para una tarea específica de despliegue, la cual siempre debe requerir autorización humana.
Finalmente, el factor económico del Loop Engineering no puede ser ignorado. A medida que escalamos el uso de agentes autónomos, la monitorización de costos se vuelve tan importante como la monitorización del rendimiento de la aplicación. Herramientas emergentes en 2026 permiten a los equipos visualizar en tiempo real el gasto de tokens atribuido a bucles individuales y proyectos completos.
Los equipos maduros establecen presupuestos operativos para sus agentes. Si un bucle para resolver un ‘Issue’ secundario excede el presupuesto asignado sin alcanzar su objetivo, se detiene automáticamente, se etiqueta como “Requiere Intervención Humana” y se archiva el log de iteraciones para su posterior análisis. Esta gestión proactiva de recursos garantiza que el desarrollo automatizado siga siendo una ventaja estratégica y no se convierta en una carga financiera incontrolada.
La adopción del Loop Engineering en equipos de desarrollo móvil requiere un cambio cultural profundo. Pasamos de medir la productividad por líneas de código escritas a medirla por la sofisticación y eficiencia de los bucles diseñados. La educación continua, el análisis post-mortem de bucles fallidos y el intercambio de patrones exitosos entre desarrolladores se convierten en las prácticas fundamentales de la ingeniería de software del futuro.
Conclusión: El Nuevo Rol del Ingeniero de Software
El Loop Engineering no elimina la necesidad de ingenieros de software; reescribe su descripción de trabajo. En 2026, la habilidad fundamental ya no es escribir bucles for en Kotlin (la IA lo hace mejor y más rápido). La habilidad fundamental es el pensamiento sistémico.
Eres un arquitecto de automatización. Tu trabajo es definir claramente los estados de éxito, construir los entornos de prueba impermeables (que actúan como el ground truth para el agente), y diseñar los límites de seguridad que evitan que el sistema se descarrile.
En el contexto de Android, esto significa invertir fuertemente en pruebas automatizadas rápidas, modularización profunda del código base (para que los agentes puedan trabajar en áreas aisladas sin causar daños colaterales masivos) y una sólida comprensión de las herramientas de integración continua.
La transición del prompting al Loop Engineering es un cambio de la microgestión a la delegación estructurada. Aquellos que dominen el diseño de estos sistemas serán capaces de gestionar el rendimiento equivalente a un equipo entero de desarrolladores, logrando en horas lo que antes llevaba semanas de tedioso ping-pong.
También te puede interesar
De Copilot a Agentes Autónomos: Cline, Cursor y el flujo de trabajo en 2025
El autocompletado es cosa del pasado. Descubre cómo los Agentes de IA como Cline y Cursor están redefiniendo el desarrollo de software, permitiendo editar múltiples archivos y ejecutar comandos de forma autónoma.
rules.md: El Estándar Definitivo para Controlar Agentes de IA en 2026
Descubre cómo rules.md, .cursorrules y el formato .mdc han revolucionado la forma en que guiamos a la IA en el desarrollo Android y Kotlin.
design.md: El Nuevo Estándar para el Diseño UI/UX Asistido por IA
Descubre cómo design.md complementa a agents.md, enfocándose en decisiones de diseño, UI/UX, accesibilidad y Jetpack Compose para el desarrollo Android en la era de los agentes de IA.