This is the full developer documentation for Falcux AI-First # Descripción general > Qué es el paquete @falcux/ai-first, cómo se instala en un comando y qué puedes hacer con él. `@falcux/ai-first` es gobierno del contexto para proyectos que se construyen con agentes de código. Trae tres piezas: los **templates** de los documentos que el agente necesita leer, las **skills** que le dicen cómo trabajar en cada tipo de tarea y el **detector de entropía**, que mide cuánto se alejó lo que el proyecto documenta de lo que el proyecto es. La CLI nunca llama a un modelo ni a la red: entrega el procedimiento; la inferencia la pone tu propio agente. ## Comenzar En la raíz de tu proyecto, o en una carpeta vacía: * npx ```bash npx @falcux/ai-first@latest init ``` * pnpm dlx ```bash pnpm dlx @falcux/ai-first@latest init ``` El `@latest` evita que `npx` reutilice una versión vieja de su caché. `init` escribe `AI-FIRST.md`, el registro de decisiones y la carpeta de cambios, instala las skills, deja el hook de git y el flujo de CI, y nunca sobreescribe nada que ya exista. Si es tu primera vez, sigue el [inicio rápido](/docs/empezar/inicio-rapido/). ## Lo que puedes hacer ### Arrancar un producto desde una idea Con la entrevista, `init` instala `protocolo-arranque`. Tu agente la conduce hasta el PRD, la arquitectura y las primeras specs, con la decisión de stack registrada en el ADR. ```text Usa protocolo-arranque. Quiero construir una app para reservar canchas de fútbol. ``` [Arrancar un producto desde cero](/docs/guias/arrancar-un-producto/) ### Adaptar las skills a tu proyecto La entrevista escribe tus comandos, tu fase y tu orden de implementación dentro de cada skill instalada, entre marcas que respeta en la siguiente corrida. ```bash npx @falcux/ai-first@latest init --entrevista ``` [Adaptar las skills](/docs/guias/adaptar-las-skills/) ### Desarrollar una feature con spec antes que código `protocolo-features` recorre la pre-implementación y la secuencia por capas antes de que el agente escriba una línea. ```text Usa protocolo-features para agregar la exportación de reservas a CSV. ``` [Desarrollar una feature](/docs/guias/desarrollar-una-feature/) ### Cambiar algo que ya funciona sin romperlo `protocolo-cambios` clasifica el cambio, abre su documento en `docs/changes/pending/` y analiza el impacto antes de tocar nada. ```text Usa protocolo-cambios: el formulario de reserva pasa de tres pasos a uno. ``` [Cambiar algo que ya funciona](/docs/guias/gestionar-un-cambio/) ### Cerrar la sesión sin perder el contexto `protocolo-cierre` escribe el registro de sesión, actualiza la documentación y envía cada aprendizaje a su sitio. ```text Usa protocolo-cierre para cerrar la sesión de hoy. ``` [Cerrar la sesión](/docs/guias/cerrar-la-sesion/) ### Auditar la entropía, en local y en CI `audit` corre cinco verificaciones en código puro y devuelve un puntaje de 0 a 100. El hook de `pre-push` y el flujo de CI que deja `init` lo corren por ti. ```bash npx @falcux/ai-first@latest audit ``` [Auditar en local y en CI](/docs/guias/auditar-en-local-y-en-ci/) ## Quiero… → Usa… | Quiero… | Usa… | | -------------------------------------------------- | -------------------------------------------------------------------- | | Preparar un repo para la metodología | `npx @falcux/ai-first@latest init` | | Que las skills conozcan mis comandos y mi fase | `init --entrevista` | | Definir el producto antes de programar | la skill `protocolo-arranque` | | Implementar algo nuevo | la skill `protocolo-features` | | Modificar algo que ya funciona | la skill `protocolo-cambios` | | Cerrar una sesión de trabajo | la skill `protocolo-cierre` | | Saber si la documentación sigue diciendo la verdad | `npx @falcux/ai-first@latest audit` | | Cortar un pull request por cualquier hallazgo | `audit --estricto`, que ya corre en `.github/workflows/ai-first.yml` | | Saber qué versión tengo | `npx @falcux/ai-first@latest --version` | El porqué de cada pieza —por qué un registro de decisiones, por qué Zonas Prohibidas, por qué un protocolo antes de cada tarea— está en la pestaña [Metodología](/docs/metodologia/). ## Próximos pasos [Inicio rápido](/docs/empezar/inicio-rapido/)De una carpeta vacía a tu primer audit limpio. [Qué deja init en tu repo](/docs/empezar/que-instala/)Cada archivo que escribe, para qué sirve y quién lo lee. [Adoptar en un proyecto existente](/docs/empezar/proyecto-existente/)Qué salta, qué sugiere y qué tienes que revisar. [Agentes compatibles](/docs/empezar/agentes/)Cómo lee las skills cada herramienta. # Inicio rápido > De una carpeta vacía a un repo configurado y un primer audit con entropía 0, en seis pasos. Esta página te lleva de una carpeta vacía a un repo con la metodología configurada y un primer `audit` limpio. Son unos minutos; lo que más tiempo toma es leer lo que `init` escribió. ## Requisitos * **Node 22.12 o más nuevo.** El paquete lo declara en `engines` (`>=22.12.0`). `npx` viene con npm. * **git.** Si la carpeta todavía no es un repositorio, `init` corre `git init` por ti; `audit` siempre necesita uno. Para saber qué versión del paquete estás corriendo: ```bash npx @falcux/ai-first@latest --version ``` ## De cero a primer audit 1. **Crea la carpeta del proyecto.** ```bash mkdir mi-proyecto && cd mi-proyecto ``` 2. **Corre `init`.** ```bash npx @falcux/ai-first@latest init ``` Sin `@latest`, `npx` puede servirte una versión vieja de su caché; sin `init`, sólo imprime la ayuda. Los detalles están en la [referencia de init](/docs/referencia/init/). 3. **Responde la entrevista.** En una terminal interactiva y en un proyecto sin documentación, `init` pregunta lo que no puede deducir. Cada pregunta trae un valor por defecto entre corchetes; Enter lo acepta. * Cómo se llama el proyecto. * En qué fase está: exploración, MVP o producción. * Qué clase de producto es: SaaS o aplicación web con sesión, landing o sitio de contenido, API sin interfaz, herramienta de línea de comandos o librería, o aplicación móvil. Esto decide qué skills se instalan. * Qué forma tiene el repositorio: una sola aplicación, un monorepo o uno de varios repos. * Con qué comando se verifica que el proyecto está sano, y los de tipos y lint si los hay. * Si trabajas con varios agentes en paralelo. * Qué archivo lleva el número de versión. * En qué orden se implementa una feature; las opciones dependen de la clase de producto. * Una confirmación por cada Zona Prohibida que `init` sugiere. Las respuestas van a `AI-FIRST.md` y a la sección «Adaptación a tu proyecto» de cada skill instalada. Con entrevista se instala también `protocolo-arranque`, la skill que define el producto. Si prefieres no responder ahora, `--sin-entrevista` la salta. Así termina `init` en una carpeta vacía llamada `demo`, corrido con `--sin-entrevista`: ```text ai-first init — demo escrito .git/ escrito AI-FIRST.md escrito docs/ADR.md escrito docs/SESSION_LOG.md escrito docs/changes/CHANGE_LOG.md escrito docs/changes/pending/.gitkeep escrito .agents/skills/protocolo-features escrito .agents/skills/protocolo-cambios escrito .agents/skills/protocolo-cierre escrito .agents/skills/version-bump escrito .agents/skills/test-fix escrito .claude/skills escrito .githooks/pre-push escrito core.hooksPath escrito .github/workflows/ai-first.yml escrito AGENTS.md 1 Zona Prohibida sugerida: .env* 0 superficies de decisión: — 2 artefactos declarados Revisa AI-FIRST.md —sobre todo las razones de cada zona— y AGENTS.md, y luego corre `ai-first audit`. ``` Qué es cada línea está en [Qué deja init en tu repo](/docs/empezar/que-instala/). 4. **Revisa `AI-FIRST.md`.** Es el mapa que el detector verifica. Mira sobre todo las Zonas Prohibidas: `init` las sugiere por lo que encuentra en el repo, y `.env*` siempre. Al final del archivo, en «Notas», hay una línea por zona para completar: ```md Por qué `.env*` es Zona Prohibida: _(completar: qué cuesta revertir un error ahí)_. ``` El criterio es el costo de revertir un error ahí, no la importancia del archivo. Quita las que no apliquen: pocas, o se vuelven ruido. El formato completo está en la [referencia de AI-FIRST.md](/docs/referencia/ai-first-md/). 5. **Corre el primer `audit`.** ```bash npx @falcux/ai-first@latest audit ``` ```text ai-first audit — demo árbol de trabajo contra HEAD · 0 archivos tocados ✓ Zona Prohibida tocada ✓ Decisión sin fila en ADR – Alcance excedido — omitido: no hay ninguna spec activa en docs/changes/pending/ ✓ Artefacto huérfano – Inventario de componentes desactualizado — omitido: faltan «artefactos.inventario_componentes» o «artefactos.componentes_dir» Entropía: 0 / 100 (0 P0 · 0 P1 · 0 P2) ``` Cómo se lee: * La segunda línea dice qué compara: sin `--base`, el árbol de trabajo contra el último commit. Antes de tu primer commit cuenta como tocados los archivos que `init` acaba de escribir; después del commit, 0. * `✓` es una verificación aprobada, `✗` una con hallazgos y `–` una omitida, siempre con su razón. Omitido no es aprobado: el check no tenía con qué correr. Alcance se omite porque todavía no hay un cambio abierto, e Inventario porque el proyecto no declara componentes. * La última línea es el puntaje: `min(100, 40·P0 + 20·P1 + 8·P2)`. Más alto es peor. El código de salida es 0; con cualquier P0 sería 1. 6. **Haz el commit.** ```bash git add -A git commit -m "chore: configura ai-first" ``` Desde ahora, cada `git push` pasa por `.githooks/pre-push`, que corre el mismo `audit` sobre lo que vas a publicar y sólo interrumpe ante un P0. Consejo Si el proyecto todavía es sólo una idea, el paso siguiente es pedirle a tu agente que use `protocolo-arranque`. Si lo instalaste sin entrevista, vuelve a correr `init` con `--skills protocolo-arranque`: lo que ya existe se salta. ## Próximos pasos [Qué deja init en tu repo](/docs/empezar/que-instala/)Cada pieza, qué hace y qué skill o check la usa. [Arrancar un producto desde cero](/docs/guias/arrancar-un-producto/)De la idea al PRD, la arquitectura y las specs. [ai-first audit](/docs/referencia/audit/)Modos, opciones y códigos de salida. # Qué deja init en tu repo > La anatomía de lo que escribe ai-first init, pieza por pieza, y qué skill o verificación usa cada una. `init` deja en el repo todo lo que los protocolos y el detector dan por hecho. Esta página recorre cada pieza: qué es, qué contiene al nacer y quién la lee. ## El árbol Así queda una carpeta vacía después de `npx @falcux/ai-first@latest init --sin-entrevista`, sin contar `.git/`: * .agents/ * skills/ * protocolo-cambios/ * SKILL.md * references/ * documento-de-cambio.md * protocolo-cierre/ * SKILL.md * protocolo-features/ * SKILL.md * test-fix/ * SKILL.md * version-bump/ * SKILL.md * .claude/ * skills enlace simbólico a ../.agents/skills * .githooks/ * pre-push * .github/ * workflows/ * ai-first.yml * docs/ * ADR.md * SESSION\_LOG.md * changes/ * CHANGE\_LOG.md * pending/ * .gitkeep * AGENTS.md * AI-FIRST.md Además, en la configuración local del repo, `core.hooksPath` queda apuntando a `.githooks`. `init` no escribe `CLAUDE.md`: si usas Claude Code, el template `templates/CLAUDE_MD_TEMPLATE.md` del paquete es una línea, `@AGENTS.md`. ## AI-FIRST.md El mapa que el detector verifica. Un frontmatter YAML con lo que `init` encontró, cada campo con un comentario que explica para qué es: * `zonas_prohibidas`: rutas que el agente no modifica sin aprobación explícita. `init` sugiere las que encuentra —carpetas de migraciones, `infra/`, `terraform/`, `LICENSE`— y `.env*` siempre. Tocar una es un **P0**. * `superficies_de_decision`: rutas donde un cambio se presume decisión arquitectónica, como `**/*.config.*` o los flujos de `.github/workflows/`. Si una se toca y el ADR no gana una fila, es un **P1**. Si no encuentra ninguna, el campo queda comentado. * `alcance.spec`: la carpeta del cambio en curso, `docs/changes/pending/`. * `artefactos`: los documentos que hablan de este repo, como `AGENTS.md` y el ADR. El detector comprueba que lo que mencionan exista. `verificacion`, el comando que decide si el proyecto está sano, sale de los scripts `build` y `test` del `package.json` si los hay. Con entrevista, `fase`, `perfil` y `verificacion` quedan con tus respuestas. Debajo del frontmatter, la sección «Notas» pide la razón de cada zona. La skill `protocolo-arranque` también escribe en este archivo. Campo por campo, en la [referencia de AI-FIRST.md](/docs/referencia/ai-first-md/). ## docs/ADR.md El registro de decisiones, vacío salvo por sus reglas y un molde comentado de `ADR-001`. Una decisión entra si es difícil de revertir, tenía alternativas reales y alguien va a preguntar por qué dentro de seis meses. No se edita: se agrega una nueva que supera a la vieja. Lo usan `protocolo-cierre`, `protocolo-features`, `protocolo-cambios`, `protocolo-arranque` e `information-architecture`. La verificación «Decisión sin fila en ADR» busca encabezados `## ADR-` nuevos en él. Si el repo ya tenía un `ADR.md` en la raíz o en `docs/`, `init` usa ése. ## docs/SESSION\_LOG.md El registro de sesiones: qué se hizo, qué cambió y qué quedó pendiente, con la sesión más reciente arriba. Nace con su cabecera y ninguna entrada. Lo escribe `protocolo-cierre` en su Fase A y lo verifica el humano; `version-bump` lo lee. ## docs/changes/ * `pending/` es donde vive el documento de un cambio mientras está abierto. `protocolo-cambios` lo crea ahí a partir de su molde, `references/documento-de-cambio.md`, y la verificación «Alcance excedido» lee la lista de archivos de esa spec. Nace con un `.gitkeep` para que git la versione vacía. * `CHANGE_LOG.md` es el resumen permanente de cada cambio cerrado. Al cerrarlo, el documento sale de `pending/` y su resumen queda acá. ## .agents/skills y el enlace .claude/skills Las skills, copiadas del paquete. Sin entrevista son las cinco que no piden interfaz: `protocolo-features`, `protocolo-cambios`, `protocolo-cierre`, `version-bump` y `test-fix`. Con entrevista, las que pida el perfil del producto, más `protocolo-arranque`. `--skills` elige otras y `--enlazar` deja enlaces simbólicos en vez de copias. `.agents/skills/` es la carpeta del estándar Agent Skills. `.claude/skills` es un enlace simbólico relativo a ella, porque Claude Code lee su propia carpeta: cada archivo existe una sola vez. Cómo las lee cada herramienta, en [Agentes compatibles](/docs/empezar/agentes/). ## El bloque de AGENTS.md Si no había `AGENTS.md`, `init` lo crea con una cabecera mínima que apunta al template. Si ya existía, agrega al final un bloque entre dos marcas: ```md ### Metodología AI-First … ``` Dentro va una tabla con cada skill instalada y cuándo se invoca, y otra que traduce el vocabulario del manual a las rutas del repo: registro de sesión, registro de decisiones, cambio en curso. Cada corrida de `init` reescribe lo que hay entre las marcas con lo que encuentra instalado; **fuera de ellas no toca una letra**. Si falta una de las dos marcas, o están al revés, `init` se detiene y te pide arreglarlo a mano. ## .githooks/pre-push y core.hooksPath El punto de control local. Antes de cada `git push` corre `audit` sobre el rango que vas a publicar, **sin `--estricto`**: imprime todo, pero sólo un P0 interrumpe el push. Si la rama todavía no existe en el remoto, audita el árbol de trabajo. * Busca el `ai-first` del proyecto, luego el del PATH, y sólo usa `npx --no-install`, que no descarga nada. Si no lo encuentra, avisa y deja pasar el push. * Si no encuentra `node`, lo busca en las rutas habituales y en `nvm.sh`; si aun así no aparece, avisa y deja pasar. * Se salta con `git push --no-verify`. Para que git lo use, `init` fija `core.hooksPath` en `.githooks`, **sólo si estaba sin configurar**. Un `core.hooksPath` de husky o lefthook no se pisa: se reporta como sugerido. Con `--hook-local` el hook va a `.git/hooks/`, que no viaja en el clon; con `--sin-hook` no se escribe. Es un hook de git, no un hook del agente. ## .github/workflows/ai-first.yml El mismo detector en cada pull request, **con `--estricto`**: acá cualquier hallazgo, P1 o P2 incluidos, deja el check en rojo. Hace checkout con toda la historia, instala Node 22 y corre: ```bash npx --yes @falcux/ai-first audit --base "origin/${{ github.base_ref }}" --estricto ``` Con `--sin-ci` no se escribe. ## Nunca sobreescribe Lo que ya existe se salta, se reporta y el comando sigue. Cada línea del reporte tiene uno de tres estados: | Estado | Qué significa | | ---------- | ---------------------------------------------------------------------------------------------------------------- | | `escrito` | No existía y `init` lo creó. | | `saltado` | Ya existía y no se tocó. Entre paréntesis, la razón si no es «ya existe». | | `sugerido` | Hacía falta algo en un archivo o una configuración que ya existía; en vez de cambiarlo, `init` dice qué agregar. | Una skill cuya carpeta ya existe se salta entera, sin fusionar nada dentro. El enlace `.claude/skills` tampoco se crea si ahí ya hay algo. Correr `init` dos veces deja el repo igual. Nota Todas las opciones de `init` y el detalle de cada estado están en la [referencia de init](/docs/referencia/init/). ## Próximos pasos [El formato de AI-FIRST.md](/docs/referencia/ai-first-md/)Cada campo del frontmatter y cómo lo lee el detector. [ai-first init](/docs/referencia/init/)Todas las opciones y lo que reporta. [Adoptar en un proyecto existente](/docs/empezar/proyecto-existente/)Qué pasa cuando el repo ya tiene AGENTS.md, hooks o documentación. # Adoptar en un proyecto existente > Qué hace init en un repo que ya tiene código, AGENTS.md, hooks o documentación, y qué te toca revisar después. `init` está pensado para correr sobre un repo con historia. No sobreescribe nada: lo que ya existe se salta y se reporta, y lo que haría falta cambiar en un archivo tuyo se sugiere en vez de escribirse. Esta página dice qué pasa con cada cosa que ya tengas y qué revisar al terminar. ## Correrlo Desde la raíz del repo: ```bash npx @falcux/ai-first@latest init ``` Para dejar fuera el hook, el flujo de CI o la entrevista, mira [Qué dejar fuera](#qu%C3%A9-dejar-fuera). ## Lo que ya tienes | Si ya hay… | `init`… | | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | `AGENTS.md` | Agrega al final su bloque entre `` y ``. El resto del archivo queda igual. | | `AI-FIRST.md` | Lo salta. Si le falta `alcance.spec`, lo reporta como sugerido con la línea que añadir. | | `ADR.md` en la raíz o en `docs/` | Lo usa como registro de decisiones y no crea otro. | | `docs/SESSION_LOG.md` o `docs/changes/CHANGE_LOG.md` | Los salta. | | Una skill con el mismo nombre en `.agents/skills/` | Salta la carpeta **entera**, sin fusionar nada dentro. | | `.claude/skills` como directorio real | Lo deja como está y lo reporta: un enlace encima habría creado `.claude/skills/skills`. | | `core.hooksPath` apuntando a otro sitio, como el de husky o lefthook | No lo cambia. Escribe `.githooks/pre-push` igual y reporta la configuración como sugerida. | | `.github/workflows/ai-first.yml` | Lo salta. | Este es el reporte real sobre un repo con `AGENTS.md`, `package.json`, una carpeta `migrations/`, componentes en `src/components/` y `core.hooksPath` apuntando a `.husky`, corrido sin terminal interactiva: ```text ai-first init — tienda escrito AI-FIRST.md escrito docs/ADR.md escrito docs/SESSION_LOG.md escrito docs/changes/CHANGE_LOG.md escrito docs/changes/pending/.gitkeep escrito .agents/skills/protocolo-features escrito .agents/skills/protocolo-cambios escrito .agents/skills/protocolo-cierre escrito .agents/skills/version-bump escrito .agents/skills/test-fix escrito .claude/skills escrito .githooks/pre-push sugerido core.hooksPath — ya apunta a .husky; mueve el hook ahí o cambia la configuración a .githooks escrito .github/workflows/ai-first.yml escrito AGENTS.md Sin entrevista: no hay terminal interactiva. 2 Zonas Prohibidas sugeridas: migrations/, .env* 1 superficie de decisión: **/*.config.* 2 artefactos declarados Revisa AI-FIRST.md —sobre todo las razones de cada zona— y AGENTS.md, y luego corre `ai-first audit`. ``` La línea `escrito AGENTS.md` significa que se agregó el bloque, no que se reemplazó el archivo. Una segunda corrida sobre el mismo repo reporta todo como `saltado`, y `AGENTS.md` con la razón «el bloque ya está al día». ## La entrevista, en un repo documentado `init` considera que el proyecto ya está documentado si encuentra `AI-FIRST.md`, `AGENTS.md` o algún `.md` bajo `docs/` que git no ignore, sin contar los que `init` mismo escribe. En ese caso, en una terminal interactiva, dice qué encontró y ofrece la entrevista con saltarla como valor por defecto: ```text ¿Entrevistar de todos modos? [s/N] ``` Las skills se instalan igual; la entrevista sólo sirve para adaptarlas. Para entrevistar sin la pregunta previa: ```bash npx @falcux/ai-first@latest init --entrevista ``` Sin terminal interactiva —en CI, con la entrada redirigida o desde otro comando— no se entrevista nunca, y el reporte lo dice. `--entrevista` en ese caso es un error de uso. ## Revisa las Zonas Prohibidas `init` sugiere zonas por lo que encuentra —carpetas de migraciones, `infra/`, `terraform/`, `LICENSE`— y agrega `.env*` siempre. En el repo del ejemplo, el `AI-FIRST.md` quedó así: ```yaml zonas_prohibidas: - ruta: "migrations/" razon: "esquema de base de datos" desde: 2026-09-23 - ruta: ".env*" razon: "credenciales" desde: 2026-09-23 ``` La razón por defecto es genérica. Cámbiala por lo que cuesta revertir un error ahí, quita las que no sean tuyas y agrega las que `init` no puede adivinar. Pocas zonas: si todo es prohibido, nada lo es. Revisa también `superficies_de_decision` y, si tienes componentes, las dos líneas comentadas de `artefactos` que activan la verificación de inventario: ```yaml # Hay componentes en src/components/. Para vigilar su inventario, descomenta: # inventario_componentes: docs/COMPONENTES.md # componentes_dir: "src/components/" ``` Después corre `npx @falcux/ai-first@latest audit` y haz el commit. ## Qué dejar fuera | Opción | Efecto | | ------------------ | -------------------------------------------------------------------------------------------- | | `--sin-hook` | No escribe el hook de git ni toca `core.hooksPath`. | | `--hook-local` | El hook va a `.git/hooks/`, que no viaja en el clon, y la configuración del repo no se toca. | | `--sin-ci` | No escribe `.github/workflows/ai-first.yml`. | | `--sin-entrevista` | No entrevista nunca. | `--sin-hook` y `--hook-local` se contradicen: juntas son un error de uso. Si ya usas husky o lefthook, el reporte te da dos salidas: mover el hook a la carpeta que ya usas o cambiar la configuración a `.githooks`. La lista completa de opciones está en la [referencia de init](/docs/referencia/init/). ## Instalar sólo las skills, sin la CLI Si no quieres correr `init`, puedes copiar las skills a mano. Es lo mismo que hace el comando con ellas, sin el resto: no escribe `AI-FIRST.md`, ni el ADR, ni el hook. Primero trae la carpeta `skills/` del paquete: * Desde npm ```bash npm pack @falcux/ai-first@latest tar -xzf falcux-ai-first-*.tgz origen=package/skills ``` * Desde git ```bash git clone --depth 1 https://github.com/HoruxDeEdfu/falcux-ai-first-package.git origen=falcux-ai-first-package/skills ``` Y después, desde la raíz de tu proyecto: ```bash mkdir -p .agents/skills # Copia sólo las que tu proyecto no tenga ya for carpeta in "$origen"/*/; do nombre=$(basename "$carpeta") if [ -e ".agents/skills/$nombre" ]; then echo "saltada: $nombre — ya existe en tu proyecto" else cp -r "$carpeta" ".agents/skills/$nombre" fi done # Un solo enlace para Claude Code, si no hay nada en su sitio mkdir -p .claude [ -e .claude/skills ] || ln -s ../.agents/skills .claude/skills ``` Al terminar, borra lo que descargaste: la carpeta `package/` y el `.tgz`, o el clon. El bucle copia las once; `init`, por defecto, sólo cinco. Borra las que no vayas a usar todavía. Salta la carpeta entera cuando el nombre ya existe, en vez de fusionarla: copiar sin más habría pisado tu `SKILL.md` y dejado los archivos de apoyo del paquete dentro de tu skill, en silencio. El enlace tampoco se crea si `.claude/skills` ya es algo, porque sobre un directorio real te dejaría un `.claude/skills/skills` que no lee nadie. Precaución Una skill copiada a mano no está adaptada. Cada una trae al final la sección «Adaptación a tu proyecto» con lo que hay que cambiar; sin eso ocupa presupuesto de carga y da instrucciones que no aplican a tu stack. La entrevista de `init` hace esa adaptación por ti. ### Si un nombre ya está ocupado Seis skills llevan nombres de oficio —`i18n`, `test-fix`, `version-bump`, `ux-writer`, `ux-audit`, `information-architecture`— y tu proyecto puede tener ya una con alguno. Tienes tres salidas: * **Quedarte con la tuya.** No hagas nada: el bucle ya la saltó. * **Quedarte con la del paquete.** Borra la tuya y vuelve a correr el bucle. * **Tener las dos.** Copia la del paquete con el prefijo `ai-first-` y cambia el `name:` de su frontmatter para que coincida con la carpeta: ```bash cp -r "$origen/i18n" .agents/skills/ai-first-i18n ``` Las demás skills la siguen nombrando `i18n`, así que deja escrita la equivalencia en tu `AGENTS.md` mientras convivan. ## Próximos pasos [Qué deja init en tu repo](/docs/empezar/que-instala/)Cada pieza y quién la lee. [Adaptar las skills](/docs/guias/adaptar-las-skills/)La entrevista y lo que queda por hacer a mano. [Auditar en local y en CI](/docs/guias/auditar-en-local-y-en-ci/)El hook, el flujo de CI y cómo leer lo que reportan. # Agentes compatibles > Cómo leen las skills y el AGENTS.md Claude Code, Codex, Cursor, OpenCode y Kimi Code, y qué hacer con una herramienta que no carga skills. Las skills del paquete siguen el formato del estándar abierto *Agent Skills*: una carpeta por skill con un `SKILL.md` cuyo frontmatter lleva `name` y `description`. Cualquier herramienta que lea ese formato las carga sin cambios. El paquete las documenta para cinco: Claude Code, Codex, Cursor, OpenCode y Kimi Code. ## Una carpeta, dos rutas de lectura `init` instala las skills una sola vez, en `.agents/skills/`, y crea un enlace para la herramienta que no lee esa carpeta: | Agente | Lee las skills desde | Cómo se invoca una skill | | ----------- | ----------------------------------------------------------------- | ---------------------------------------------------- | | Claude Code | `.claude/skills/`, que es un enlace simbólico a `.agents/skills/` | Con `/nombre` | | Codex | `.agents/skills/` | Con `$nombre` | | Cursor | `.agents/skills/` | La carga cuando su descripción coincide con la tarea | | OpenCode | `.agents/skills/` | La carga cuando su descripción coincide con la tarea | | Kimi Code | `.agents/skills/` | La carga cuando su descripción coincide con la tarea | Para Cursor, OpenCode y Kimi Code el paquete no documenta más que eso: que leen `.agents/skills/` de forma nativa y cargan una skill por su descripción. Si tu herramienta tiene una forma explícita de invocarla, está en su propia documentación, no en la del paquete. Cada archivo existe una sola vez: no hay copias que sincronizar. El enlace se versiona en git como enlace, no como copia. ## AGENTS.md y CLAUDE.md `AGENTS.md` lo leen todas las herramientas; ahí `init` deja el bloque que dice qué skill se usa cuándo y dónde escribe cada una. Claude Code lee `CLAUDE.md`, que en esta metodología es una sola línea: ```md @AGENTS.md ``` `init` no escribe `CLAUDE.md`. El molde está en `templates/CLAUDE_MD_TEMPLATE.md` del paquete. ## Windows sin enlaces simbólicos Si tu equipo trabaja en Windows sin enlaces simbólicos habilitados, `.claude/skills` puede ser una copia de `.agents/skills/`. En ese caso, declara en `AGENTS.md` cuál es la fuente y cuál la copia, para que nadie edite la que no es. ## Herramientas sin carga de skills Si tu herramienta no carga skills por su cuenta, guarda los `SKILL.md` como documentos en `docs/` e indícale desde `AGENTS.md` cuándo leer cada uno: ```md ## Documentación especializada - Antes de implementar un feature, leer `docs/protocolos/features.md` - Antes de escribir textos visibles, leer `docs/protocolos/ux-writer.md` ``` Menos elegante que la carga automática, mismo resultado. Nota El paquete no instala hooks del agente, como `PostToolUse` o `Stop`: cada herramienta los configura en su propio formato y quedaron fuera del estándar *Agent Skills*. El hook que deja `init` es de git, `.githooks/pre-push`, y funciona igual con cualquier agente. ## Próximos pasos [Qué deja init en tu repo](/docs/empezar/que-instala/)Las skills, el enlace y el bloque de AGENTS.md, pieza por pieza. [Las 11 skills](/docs/referencia/skills/)Qué hace cada una y cuándo se activa. [Adaptar las skills](/docs/guias/adaptar-las-skills/)Que cada skill conozca tus comandos y tu orden de implementación. # Arrancar un producto desde cero > Cómo llevar una idea o un requerimiento en bruto hasta el PRD, la arquitectura, las specs y la decisión de stack con protocolo-arranque. Tienes una idea, un requerimiento o las notas de una reunión, y todavía no hay PRD ni arquitectura. Quieres que el agente te ayude a definir el producto y que lo que salga quede escrito en el repo, no en un chat. ## Cuándo usarla * Hay una idea o un requerimiento y `docs/` está vacío, o sólo tiene lo que escribió `init`. * Hay que decidir el stack y nadie lo ha registrado. * Un proyecto existente cambió tanto de alcance que su PRD dejó de describirlo. `protocolo-arranque` corre **una vez** por proyecto, o una vez por giro grande de producto. Si el producto ya está definido y vas a construir una parte, es [Desarrollar una feature](/docs/guias/desarrollar-una-feature/). Si vas a modificar algo que ya funciona, incluido un artefacto que este protocolo escribió, es [Cambiar algo que ya funciona](/docs/guias/gestionar-un-cambio/). ## Antes de empezar `protocolo-arranque` no está entre las cinco skills que `init` instala por defecto. Entra de dos maneras: * **Con la entrevista.** En una carpeta vacía y desde una terminal, `init` entrevista sin preguntar, y cuando entrevista instala `protocolo-arranque` junto con las skills que pide el perfil del producto: ```bash npx @falcux/ai-first@latest init ``` * **Sola, en un repo ya inicializado.** Si corriste `init` sin entrevista, agrégala con `--skills`. Instala sólo las que nombras; las que ya estaban no se tocan. ```bash npx @falcux/ai-first@latest init --skills protocolo-arranque ``` Con entrevista, `AI-FIRST.md` declara el perfil —`producto` y `repositorio`— y la skill lo lee para saber qué artefactos escribir. Sin perfil, es lo primero que te pregunta. La entrevista está en [Adaptar las skills](/docs/guias/adaptar-las-skills/). ## Paso a paso 1. **Dale el contexto base.** Pega el mensaje, el documento o las notas tal como estén, y nombra la skill para que el agente la cargue: ```text Usa protocolo-arranque. Este es el requerimiento tal como llegó: [pega aquí el correo, las notas de la reunión o el documento] El cliente ya tiene una base de datos en PostgreSQL que hay que usar. Antes de escribir nada, haz el descubrimiento completo. ``` La skill lee primero `AI-FIRST.md`, `AGENTS.md`, lo que haya en `docs/` y `docs/ADR.md`, para no preguntarte lo que ya está escrito. 2. **Responde el descubrimiento.** Es la Fase 1, y no se genera ningún artefacto hasta que cierra. El agente arma un benchmark de herramientas parecidas, con una línea por cada una, y te dice si lo que quieres construir ya se puede comprar. Después pregunta en tandas, sin límite, por el problema y el éxito, los usuarios, la lógica de negocio, los datos, las integraciones y las restricciones. Si una idea tuya es ineficiente, la skill le pide proponer la alternativa con su porqué. Si la reafirmas, se acata y queda en el ADR con las dos posturas. 3. **Cierra la fase.** Cierra cuando el agente puede decir, sin suponer, qué se construye, para quién, con qué reglas, contra qué datos y cómo se mide el éxito. Te pregunta si falta algo y enumera lo que quedó supuesto. 4. **Deja que genere los artefactos, en orden.** La Fase 2 escribe cada documento desde su template del paquete, en su ruta definitiva: ```text 1. Decisión de stack → fila en docs/ADR.md 2. docs/PRD.md → qué se construye y para quién 3. docs/ARQUITECTURA.md → componentes, límites y el diagrama 4. docs/GUIA_DISENO.md → si el producto tiene interfaz 5. docs/specs/.md → una por módulo, en orden de construcción 6. AI-FIRST.md y AGENTS.md → completar con lo que ahora se sabe ``` El agente no instala nada ni corre generadores de proyecto: deja escritos los comandos de instalación en la fila del ADR o en el PRD. Tampoco escribe las specs de todo el backlog, sólo las de lo que se construye primero. 5. **Revisa la validación final.** La skill comprueba que el PRD y la arquitectura no se contradigan, que cada decisión difícil de revertir tenga su fila, que `AI-FIRST.md` declare las Zonas Prohibidas que la arquitectura hizo evidentes y que las specs listen sus archivos. La última comprobación es el detector: ```bash npx @falcux/ai-first@latest audit ``` 6. **Cierra el tramo.** El arranque se cierra como cualquier otro trabajo, con `protocolo-cierre`. Ver [Cerrar la sesión](/docs/guias/cerrar-la-sesion/). Precaución Si el agente empieza a escribir «se definirá más adelante», si dos artefactos cuentan distinto el mismo flujo o si el PRD crece con features que nadie pidió, la skill manda detener la generación y volver a la Fase 1. ## Qué queda escrito Qué artefactos salen depende del perfil. Todos salen de un template del paquete: | Artefacto | Template | Cuándo | | --------------------------------------------- | ----------------------------------------- | -------------------------------------------------- | | Fila de la decisión de stack en `docs/ADR.md` | — | Siempre | | `docs/PRD.md` | `templates/PRD_TEMPLATE.md` | Siempre | | `docs/ARQUITECTURA.md` | `templates/ARQUITECTURA_TEMPLATE.md` | Siempre | | `docs/specs/.md` | `templates/SPEC_MODULO_TEMPLATE.md` | Una por módulo; en una landing, una sola del sitio | | `docs/GUIA_DISENO.md` | `templates/GUIA_DISENO_TEMPLATE.md` | Con interfaz: saas, landing, movil | | `docs/COMPONENTES.md` | `templates/COMPONENT_LIBRARY_TEMPLATE.md` | Con interfaz: saas, landing, movil | | `docs/TECH_NOTES.md` | `templates/TECH_NOTES_TEMPLATE.md` | Siempre | Además, completa `AI-FIRST.md` con las Zonas Prohibidas —migraciones, infraestructura, secretos— y su razón, y `AGENTS.md` **fuera** de las marcas del bloque que mantiene `init`. En un monorepo la arquitectura describe qué paquete depende de qué; en varios repos, el PRD y la arquitectura viven en uno solo. El registro de sesión, el de cambios y el handoff no son artefactos de arranque: nacen vacíos con `init` y los llenan otras skills. ## Qué vigila el detector * **Artefacto huérfano (P2).** Cada ruta que un artefacto declarado en `AI-FIRST.md` menciona tiene que existir. Por eso, con varios repos, los demás referencian el PRD en prosa y sin ruta: una ruta a otro repo se cobra como huérfana. * **Zona Prohibida tocada (P0).** Sólo vigila las zonas que declares. Las que el arranque hizo evidentes van a `AI-FIRST.md` antes de la primera feature. * **Alcance excedido (P1).** Lee la sección «Archivos» o «Alcance» de la spec activa, con las rutas entre acentos graves. La sección «Archivos del módulo» del template ya tiene ese nombre, sin número delante, por esa razón. * **Inventario de componentes (P2).** Se reporta omitido hasta que `artefactos` declara `inventario_componentes` y `componentes_dir`. El detalle de cada una está en [Las cinco verificaciones](/docs/referencia/verificaciones/). ## Por qué funciona así El stack va primero porque condiciona todo lo demás y es la decisión más cara de revertir, y las specs van al final porque cada una necesita saber en qué capa vive. La cadena completa, y qué pasa cuando se salta un eslabón, está en [La cadena de artefactos](/docs/parte-2/cadena-de-artefactos/). ## Próximos pasos [Desarrollar una feature](/docs/guias/desarrollar-una-feature/)Construir lo que el arranque definió, spec por spec. [Adaptar las skills](/docs/guias/adaptar-las-skills/)La entrevista que fija el perfil y adapta cada skill. [Templates](/docs/apendices/templates/)Los templates de los que sale cada artefacto. # Adaptar las skills a tu proyecto > Qué pregunta la entrevista de init, qué escribe dentro de cada skill, cómo repetirla y cómo instalar más skills. Tienes las skills instaladas y quieres que hablen de tu proyecto: tus comandos, tu secuencia de implementación, tu manifiesto de versión. Una skill copiada sin adaptar ocupa presupuesto de carga y da instrucciones que no aplican. La entrevista de `init` escribe esa adaptación por ti. ## Cuándo usarla * Corriste `init` sin terminal interactiva, o con `--sin-entrevista`, y las skills quedaron con su texto genérico. * Cambió algo que la entrevista pregunta: el comando de verificación, la secuencia de implementación, si trabajas con varios agentes en paralelo. * Quieres instalar skills que no vinieron por defecto. Si lo que falta es definir el producto —PRD, arquitectura, specs—, la entrevista no lo hace: es [Arrancar un producto desde cero](/docs/guias/arrancar-un-producto/). ## Antes de empezar Necesitas una **terminal interactiva**. Sin ella, `init` no entrevista nunca, y `--entrevista` sale con un error en vez de quedarse esperando. Cuándo entrevista `init` por su cuenta: | El proyecto | Qué hace `init` | | -------------------------------------------------------------------------- | --------------------------------------------------------------- | | Sin documentación: sin `AI-FIRST.md`, sin `AGENTS.md`, sin nada en `docs/` | Entrevista sin preguntar | | Ya documentado | Dice qué encontró y ofrece la entrevista; por defecto, la salta | | Sin terminal interactiva, o con `--sin-entrevista` | No entrevista | | Con `--entrevista` | Entrevista aunque el proyecto esté documentado | ## Paso a paso 1. **Corre la entrevista.** Desde la raíz del repo: ```bash npx @falcux/ai-first@latest init --entrevista ``` `init` nunca sobreescribe: lo que ya existe se salta y se reporta. Correrlo otra vez sobre un repo inicializado es seguro. 2. **Responde.** Todas las preguntas traen un valor por defecto entre corchetes, y Enter lo acepta. Varios salen de tu repo: el nombre, los comandos de `package.json`, el manifiesto. | Pregunta | Para qué sirve | | ---------------------------------------------------- | ---------------------------------------------------------------- | | Nombre del proyecto | `AI-FIRST.md` | | Fase: exploración, MVP o producción | La lee quien abre el archivo; no cambia ninguna verificación | | Clase de producto: saas, landing, api, cli, movil | Decide qué skills se instalan y qué artefactos pide el arranque | | Forma del repositorio: único, monorepo, varios repos | El perfil, junto con la anterior | | Comando que decide que el proyecto está sano | Las skills que verifican | | Comando de tipos y de lint, si hay | `protocolo-features` y `test-fix` | | ¿Varios agentes en paralelo? | Si no, la división por agentes se retira de la skill de features | | Archivo que lleva el número de versión | `version-bump` | | Orden en que se implementa una feature | Las opciones dependen de la clase de producto | | Una confirmación por cada Zona Prohibida sugerida | El criterio es el costo de revertir un error ahí | 3. **Lee el reporte.** Cada línea dice `escrito`, `saltado` o `sugerido`. Una skill cuyo bloque no cambió aparece como saltada, con la razón. 4. **Revisa cada skill adaptada.** La adaptación vive bajo el encabezado «Adaptación a tu proyecto» de cada `SKILL.md`, entre `` y ``. Debajo, fuera de las marcas, sigue la lista genérica de la skill: lo que la entrevista no cubre se completa ahí, a mano. Puedes pedirle al agente que te diga qué falta: ```text Lee la sección «Adaptación a tu proyecto» de cada skill en .agents/skills/. Para cada una, dime qué puntos de la lista genérica no responde el bloque que escribió init. No edites nada todavía. ``` 5. **Completa fuera de las marcas.** Lo que agregues fuera sobrevive a la siguiente corrida; lo que edites dentro, no. Por ejemplo, los tests intocables de `test-fix` o quién firma el cierre del descubrimiento en `protocolo-arranque`. ## Qué queda escrito **En cada skill, el bloque entre marcas.** Sólo en las skills para las que la entrevista tiene algo que decir: | Skill | Qué recibe | | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- | | `protocolo-arranque` | El perfil y la tabla de artefactos que le corresponden, con su template | | `protocolo-features` | La secuencia elegida, los comandos, si hay agentes en paralelo y, sin interfaz, qué pasos no aplican | | `test-fix` | Los comandos y cómo delegar la corrida | | `version-bump` | El manifiesto, único sitio donde se escribe el número | | `protocolo-cambios` | Dónde vive el cambio en curso y el comando de verificación; en monorepo o varios repos, cómo cuenta el flujo corto | | `protocolo-cierre` | La tabla de documentos del proyecto y el comando de verificación; si no hay manifiesto, que el paso del bump no aplica | | `protocolo-ux`, `ux-writer`, `ux-audit`, `information-architecture` | El perfil y los documentos de diseño, sólo si el producto tiene interfaz | `i18n` no recibe bloque: la entrevista no pregunta nada que le sirva. **En `AI-FIRST.md`, la fase y el perfil**, cuando `init` crea el archivo. Si ya existía no lo toca, como a cualquier otro archivo: si el perfil cambió, se edita a mano. **Las skills del perfil que falten.** Con entrevista, la selección por defecto deja de ser las cinco de siempre: | Clase de producto | Skills | | ----------------- | --------------------------------------------------------------------------------------- | | saas, movil | Las cinco de base, `protocolo-ux`, `ux-writer`, `ux-audit` e `information-architecture` | | landing | Las cinco de base, `protocolo-ux`, `ux-writer` y `ux-audit` | | api, cli | Las cinco de base | A todas se suma `protocolo-arranque`. Las cinco de base son `protocolo-features`, `protocolo-cambios`, `protocolo-cierre`, `version-bump` y `test-fix`. Las que ya estaban se saltan enteras; el bloque se reescribe en todas las de la selección. ### Instalar más skills `--skills` elige cuáles instalar, separadas por comas, o `todas`: ```bash npx @falcux/ai-first@latest init --skills ux-writer,i18n npx @falcux/ai-first@latest init --skills todas ``` Un nombre que el paquete no trae detiene el comando antes de entrevistar, con la lista de las disponibles. El bloque de `AGENTS.md` se reescribe con lo que quedó instalado. ### Las skills enlazadas no se adaptan Con `--enlazar`, cada skill es un enlace simbólico a la carpeta `skills/` del paquete en vez de una copia. Una skill enlazada **nunca** se adapta: escribir ahí cambiaría la fuente y no tu copia. El reporte la marca como `sugerido` y lo dice. Nota Si una skill del paquete choca con una tuya del mismo nombre, `init` salta la del paquete y no toca la tuya. Las tres salidas posibles están en [Las 11 skills](/docs/referencia/skills/). ## Qué vigila el detector Las skills no son artefactos declarados, así que `audit` no las recorre. Sí recorre `AGENTS.md`, que `init` declara en `artefactos`: el check de **artefacto huérfano (P2)** verifica que existan las rutas y los nombres que menciona, incluidos los de la tabla de skills del bloque. Si borras una skill a mano, vuelve a correr `init` para que el bloque se reescriba con lo que de verdad hay. Ver [Las cinco verificaciones](/docs/referencia/verificaciones/). ## Por qué funciona así Las marcas son el manifiesto: separan lo que escribió la herramienta de lo que escribiste tú, y por eso `init` puede reescribir sin pisar nada. Qué es una skill, cómo nace de un protocolo y por qué se adapta a cada proyecto está en [Skills, hooks y gestión de contexto](/docs/parte-2/skills-hooks-contexto/). ## Próximos pasos [ai-first init](/docs/referencia/init/)Todas las opciones del comando. [Las 11 skills](/docs/referencia/skills/)Qué hace cada skill y cuándo se activa. [Arrancar un producto](/docs/guias/arrancar-un-producto/)Lo que la entrevista no hace: definir el producto. # Desarrollar una feature > Cómo construir un módulo, una página o un endpoint nuevo con protocolo-features y verificarlo con test-fix. Tienes una feature nueva por construir —una página, un módulo, un endpoint, un formulario— y quieres que el agente la implemente sin inventar requerimientos ni salirse del alcance. `protocolo-features` ordena el trabajo antes y durante el código; `test-fix` lo verifica al final. ## Cuándo usarla * Feature nuevo: página, módulo, endpoint, formulario o flujo. * Cualquier implementación que agregue modelos, casos de uso o componentes nuevos. No es para fixes de bugs, cambios cosméticos ni refactors sin comportamiento nuevo: eso es [Cambiar algo que ya funciona](/docs/guias/gestionar-un-cambio/). Si la implementación exige cambiar la arquitectura existente, tampoco: es un cambio, no una feature. ## Antes de empezar `protocolo-features` y `test-fix` vienen en la instalación por defecto. Si todavía no corriste `init`: ```bash npx @falcux/ai-first@latest init ``` Necesitas además una **spec implementable**: qué hace la feature, criterios de aceptación verificables, qué incluye y qué no, y qué módulos usa y cuáles no debe tocar. Si el producto salió de [Arrancar un producto](/docs/guias/arrancar-un-producto/), está en `docs/specs/`. Si no existe, la skill la genera y te pide validarla antes de implementar. ## Paso a paso 1. **Pide la pre-implementación, sin código.** Son siete pasos obligatorios, y el último deja escrita la secuencia: ```text Usa protocolo-features para el módulo de reportes (docs/specs/reportes.md). Haz sólo la pre-implementación: verifica la spec, arma la tabla de reuso, revisa dependencias y deja escrita la secuencia. No escribas código todavía. ``` 2. **Revisa el plan.** Lo que tiene que traer: * La comprobación de **Zonas Prohibidas**: si la feature entra en una, se pide la aprobación o se replantea el enfoque antes de escribir código. * La **tabla de reuso**, con una fila por pieza: reusa, extiende, nueva compartida o nueva local. Toda pieza «nueva local» justifica por qué no se pudo reusar. Sin esta tabla, el plan está incompleto. * Las **dependencias técnicas**: migración, tipos compartidos, endpoints, claves de i18n. * La **secuencia**: qué variante aplica —full-stack, solo-backend o solo-frontend—, qué pasos se omiten y qué comando verifica cada uno. Si alguna fila de la tabla es difícil de revertir —un paquete compartido nuevo, un límite entre capas, una dependencia de producción—, va también como fila en `docs/ADR.md`. 3. **Implementa por capas, de adentro hacia afuera.** El orden por defecto va del schema al dominio, la aplicación, la infraestructura de backend, lo compartido y la interfaz, y después los tests. Si la entrevista de `init` fijó otra secuencia, está en la sección «Adaptación a tu proyecto» de la skill. La regla no cambia: no se avanza si el paso actual no compila o rompe tests. ```text Plan aprobado. Implementa el paso 2 de la secuencia, dominio, y nada más. Cuando compile y los tests existentes pasen, muéstrame el diff y espera. ``` Todo texto visible nuevo pasa por `ux-writer` antes de escribirse. 4. **Verifica con test-fix.** Corre los tests del alcance que tocó la sesión, con la salida filtrada para que al contexto sólo lleguen las fallas: ```text Usa test-fix sobre lo que tocó esta sesión. Unitarios e integración; E2E no por ahora. ``` Cada falla se clasifica. Las **mecánicas** —un mock viejo, un import movido, un campo renombrado— se corrigen sin preguntar. Las **de negocio** —el test espera A, el código da B y no está claro cuál es correcto— te las pregunta con opciones. Hay un máximo de dos rondas; si quedan fallas, reporta con diagnóstico y para. Con el alcance en verde, corre la suite completa, tipos y lint una sola vez. 5. **Pasa los checklists.** Técnico, de UX si hay interfaz, y de completitud. El que más se olvida: **lo que estaba fuera de alcance no se implementó**. 6. **Cierra la sesión.** Con `protocolo-cierre`, antes del commit. Ver [Cerrar la sesión](/docs/guias/cerrar-la-sesion/). Precaución Detén el trabajo y reevalúa si el agente modifica archivos fuera de la spec, si aparecen más de tres archivos que la spec no nombraba o si los tests existentes empiezan a fallar sin razón aparente. Los tests E2E se corren sólo si lo pides, nunca como consecuencia de la parte unitaria. Los tests que protegen una invariante de seguridad o de aislamiento no se ajustan: si fallan, es un incidente. Esos se listan en la adaptación de `test-fix`. ## Qué queda escrito * El código y los tests de la feature, en el orden de la secuencia. * La spec, si no existía y hubo que generarla. * Una fila en `docs/ADR.md` por cada decisión difícil de revertir que salió del plan. * El inventario de componentes al día, en el mismo commit, si se tocó la librería de componentes. `protocolo-features` no escribe el registro de sesión: eso lo hace `protocolo-cierre`. ## Qué vigila el detector * **Zona Prohibida tocada (P0).** Si la feature tocó una zona declarada, el hook pre-push detiene el push. Por eso la skill la comprueba en el paso 1. * **Decisión sin fila en ADR (P1).** Un `package.json` que suma o quita una dependencia de producción, o un archivo de `superficies_de_decision`, sin una fila nueva en el ADR. Se evita escribiendo la fila; si no era decisión, con `` en el cuerpo del commit. * **Alcance excedido (P1).** Por defecto `alcance.spec` apunta a `docs/changes/pending/`, y sin un cambio abierto el check se omite. Si apuntas `alcance.spec` a la spec del módulo, su sección «Archivos del módulo» define el alcance de la sesión. * **Inventario de componentes (P2).** Un componente nuevo en `componentes_dir` que el inventario no menciona, si `AI-FIRST.md` declara las dos claves. El detalle está en [Las cinco verificaciones](/docs/referencia/verificaciones/). ## Por qué funciona así Sin spec, la AI inventa requerimientos; sin secuencia escrita, los pasos se saltan sobre la marcha. El inventario de reuso es el paso que más deuda evita y el que más se salta. El criterio completo está en el [Protocolo de desarrollo de features](/docs/parte-3/protocolo-features/). ## Próximos pasos [Cerrar la sesión](/docs/guias/cerrar-la-sesion/)El registro de sesión, los docs y la versión, antes del commit. [Cambiar algo que ya funciona](/docs/guias/gestionar-un-cambio/)Cuando la feature toca lo que ya existe. [Las 11 skills](/docs/referencia/skills/)protocolo-ux, ux-writer e i18n, que entran cuando hay interfaz. # Cambiar algo que ya funciona > Cómo modificar una feature implementada con protocolo-cambios, su documento CHG y el alcance que el detector compara contra el commit. Tienes algo que ya funciona y tiene que cambiar: un requerimiento que se movió, algo que la AI implementó mal, un patrón que no aguanta en mobile. Quieres cambiarlo sin que el agente lo reconstruya desde cero ni toque lo que no debe. ## Cuándo usarla * Un requerimiento cambia después de implementado. * La AI implementó algo incorrecto y hay que corregirlo. * Un patrón no funciona en la práctica y necesita ajustarse. * Cambian prioridades que afectan features existentes. * Cambia un documento de gobierno, como un artefacto que escribió el arranque. No es para un typo o un botón roto, ni para un refactor que no cambia comportamiento. Una feature nueva que no toca nada existente es [Desarrollar una feature](/docs/guias/desarrollar-una-feature/). ## Antes de empezar `protocolo-cambios` viene en la instalación por defecto, con el molde del documento de cambio dentro, en su carpeta `references/`. `init` deja además la carpeta `docs/changes/pending/`, el registro `docs/changes/CHANGE_LOG.md` y, en `AI-FIRST.md`, la línea que hace que el detector lea el cambio en curso: ```yaml alcance: spec: docs/changes/pending/ ``` Si tu `AI-FIRST.md` ya existía cuando corriste `init`, esa línea no se escribe: el reporte la deja como sugerida y hay que agregarla a mano. ## Paso a paso 1. **Clasifica el cambio.** Hay cuatro tipos —corrección, ajuste de diseño, cambio de requerimiento, cambio de prioridad— y dos flujos: | Flujo | Cuándo | | -------- | ----------------------------------------------------------------- | | Corto | 1–2 archivos, sin cambio de schema | | Completo | 3 o más archivos, cambia el schema o cambian flujos de navegación | Si el cambio toca una Zona Prohibida, se pide la aprobación antes de escribir el documento, no después. 2. **Escribe el CHG antes de tocar código.** Va en `docs/changes/pending/CHG-XXX_nombre.md`, con el número correlativo siguiente, copiado del molde de la skill: ```text Usa protocolo-cambios. El listado de clientes pagina de a 20 y el equipo de ventas necesita filtrar por país. Clasifica el cambio, dime si es flujo corto o completo y escribe el CHG en docs/changes/pending/. No implementes nada. ``` El corazón del documento es el par **estado actual / estado deseado**. Sin el estado actual descrito con precisión, la AI reconstruye el feature en vez de modificarlo. El flujo corto llena Metadata, §1 a §4, §9, §10, §13 y §14; el completo, todo. 3. **Declara los archivos afectados entre acentos graves.** Es lo que el detector compara contra lo que el commit tocó de verdad. El título de la subsección tiene que **empezar** por «Archivos» o «Alcance», sin número delante: ```md ### Archivos afectados - [ ] `src/clientes/listado.ts` — agrega el filtro por país - [ ] `src/clientes/listado.test.ts` — casos del filtro - [ ] `src/clientes/componentes/**` — el selector nuevo ``` 4. **Analiza el impacto en una sesión aparte.** En el flujo completo, una sesión dedicada que no modifica nada: archivos afectados directa e indirectamente, migraciones, tests que van a fallar, contradicciones con `AGENTS.md` o la spec, y lógica existente que cubra parte del cambio. 5. **Implementa por pasos, en una sesión limpia.** Nunca en la misma sesión donde se trabajó en otra cosa. Cada paso toca tres archivos o menos; si no, se subdivide. ```text Vamos a implementar CHG-012 (docs/changes/pending/CHG-012_filtro-pais.md). Implementa SOLO el paso 1. Muéstrame el diff y no avances hasta que confirme. ``` Para un cambio de requerimiento o de prioridad, la skill pide una rama propia: `git checkout -b change/CHG-XXX-nombre`. 6. **Verifica.** Contra el estado deseado del documento, los tests relevantes y, si el cambio tocó la interfaz, el skeleton: es la deriva que más se pierde en el flujo corto. 7. **Cierra.** Actualiza los docs afectados, agrega el resumen a `docs/changes/CHANGE_LOG.md` y **elimina** el archivo de `pending/`. Nota Un cambio que además es una decisión —difícil de revertir, con alternativas reales que se descartaron— lleva también su fila en `docs/ADR.md`, en el mismo commit que el CHG. No es duplicar: el CHG documenta qué cambió y se archiva; el ADR documenta por qué y sobrevive. La §6 del documento hace esa pregunta. ## Qué queda escrito | Archivo | Cuándo | | -------------------------------------------------------------- | ----------------------------------------------------- | | `docs/changes/pending/CHG-XXX_nombre.md` | Al abrir el cambio; se elimina al cerrarlo | | `docs/changes/CHANGE_LOG.md` | Al cerrar: fecha, tipo, archivos, resumen y lecciones | | `docs/ADR.md` | Si la §6 del documento dijo que sí | | La spec del módulo, el PRD, la arquitectura, la guía de diseño | Los que el cambio afectó, al cerrar | Un archivo en `pending/` sin actividad por dos semanas o más se revisa, y si ya no aplica pasa al registro como «Descartado». ## Qué vigila el detector **Alcance excedido (P1)** es el check de esta guía. Con `alcance.spec` apuntando a `docs/changes/pending/`, `audit` toma cada documento de esa carpeta, busca la sección cuyo título empieza por «Archivos» o «Alcance» y extrae las rutas entre acentos graves, con globs. Los archivos tocados que no coinciden con ninguna, por encima de la tolerancia, son un P1. La tolerancia es 0 si `alcance.tolerancia` no la declara. * No cuentan como fuera de alcance `AI-FIRST.md`, la propia carpeta de cambios ni los artefactos declarados en `AI-FIRST.md`. * Los placeholders con `{llaves}` y `XXX` del molde se ignoran. * Sin ningún CHG abierto, el check se reporta **omitido**, no aprobado: no hay alcance que exceder. Con un CHG que no lista rutas, también se omite, y la razón lo dice. Para evitar el hallazgo, declara los archivos en el CHG antes de implementar y, si el trabajo crece, actualiza la lista antes del commit. Si al cerrar no eliminas el documento de `pending/`, sigue contando como cambio abierto en la sesión siguiente. Si el cambio suma una dependencia de producción o toca una superficie de decisión, también aplica **Decisión sin fila en ADR (P1)**. El detalle de los cinco checks está en [Las cinco verificaciones](/docs/referencia/verificaciones/). ## Por qué funciona así Un cambio sin evaluación de impacto es una apuesta: el documento existe para que el humano entienda qué se toca y qué se puede romper antes de que la AI ejecute. El criterio completo está en el [Protocolo de gestión de cambios](/docs/parte-3/protocolo-cambios/). ## Próximos pasos [Cerrar la sesión](/docs/guias/cerrar-la-sesion/)El registro de sesión y la versión, después del cambio. [Las cinco verificaciones](/docs/referencia/verificaciones/)Cómo lee el detector el alcance, con el resto de los checks. [documento-de-cambio.md](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/protocolo-cambios/references/documento-de-cambio.md)El molde completo del CHG, tal como viaja con la skill. # Cerrar la sesión > Cómo cerrar un tramo de trabajo con protocolo-cierre y version-bump, para que la sesión siguiente arranque con el contexto al día. Terminaste un tramo de trabajo con cambios en el código y quieres que la próxima sesión, tuya o de otro, lo retome sin reconstruir qué pasó. `protocolo-cierre` documenta la sesión; `version-bump` decide el número de versión que viaja en el mismo commit. ## Cuándo usarla * Al terminar una sesión de implementación de features. * Al terminar una corrección de bugs que modificó comportamiento. * Al terminar una sesión de gestión de cambios. * Al terminar un refactor que afectó la arquitectura. No hace falta en sesiones exploratorias sin cambios de código, en fixes de typos ni en sesiones de sólo lectura. Si todavía no verificaste los tests, eso va antes: `test-fix`, en [Desarrollar una feature](/docs/guias/desarrollar-una-feature/). ## Antes de empezar Las dos skills vienen en la instalación por defecto, y `init` deja el registro que el cierre escribe, `docs/SESSION_LOG.md`, vacío y con su cabecera. Para que `version-bump` clasifique bien, el proyecto necesita commits convencionales —`feat:`, `fix:`, `docs:`—; sin ellos, la clasificación cae en leer el diff, que es más lento y menos confiable. El cierre tiene tres fases, y sólo la primera es del agente: | Fase | Quién | | -------------- | --------------------------------- | | A — Documentar | El agente, con `protocolo-cierre` | | B — Verificar | El humano, no delegable | | C — Commit | El humano, no delegable | ## Paso a paso 1. **Pide la Fase A.** Antes del commit: ```text Usa protocolo-cierre para cerrar esta sesión. No hagas commit. ``` El agente reúne el contexto objetivo con `git diff --name-only HEAD`, `git status --short` y `git log --oneline -10`, y lee las últimas dos entradas del registro de sesión y el registro de cambios. Lo que no aparece en el diff no pasó. 2. **Deja que revise las migraciones.** Si el schema cambió y no hay migración nueva, lo avisa en el reporte como bloqueante suave. No la ejecuta por su cuenta. 3. **Revisa la entrada del registro.** Va al tope de `docs/SESSION_LOG.md`, con el número de sesión siguiente: resumen, cambios por área, validación y pendientes. Si un check no se corrió, dice «no ejecutado», nunca un PASS inventado. 4. **Revisa los docs que tocó.** Sólo los que la sesión afectó: `AGENTS.md` si cambió una regla activa, `docs/ADR.md` si hubo una decisión, el inventario de componentes si se tocó uno compartido, el registro de cambios si un cambio se completó. Los aprendizajes van a **un** destino según su tipo, no a todos. 5. **Decide la versión.** El cierre clasifica la sesión y, si amerita bump, pasa a `version-bump`: ```text Usa version-bump. Analiza los commits desde el último tag y recomiéndame el bump. No apliques nada hasta que confirme. ``` La regla del máximo manda: un solo commit MAJOR en el rango gana sobre cualquier cantidad de PATCH. Sin tu confirmación explícita, no aplica nada. Con ella, actualiza todos los manifiestos a la misma versión y fecha la entrada del CHANGELOG en ese mismo commit. 6. **Haz la Fase B.** El reporte termina con tu lista: si el resumen refleja lo que hiciste, si los docs son precisos, si los aprendizajes son reales, si pasa la suite completa, si quedó algo sin documentar y, si hubo bump, si las versiones quedaron sincronizadas. 7. **Haz la Fase C.** Un commit con el código y los docs juntos. Después, el tag lo creas tú, con el número que confirmaste: ```bash git tag v0.Y.Z && git push origin v0.Y.Z ``` Precaución El tag va después del commit de cierre, nunca antes. Un tag creado antes apunta a un commit que no tiene los manifiestos actualizados. Por eso `version-bump` no lo crea. ## Qué queda escrito | Archivo | Quién lo escribe | | ----------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | | `docs/SESSION_LOG.md` | `protocolo-cierre`, una entrada nueva al tope | | `AGENTS.md`, `docs/ADR.md`, guía de diseño, inventario de componentes, arquitectura | `protocolo-cierre`, sólo los que la sesión afectó | | `docs/TECH_NOTES.md` | `protocolo-cierre`, si el aprendizaje es una cicatriz de stack | | `docs/changes/CHANGE_LOG.md` | `protocolo-cierre`, si un cambio se completó; el CHG sale de `pending/` | | Los manifiestos, como `package.json` | `version-bump`, tras tu confirmación | | La entrada del CHANGELOG | `version-bump`, con la fecha del bump | Ninguna de las dos toca código ni hace commits. ## Qué vigila el detector * **Decisión sin fila en ADR (P1).** Si la sesión sumó o quitó una dependencia de producción, o tocó una superficie de decisión, el ADR tiene que ganar una fila en el mismo rango. El detector la reconoce por su encabezado, `## ADR-NNN` o `### ADR-NNN`. Si el cambio no era una decisión, se silencia con `` en el cuerpo del commit; esa anotación sólo se lee en modo rango, con `--base`. * **Artefacto huérfano (P2).** Si el cierre nombra en `AGENTS.md` o en el ADR un archivo que ya no existe, se reporta. El registro de sesión no se declara como artefacto: es cronología, y nombra con razón cosas que ya se retiraron. * **Alcance excedido (P1).** Si el CHG del cambio que cerraste sigue en `pending/`, el detector lo sigue leyendo como abierto. El detalle de cada una está en [Las cinco verificaciones](/docs/referencia/verificaciones/). ## Por qué funciona así La AI puede describir lo que hizo, pero no puede juzgar si está bien, y un commit es una firma que tiene dueño: por eso sólo la Fase A se delega. El criterio completo está en el [Protocolo de cierre de sesión](/docs/parte-3/protocolo-cierre/). ## Próximos pasos [Auditar en local y en CI](/docs/guias/auditar-en-local-y-en-ci/)Lo que corre en el push, después del commit de cierre. [Las 11 skills](/docs/referencia/skills/)protocolo-cierre y version-bump, con las demás. [Protocolo de cierre de sesión](/docs/parte-3/protocolo-cierre/)El capítulo del manual. # Auditar en local y en CI > Cómo funciona el punto de control que deja init, el hook pre-push y el flujo de GitHub Actions, y cómo correr el detector en otro CI o desde una herramienta. Tienes el proyecto inicializado y quieres que la entropía documental se mida sola, sin depender de que alguien se acuerde de correr `audit`. `init` deja escrito el punto de control: el mismo detector en dos sitios, con tolerancias distintas. | Dónde | Cuándo corre | Qué lo detiene | | -------------------------------------- | --------------------------------- | ------------------------------------ | | Hook de git `.githooks/pre-push` | En cada `git push`, en tu máquina | Sólo un P0 | | Flujo `.github/workflows/ai-first.yml` | En cada pull request | Cualquier hallazgo, con `--estricto` | ## Cuándo usarla * Acabas de correr `init` y quieres entender qué dejó en el push y en los pull requests. * Tu CI no es GitHub Actions y necesitas el comando para montarlo. * Quieres leer el resultado desde otra herramienta, o guardarlo en `AI-FIRST.md`. Si lo que quieres es evitar un hallazgo concreto, la guía del flujo que lo produce lo explica: [Cambiar algo que ya funciona](/docs/guias/gestionar-un-cambio/) para el alcance, [Cerrar la sesión](/docs/guias/cerrar-la-sesion/) para la fila del ADR. ## Antes de empezar `init` escribe los dos por defecto. `--sin-hook` y `--sin-ci` los omiten, y `--hook-local` deja el hook en `.git/hooks/`, que no viaja en el clon, en vez de `.githooks/`, que sí viaja y se revisa en un PR. El hook no baja nada de la red: usa el detector del proyecto, el del `PATH` o el que `npx` ya tenga en su caché. Para que siempre lo encuentre, instálalo como dependencia de desarrollo: ```bash pnpm add -D @falcux/ai-first ``` ## Paso a paso 1. **Corre el detector a mano una vez.** Sin opciones, compara el árbol de trabajo contra `HEAD`: ```bash npx @falcux/ai-first@latest audit ``` Un repo recién inicializado, sin cambios: ```text ai-first audit — demo árbol de trabajo contra HEAD · 0 archivos tocados ✓ Zona Prohibida tocada ✓ Decisión sin fila en ADR – Alcance excedido — omitido: no hay ninguna spec activa en docs/changes/pending/ ✓ Artefacto huérfano – Inventario de componentes desactualizado — omitido: faltan «artefactos.inventario_componentes» o «artefactos.componentes_dir» Entropía: 0 / 100 (0 P0 · 0 P1 · 0 P2) ``` Un check omitido no es un check aprobado: le falta lo que necesita para correr, y la razón lo dice. 2. **Mira qué hace el hook.** `init` lo escribe en `.githooks/pre-push` y apunta `core.hooksPath` a esa carpeta. En cada push, toma como base lo que el remoto ya tiene y corre `audit --base` sobre ese rango; si la rama todavía no existe en el remoto, corre contra el árbol de trabajo. Corre **sin `--estricto`**: un P1 o un P2 se imprimen y el push sigue. Un P0 lo detiene. Así se ve uno, en el mismo repo después de tocar `.env.local`: ```text ai-first audit — demo árbol de trabajo contra HEAD · 2 archivos tocados ✗ Zona Prohibida tocada P0 Zona Prohibida «.env*» tocada — credenciales .env.local ✓ Decisión sin fila en ADR – Alcance excedido — omitido: no hay ninguna spec activa en docs/changes/pending/ ✓ Artefacto huérfano – Inventario de componentes desactualizado — omitido: faltan «artefactos.inventario_componentes» o «artefactos.componentes_dir» Entropía: 40 / 100 (1 P0 · 0 P1 · 0 P2) ``` Si no encuentra `node` o el detector, avisa y deja pasar el push: no encontrarse a sí mismo no es motivo para frenar a nadie. 3. **Sáltalo cuando haga falta.** Si el push tiene que salir igual, lo decides tú: ```bash git push --no-verify ``` El hook no lo combate. El detector informa; la disciplina es del equipo. 4. **Revisa el flujo de CI.** Es el archivo que escribe `init`, tal cual: ```yaml # El punto de control de la metodología AI-First, en integración continua. # # Lo escribe `ai-first init`. A diferencia del hook local, éste corre **con # `--estricto`**: acá el corte por P1 y P2 sí se quiere, porque hay un humano # revisando y el costo de parar es un rebote, no una interrupción. name: ai-first on: pull_request: jobs: auditar: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: # El detector compara contra la rama base: sin historia no hay rango. fetch-depth: 0 - uses: actions/setup-node@v4 with: node-version: 22 - name: Entropía documental run: npx --yes @falcux/ai-first audit --base "origin/${{ github.base_ref }}" --estricto ``` Tres cosas sostienen el paso. `fetch-depth: 0` trae la historia: sin ella, la rama base no existe en el checkout y `audit` sale con código 2, avisando que la ref no existe en el repositorio. `--base` compara el rango de la rama base a `HEAD`, que es lo que el pull request agrega. `--estricto` hace que un P1 o un P2 también fallen el paso. 5. **Móntalo en otro CI, si no usas GitHub.** El paso es el mismo comando, con Node 22.12 o superior, la historia completa del repo y la rama base del pull request o merge request: ```bash npx --yes @falcux/ai-first@latest audit --base "origin/" --estricto ``` Precaución Un `core.hooksPath` ya configurado —por husky, lefthook u otro gestor de hooks— no se pisa: el reporte de `init` lo marca como `sugerido` y te dice que muevas el hook a esa carpeta o cambies la configuración. Cambiarlo apagaría los hooks que ya tenías. ### Los códigos de salida | Código | Cuándo | | ------ | ----------------------------------------------------------------------------------- | | 0 | Sin hallazgos, o sólo P1 y P2 sin `--estricto` | | 1 | Cualquier P0, o cualquier hallazgo con `--estricto` | | 2 | Error de uso: no es un repo git, no hay `AI-FIRST.md`, la ref de `--base` no existe | ### Para una herramienta: `--json` Con `--json`, la misma información sale en JSON. Es la salida real del ejemplo del P0 de arriba: ```json { "proyecto": "demo", "modo": "arbol", "cambiados": [ ".env.local", "src/a.ts" ], "resultados": [ { "check": "zona-prohibida", "estado": "hallazgos", "hallazgos": [ { "severidad": "P0", "ruta": ".env*", "mensaje": "Zona Prohibida «.env*» tocada — credenciales", "detalle": [ ".env.local" ] } ] }, { "check": "decision-sin-adr", "estado": "aprobado" }, { "check": "alcance-excedido", "estado": "omitido", "razon": "no hay ninguna spec activa en docs/changes/pending/" }, { "check": "artefacto-huerfano", "estado": "aprobado" }, { "check": "inventario-componentes", "estado": "omitido", "razon": "faltan «artefactos.inventario_componentes» o «artefactos.componentes_dir»" } ], "conteo": { "p0": 1, "p1": 0, "p2": 0 }, "entropia": 40, "codigoDeSalida": 1 } ``` `modo` es `arbol` sin `--base` y `rango` con ella. El código de salida del proceso es el mismo que `codigoDeSalida`. ### Para guardar la lectura: `--registrar` `--registrar` escribe el resultado en el bloque `auditoria` del frontmatter de `AI-FIRST.md`: la fecha, la entropía y el conteo de P0, P1 y P2. Sólo lo escribe cuando lo pides, y sólo reemplaza ese bloque, sin tocar el resto del frontmatter. Como cualquier cambio del repo, queda en la historia si lo commiteas. ```bash npx @falcux/ai-first@latest audit --registrar ``` ## Qué queda escrito | Archivo | Qué es | | -------------------------------------- | ----------------------------------------------------------------- | | `.githooks/pre-push` | El hook, ejecutable; con `--hook-local`, en `.git/hooks/pre-push` | | `core.hooksPath` | La configuración local de git que apunta a `.githooks/` | | `.github/workflows/ai-first.yml` | El flujo de GitHub Actions | | El bloque `auditoria` de `AI-FIRST.md` | Sólo con `--registrar` | ## Qué vigila el detector Esta guía es el detector: los cinco checks corren en los dos sitios. Lo que cambia es qué detiene el trabajo. En el hook, sólo **Zona Prohibida tocada (P0)**. En CI, también **Decisión sin fila en ADR** y **Alcance excedido** (P1), y **Artefacto huérfano** e **Inventario de componentes** (P2). El puntaje es `min(100, 40·P0 + 20·P1 + 8·P2)`: más alto es peor. Qué detecta cada uno y cómo se evita está en [Las cinco verificaciones](/docs/referencia/verificaciones/). ## Por qué funciona así Un hook que bloquea por todo se desinstala, y con él se van los cinco checks. En el push se interrumpe a una persona en medio de su trabajo, y sólo lo justifica un P0; en un pull request hay un humano revisando, y el costo de parar es un rebote. Los instrumentos que el detector verifica están en [Gobierno del contexto](/docs/parte-2/gobierno-del-contexto/); cómo se adopta el método en un equipo, fase por fase, en [Escalar al equipo y costos](/docs/parte-4/escalar-y-costos/). ## Próximos pasos [ai-first audit](/docs/referencia/audit/)Todas las opciones, el puntaje y los códigos de salida. [Las cinco verificaciones](/docs/referencia/verificaciones/)Qué detecta cada check y con qué severidad. [El formato de AI-FIRST.md](/docs/referencia/ai-first-md/)Las claves que el detector lee. # Solución de problemas > Los problemas conocidos de init, audit y el hook de pre-push, cada uno con su síntoma, su causa y qué hacer. Los problemas que se conocen con `@falcux/ai-first` 0.5.1, cada uno con el síntoma que ves, la causa y qué hacer. Si el tuyo no está, revisa primero qué versión corres con `npx @falcux/ai-first@latest --version`. ## El hook dice que no encuentra node **Síntoma.** Al hacer push aparece esto y el push sigue sin auditar: ```text ai-first: no encuentro node, así que el punto de control no corrió. Si empujas desde un cliente gráfico, arráncalo desde una terminal o deja node en /usr/local/bin. ``` **Causa.** Un push lanzado desde un cliente gráfico, un IDE o un servicio del sistema no hereda el PATH de tu shell, que es donde nvm, Homebrew o fnm dejan `node`. El hook lo busca en `/opt/homebrew/bin`, `/usr/local/bin` y en `nvm.sh`; si aun así no aparece, avisa y deja pasar. No encontrar `node` nunca frena un push. **Qué hacer.** Arranca el cliente desde una terminal, para que herede su PATH, o deja `node` en `/usr/local/bin`. Hasta entonces, el CI sigue auditando cada pull request. ## El hook dice que ai-first no está instalado **Síntoma.** ```text ai-first: no está instalado, así que el punto de control no corrió. Instálalo con «pnpm add -D @falcux/ai-first» o quita este hook. ``` **Causa.** El hook no descarga nada. Busca el `ai-first` de `node_modules`, luego el del PATH, y sólo usa `npx --no-install` si el paquete ya está en la caché de npx. Si no encuentra ninguno, avisa y deja pasar. **Qué hacer.** Instálalo como dependencia de desarrollo, como sugiere el mensaje, para que todo el equipo corra la misma versión. ## init reporta «saltado» o «sugerido» **Síntoma.** El reporte de `init` trae líneas como éstas: ```text saltado AI-FIRST.md (ya existe) saltado AGENTS.md (el bloque ya está al día) sugerido core.hooksPath — ya apunta a .husky; mueve el hook ahí o cambia la configuración a .githooks ``` **Causa.** `init` nunca sobreescribe. `saltado` es algo que ya existía y no se tocó; no es un error. `sugerido` es algo que haría falta cambiar en un archivo o una configuración tuya: en vez de cambiarlo, te dice qué agregar. Una skill cuya carpeta ya existe se salta entera. **Qué hacer.** Lee la razón de cada `sugerido` y aplícala a mano si te sirve. Si quieres la versión del paquete de algo que se saltó, borra la tuya y vuelve a correr `init`: sólo escribe lo que falta. Si una skill chocó con una tuya del mismo nombre, las salidas están en [Adoptar en un proyecto existente](/docs/empezar/proyecto-existente/#si-un-nombre-ya-est%C3%A1-ocupado). ## core.hooksPath ya estaba configurado **Síntoma.** El push no pasa por el hook de ai-first, y el reporte de `init` dijo: ```text sugerido core.hooksPath — ya apunta a .husky; mueve el hook ahí o cambia la configuración a .githooks ``` **Causa.** El repo ya usaba husky, lefthook u otra carpeta de hooks. `init` escribió `.githooks/pre-push`, pero no cambió `core.hooksPath`: hacerlo habría apagado los hooks que ya tenías. Git sigue leyendo la carpeta anterior. **Qué hacer.** Una de dos: mueve el contenido de `.githooks/pre-push` al `pre-push` de la carpeta que ya usas, o apunta git a `.githooks` si ya no necesitas la otra: ```bash git config core.hooksPath .githooks ``` ## audit sale con código 1 **Síntoma.** `audit` termina con código 1 y el hook frena el push, o el check del pull request queda en rojo. ```text ai-first audit — demo árbol de trabajo contra HEAD · 2 archivos tocados ✗ Zona Prohibida tocada P0 Zona Prohibida «.env*» tocada — credenciales .env.local ✓ Decisión sin fila en ADR – Alcance excedido — omitido: no hay ninguna spec activa en docs/changes/pending/ ✓ Artefacto huérfano – Inventario de componentes desactualizado — omitido: faltan «artefactos.inventario_componentes» o «artefactos.componentes_dir» Entropía: 40 / 100 (1 P0 · 0 P1 · 0 P2) ``` **Causa.** Hay al menos un P0: se tocó una Zona Prohibida. Sin `--estricto`, es lo único que hace salir con 1. Con `--estricto`, que es como corre el flujo de CI, también sale con 1 ante cualquier P1 o P2. **Qué hacer.** Si el cambio en la zona fue un error, reviértelo. Si fue deliberado y aprobado, la zona está bien declarada y el hallazgo cumplió su función: decide con tu equipo si se publica. Si la zona no debía serlo, quítala de `zonas_prohibidas` en `AI-FIRST.md`. Qué significa cada hallazgo está en [Las cinco verificaciones](/docs/referencia/verificaciones/). ## audit sale con código 2 **Síntoma.** `audit` o `init` terminan con código 2 y un mensaje que empieza por `ai-first:`, por ejemplo: ```text ai-first: No hay AI-FIRST.md en /ruta/a/tu/proyecto. ``` **Causa.** El código 2 es un error de uso, no un hallazgo: no hay `AI-FIRST.md`, su formato no se puede leer, la carpeta no es un repositorio git, la ref de `--base` no existe, dos opciones se contradicen, se pidió una skill que el paquete no trae o el bloque de `AGENTS.md` tiene una marca sin su pareja. Una opción desconocida también sale con 2, aunque con una traza de Node en vez de un mensaje propio. **Qué hacer.** Lee el mensaje: dice qué falta. Si no hay `AI-FIRST.md`, corre `npx @falcux/ai-first@latest init`. Para ver las opciones válidas, `npx @falcux/ai-first@latest --help`. ## Un check aparece como omitido **Síntoma.** Una línea empieza con `–` y dice «omitido»: ```text – Alcance excedido — omitido: no hay ninguna spec activa en docs/changes/pending/ – Inventario de componentes desactualizado — omitido: faltan «artefactos.inventario_componentes» o «artefactos.componentes_dir» ``` **Causa.** El check no tenía con qué correr. Omitido no es aprobado: no se verificó nada, y la razón dice qué falta. Alcance se omite mientras no haya un cambio abierto en `docs/changes/pending/`, que es lo correcto. Inventario se omite mientras `AI-FIRST.md` no declare el inventario y la carpeta de componentes. **Qué hacer.** Nada, si el proyecto no tiene eso. Si lo tiene, declara lo que la razón pide en `AI-FIRST.md`. Si hay componentes, `init` deja las dos líneas comentadas bajo `artefactos`, listas para descomentar. ## Un P1 por «Decisión sin fila en ADR» que no es una decisión **Síntoma.** Tocaste una superficie de decisión o cambiaste las dependencias de producción de un `package.json`, no era una decisión arquitectónica, y aparece un P1. Así se ve tras agregar una dependencia: ```text ai-first audit — nuevo árbol de trabajo contra HEAD · 1 archivo tocado ✓ Zona Prohibida tocada ✗ Decisión sin fila en ADR P1 Hay señales de decisión arquitectónica y ADR.md no ganó ninguna fila package.json: +zod Silenciar: agregar la fila al ADR, o «» en el cuerpo del commit. – Alcance excedido — omitido: no hay ninguna spec activa en docs/changes/pending/ ✓ Artefacto huérfano – Inventario de componentes desactualizado — omitido: faltan «artefactos.inventario_componentes» o «artefactos.componentes_dir» Entropía: 20 / 100 (0 P0 · 1 P1 · 0 P2) ``` Sin `--estricto` el código de salida es 0: el P1 avisa, no frena. **Causa.** El check es una heurística: una superficie tocada, o una dependencia de producción agregada o quitada, se presume decisión. A veces no lo es, como cambiar un número de versión en un archivo de configuración. **Qué hacer.** Si era una decisión, agrega la fila al ADR. Si no, escribe esta anotación en el cuerpo del commit: ```text ``` Por ejemplo: ```bash git commit -m "chore: sube la version en la configuracion" -m "" ``` La anotación sólo se lee en modo rango, con `--base`: es como corren el flujo de CI y el hook cuando la rama ya existe en el remoto. En modo árbol de trabajo no hay commits donde buscarla; ahí el P1 se imprime pero no frena nada salvo con `--estricto`. No quites la superficie de `superficies_de_decision` para silenciarlo: ahí viven las decisiones reales. ## Necesito publicar sin pasar por el hook **Síntoma.** El hook frena un push que tienes que hacer igual. **Causa.** El hook corre `audit` sin `--estricto`, así que lo frena un P0 —una Zona Prohibida tocada— o un error de uso con código 2, como un `AI-FIRST.md` que no se puede leer. El mensaje de `audit` dice cuál de los dos. **Qué hacer.** Si es deliberado: ```bash git push --no-verify ``` Precaución `--no-verify` salta el hook, no el flujo de CI: el pull request se audita igual, con `--estricto`. El detector informa; la disciplina es del equipo. ## Relacionado [ai-first audit](/docs/referencia/audit/)Modos, opciones y códigos de salida. [Auditar en local y en CI](/docs/guias/auditar-en-local-y-en-ci/)El hook, el flujo de CI y cómo leer lo que reportan. [Novedades](/docs/novedades/)Qué cambió en cada versión publicada. # ai-first init > Qué escribe init, sus opciones, qué skills instala, cómo reporta lo que ya existía y cómo funciona la entrevista. `init` deja un repositorio listo para la metodología en un comando: escribe `AI-FIRST.md` y los registros que los protocolos asumen, instala las skills, monta el punto de control y mantiene un bloque en `AGENTS.md`. Nunca sobreescribe: lo que ya existe se salta y se reporta. ## Uso ```text ai-first init [--raiz ] [--enlazar] [--skills |todas] [--entrevista | --sin-entrevista] [--sin-hook] [--hook-local] [--sin-ci] ``` Para correrlo sin instalar nada, desde la raíz del proyecto: ```bash npx @falcux/ai-first@latest init ``` El `@latest` importa: si alguna vez corriste una versión anterior, `npx` puede reutilizar la que guardó en su caché sin preguntarle al registro. Y el subcomando también: `npx @falcux/ai-first` a secas sólo imprime la ayuda. ## Qué escribe En este orden, que es también el del reporte: 1. **`.git/`**, sólo si la carpeta todavía no era un repositorio: corre `git init` y sigue. No crea commits. 2. **`AI-FIRST.md`**, con lo que encontró el escaneo: Zonas Prohibidas sugeridas, superficies de decisión y documentos existentes. El formato está en [El formato de AI-FIRST.md](/docs/referencia/ai-first-md/). 3. **`docs/ADR.md`**, vacío salvo por su cabecera y el molde de una fila entre comentarios. Si el repo ya tiene `ADR.md` o `docs/ADR.md`, se usa ése. 4. **`docs/SESSION_LOG.md`** y **`docs/changes/CHANGE_LOG.md`**, con su cabecera, y **`docs/changes/pending/`**, que se crea con un `.gitkeep`. 5. **Las skills**, cada una en `.agents/skills//`. Cuáles, en [Qué skills instala](#qu%C3%A9-skills-instala). 6. **La adaptación de cada skill**, sólo si hubo entrevista: un bloque dentro de su sección «Adaptación a tu proyecto». 7. **`.claude/skills`**, un enlace simbólico relativo a `.agents/skills/` para que Claude Code las lea. 8. **El hook de git**: `.githooks/pre-push`, ejecutable, y `core.hooksPath` apuntando a `.githooks` en la configuración local del repo. Con `--hook-local` va a `.git/hooks/pre-push` y la configuración no se toca. 9. **`.github/workflows/ai-first.yml`**, el flujo de integración continua. 10. **El bloque de `AGENTS.md`**, entre `` y ``: qué skills hay instaladas, cuándo se invoca cada una y dónde escribe cada una. Si `AGENTS.md` no existe, lo crea con una cabecera mínima que apunta al template. La configuración de git que toca es sólo la del repo, y sólo `core.hooksPath` cuando estaba vacía. La global del usuario, nunca. ### Qué busca el escaneo `init` no pregunta lo que puede deducir. Mira los archivos que git conoce, seguidos o nuevos no ignorados: | Qué | Dónde lo busca | Qué hace con ello | | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | | Nombre del proyecto | `name` de `package.json`, sin el scope; si no hay, el nombre de la carpeta | `proyecto` | | Comando de verificación | Los scripts `build` y `test` de `package.json`, con el gestor que indique el lockfile | `verificacion`; sin scripts, queda comentado | | Zonas Prohibidas | `migrations/`, `prisma/migrations/`, `supabase/migrations/`, `db/migrations/`, `infra/`, `terraform/` y `LICENSE`, si existen. `.env*` se sugiere siempre | `zonas_prohibidas`, con una razón por defecto que tienes que revisar | | Superficies de decisión | `**/*.config.*`, `**/schema.prisma`, `pnpm-workspace.yaml`, `turbo.json`, `Dockerfile`, `docker-compose*.yml`, `wrangler.*`, `vercel.json`, `netlify.toml`, `.github/workflows/*.yml`, si alguno coincide | `superficies_de_decision`; sin coincidencias, queda comentado | | Documentos | `AGENTS.md`, `ARQUITECTURA.md`, `GUIA_DISENO.md`, `TECH_NOTES.md`, `SESSION_LOG.md`, `CHANGE_LOG.md`, `COMPONENT_LIBRARY.md` y sus variantes, en la raíz o en `docs/` | `artefactos`, más `adr` y `agents` siempre | | Carpeta de componentes | `src/components/`, `components/`, `app/components/`, `packages/ui/src/components/` | Deja comentadas las dos claves del check 5 para que las actives tú | Nota `init` declara `agents` y `adr` como artefactos, pero no el registro de sesión ni el de cambios aunque los escriba: son cronología, nombran archivos que ya se retiraron, y la verificación de artefactos huérfanos los cobraría para siempre. ## Opciones | Opción | Qué hace | Por defecto | | ------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | | `--raiz ` | Raíz del repositorio. | El directorio actual | | `--enlazar` | Instala las skills como enlaces simbólicos relativos a la carpeta `skills/` del paquete, en vez de copiarlas. Para el repo del paquete y para quien lo vendoriza en un monorepo. Una skill enlazada nunca se adapta. | Copia | | `--skills ` | Cuáles instalar, separadas por comas, o `todas`. Un nombre que el paquete no trae detiene el comando antes de instalar nada. | Ver [Qué skills instala](#qu%C3%A9-skills-instala) | | `--entrevista` | Entrevista aunque el proyecto ya esté documentado. Necesita una terminal interactiva. | Entrevista sólo si el proyecto no tiene documentación | | `--sin-entrevista` | No entrevista nunca, ni en un repo vacío. | — | | `--sin-hook` | No escribe el hook de git ni toca `core.hooksPath`. | Escribe el hook | | `--hook-local` | El hook va a `.git/hooks/`, que no viaja en el clon, y la configuración del repo no se toca. | `.githooks/`, que sí viaja y se revisa en un PR | | `--sin-ci` | No escribe el flujo de integración continua. | Lo escribe | `--entrevista` y `--sin-entrevista` se contradicen, igual que `--sin-hook` y `--hook-local`: pasar las dos de un par sale con 2. ## Qué skills instala | Situación | Qué instala | | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | | Sin `--skills` y sin entrevista | Las cinco que no piden interfaz: `protocolo-features`, `protocolo-cambios`, `protocolo-cierre`, `version-bump` y `test-fix` | | Sin `--skills`, con entrevista | Las que pide el perfil del producto, más `protocolo-arranque` | | `--skills todas` | Las once | | `--skills protocolo-ux,i18n` | Exactamente ésas, con o sin entrevista | Lo que pide cada perfil, según la respuesta a «¿Qué clase de producto es?»: | Producto | Skills | | --------------- | --------------------------------------------------------------------------------------- | | `saas`, `movil` | Las cinco de base, `protocolo-ux`, `ux-writer`, `ux-audit` e `information-architecture` | | `landing` | Las cinco de base, `protocolo-ux`, `ux-writer` y `ux-audit` | | `api`, `cli` | Las cinco de base | `i18n` no la instala ningún perfil: entra sólo con `--skills`. `protocolo-arranque` entra con la entrevista porque es la skill que se usa una vez, al principio; en un repo ya definido sobra. El catálogo completo está en [Las 11 skills](/docs/referencia/skills/). ## Nunca sobreescribe Ni archivos, ni carpetas, ni enlaces. Cada ítem del reporte termina en uno de tres estados: | Estado | Qué significa | | ---------- | --------------------------------------------------------------------------------- | | `escrito` | No existía y se creó. | | `saltado` | Ya existía y no se tocó. Si la razón no es «ya existe», se dice entre paréntesis. | | `sugerido` | Hacía falta escribir en algo que ya existía. No se escribe: se dice qué añadir. | Los casos concretos: * **Una skill que ya existe se salta entera.** No se fusiona nada dentro de su carpeta. * **`AI-FIRST.md` existente** se salta. Si le falta `alcance.spec`, se reporta como sugerido con la línea que falta; si ya la tiene, como saltado. * **`.claude/skills`** se salta si ya hay algo ahí. Si es un directorio real y no un enlace, se dice: crear el enlace dentro habría dejado un `.claude/skills/skills` que no lee nadie. * **`core.hooksPath` ya configurado** con otra carpeta, por ejemplo la de husky o lefthook, no se pisa: queda sugerido, con la carpeta a la que apunta. * **Una skill instalada con `--enlazar`** no se adapta: queda sugerida, porque escribir ahí cambiaría la carpeta del paquete y no tu copia. * **`AGENTS.md`** es la excepción razonada: su bloque se reescribe en cada corrida, pero **sólo lo que está entre las marcas**. Fuera de ellas no cambia una letra. Si el bloque ya está al día, se reporta saltado. Una marca sin su pareja, o las dos al revés, detiene el comando: un bloque roto se arregla a mano. Correrlo dos veces deja el repo igual. ## La entrevista Pregunta lo que no se puede deducir y lo escribe donde corresponde. Nada de ella llama a un modelo: definir el producto —PRD, arquitectura, specs— es trabajo de la skill `protocolo-arranque`, que corre tu agente. ### Cuándo se entrevista * **Un proyecto sin documentación** se entrevista sin preguntar. * **Un proyecto documentado** recibe la oferta, con saltarla como valor por defecto (`[s/N]`). Cuenta como documentado si git ya conoce `AI-FIRST.md`, `AGENTS.md` o algún `.md` bajo `docs/`, sin contar los que escribe el propio `init`. * **Con `--entrevista`** se entrevista siempre; **con `--sin-entrevista`**, nunca. * **Sin terminal interactiva**, como en integración continua, no se entrevista nunca, y el reporte lo dice con la línea `Sin entrevista: no hay terminal interactiva.` Todo lo que puede fallar por uso —un nombre de skill que no existe, un bloque roto en `AGENTS.md`— se comprueba antes de la primera pregunta. Si cancelas a mitad, con Ctrl+C o Ctrl+D, no se escribe nada más; lo único que puede haber quedado es el `git init` de una carpeta que no era repositorio. ### Las preguntas Todas tienen un valor por defecto entre corchetes, y Enter lo acepta. En las de opción vale el valor, su número en la lista o un prefijo sin ambigüedad. | Pregunta | Tipo | Por defecto | Dónde va | | ---------------------------------------------- | ---------------------------------------- | ------------------------------------------ | -------------------------------------- | | ¿Cómo se llama el proyecto? | texto | El nombre deducido | `proyecto` en `AI-FIRST.md` | | ¿En qué fase está? | `exploracion`, `mvp`, `produccion` | `exploracion` | `fase` | | ¿Qué clase de producto es? | `saas`, `landing`, `api`, `cli`, `movil` | `saas` | `perfil.producto`; decide las skills | | ¿Qué forma tiene el repositorio? | `unico`, `monorepo`, `multiple` | `unico` | `perfil.repositorio` | | ¿Qué comando decide que el proyecto está sano? | texto | El deducido, o `pnpm test` | `verificacion` y varias skills | | ¿Y el de tipos? | texto | El script de tipos, si lo hay | `protocolo-features`, `test-fix` | | ¿Y el de lint? | texto | El script `lint`, si lo hay | `protocolo-features`, `test-fix` | | ¿Trabajas con varios agentes en paralelo? | sí/no | no | `protocolo-features`, `test-fix` | | ¿Qué archivo lleva el número de versión? | texto | El manifiesto encontrado, o `package.json` | `version-bump`, `protocolo-cierre` | | ¿En qué orden se implementa una feature? | opción, según el producto | La primera que ofrece el producto | `protocolo-features` | | ¿«…» es Zona Prohibida? | sí/no, una por zona sugerida | sí | Un «no» la quita de `zonas_prohibidas` | Son nueve preguntas fijas, la de la secuencia y una por cada Zona Prohibida sugerida. El número exacto se anuncia antes de empezar. Las secuencias que ofrece la penúltima pregunta: | Valor | Secuencia | Se ofrece a | | -------------- | ----------------------------------------------------------------------------------------------- | -------------------------- | | `hexagonal` | schema o migración, dominio, aplicación, infraestructura backend, compartido, interfaz, pruebas | `saas`, `api`, `movil` | | `capas-web` | schema, consultas y acciones de servidor, componentes, ruta o página, pruebas | `saas`, `landing`, `movil` | | `vertical` | contrato de la feature, datos, lógica, interfaz, pruebas | todos menos `cli` | | `contenido` | contenido y copia, componentes, página, pruebas | `landing` | | `contrato-cli` | contrato, dominio, aplicación, interfaz de línea de comandos, pruebas | `cli`, `api` | ### Dónde escribe las respuestas * **En `AI-FIRST.md`**: `proyecto`, `fase`, `perfil`, `verificacion` y las zonas confirmadas. Sólo si `init` crea el archivo en esa corrida; un `AI-FIRST.md` que ya existía no se toca. * **En cada skill instalada**, dentro de su sección «Adaptación a tu proyecto» y entre las mismas marcas que `AGENTS.md`. Cada corrida reescribe lo que hay entre las marcas; lo que agregues fuera sobrevive. Una skill para la que la entrevista no aporta nada, como `i18n`, se reporta saltada con esa razón. Cómo revisar y completar esa adaptación está en [Adaptar las skills](/docs/guias/adaptar-las-skills/). ## El punto de control `init` escribe el mismo detector en dos sitios, con tolerancias distintas. **`.githooks/pre-push`** corre `ai-first audit` **sin `--estricto`** sobre lo que se va a empujar: sólo un P0 interrumpe el push; un P1 o un P2 se imprimen y el push sigue. Toma como base el commit que el remoto ya tiene; si la rama todavía no existe en el remoto, compara el árbol de trabajo. Busca el comando en `node_modules/.bin`, luego en el `PATH`, luego en la caché de `npx` sin descargar nada. Si no encuentra Node o el paquete, avisa y deja pasar el push: no encontrarse nunca es motivo para frenar. Se salta con `git push --no-verify`. Es un hook **de git**, no del agente: no es el `PostToolUse` ni el `Stop` de [Skills, hooks y gestión de contexto](/docs/parte-2/skills-hooks-contexto/). **`.github/workflows/ai-first.yml`** corre en cada pull request, **con `--estricto`**: ahí cualquier hallazgo corta. Su paso final: ```yaml - name: Entropía documental run: npx --yes @falcux/ai-first audit --base "origin/${{ github.base_ref }}" --estricto ``` Clona con `fetch-depth: 0`, porque sin historia no hay rango que comparar, y usa Node 22. ## Salida `init --sin-entrevista` en una carpeta vacía llamada `demo`: ```text ai-first init — demo escrito .git/ escrito AI-FIRST.md escrito docs/ADR.md escrito docs/SESSION_LOG.md escrito docs/changes/CHANGE_LOG.md escrito docs/changes/pending/.gitkeep escrito .agents/skills/protocolo-features escrito .agents/skills/protocolo-cambios escrito .agents/skills/protocolo-cierre escrito .agents/skills/version-bump escrito .agents/skills/test-fix escrito .claude/skills escrito .githooks/pre-push escrito core.hooksPath escrito .github/workflows/ai-first.yml escrito AGENTS.md 1 Zona Prohibida sugerida: .env* 0 superficies de decisión: — 2 artefactos declarados Revisa AI-FIRST.md —sobre todo las razones de cada zona— y AGENTS.md, y luego corre `ai-first audit`. ``` Un ítem saltado se imprime con su razón entre paréntesis, o `(ya existe)`; uno sugerido, con la razón tras una raya. El `AI-FIRST.md` que dejó esta corrida está completo en [El formato de AI-FIRST.md](/docs/referencia/ai-first-md/#un-ejemplo-real). ## Códigos de salida | Código | Cuándo | | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `0` | Terminó, aunque haya saltado o sugerido cosas: saltar no es error. | | `2` | Error de uso: dos opciones que se contradicen, `--entrevista` sin terminal interactiva, una skill que el paquete no trae, un bloque roto en `AGENTS.md`, una `--raiz` que no existe, una opción desconocida o una entrevista cancelada. | `init` nunca sale con `1`: ese código es de `audit`. ## Relacionado [Qué deja init en tu repo](/docs/empezar/que-instala/)Los mismos archivos, explicados para quien lo corre por primera vez. [Adoptar en un proyecto existente](/docs/empezar/proyecto-existente/)Qué pasa cuando el repo ya tiene AGENTS.md, skills o hooks propios. [ai-first audit](/docs/referencia/audit/)El comando que corre el punto de control. [Las 11 skills](/docs/referencia/skills/)Qué instala cada perfil y qué hace cada skill. # ai-first audit > Los dos modos de audit, sus opciones, el puntaje de entropía, los códigos de salida y el formato del reporte legible y del JSON. `audit` lee `AI-FIRST.md`, le pregunta a git qué cambió, corre las cinco verificaciones y resume el resultado en un puntaje de entropía y un código de salida. No compila nada, no llama a un modelo y no toca la red. ## Uso ```text ai-first audit [--base ] [--estricto] [--registrar] [--json] [--raiz ] ``` Para correrlo sin instalar el paquete: ```bash npx @falcux/ai-first@latest audit ``` ## Modos El mismo comando compara dos cosas distintas según reciba o no `--base`. | Modo | Se activa | Qué cuenta como tocado | Dónde se usa | | --------- | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | | **Árbol** | Sin `--base` | Lo que difiere de `HEAD`, en el índice o en el árbol de trabajo, más los archivos nuevos sin seguimiento que `.gitignore` no cubre. En un repo sin commits, todo | El hook local, o a mano antes de hacer commit | | **Rango** | `--base ` | Lo que difiere en el rango `...HEAD`: lo que la rama trae desde que se separó de `` | Integración continua, y el hook `pre-push` cuando la rama ya existe en el remoto | La diferencia importa para una verificación: la anotación que silencia la de decisiones vive en el cuerpo de un commit, y en modo árbol no hay commits que leer. Ver [Decisión sin fila en ADR](/docs/referencia/verificaciones/#decisi%C3%B3n-sin-fila-en-adr). ## Opciones | Opción | Qué hace | Por defecto | | -------------- | ----------------------------------------------------------------------------------------------- | ------------------------- | | `--base ` | Compara el rango `...HEAD`. La ref tiene que existir en el repositorio; si no, sale con 2. | Modo árbol, contra `HEAD` | | `--estricto` | Sale con 1 también ante un P1 o un P2. | Sólo un P0 da 1 | | `--registrar` | Escribe el resultado en `auditoria` del frontmatter de `AI-FIRST.md`. | No escribe nada | | `--json` | Imprime el informe en JSON en vez del reporte legible. | Reporte legible | | `--raiz ` | Raíz del repositorio. | El directorio actual | ## Opciones globales Valen sin subcomando y con cualquiera de los dos. | Opción | Qué hace | Código de salida | | ----------------- | ---------------------------------------------------------------------------------------------------------- | ---------------- | | `-v`, `--version` | Imprime la versión instalada del paquete, leída de su `package.json`. Tiene prioridad sobre todo lo demás. | `0` | | `-h`, `--help` | Imprime la ayuda completa, la de `init` y la de `audit`. | `0` | Sin subcomando y sin `--help`, el binario imprime la misma ayuda pero sale con `2`, porque no se le pidió nada que hacer. ## Estados de una verificación Cada una de las cinco termina en uno de tres estados, y sólo tres: | Estado | Marca en el reporte | Qué significa | | ----------- | ------------------- | ------------------------------------------------------------------ | | `aprobado` | `✓` | Corrió y no encontró nada. | | `hallazgos` | `✗` | Corrió y encontró al menos un hallazgo, cada uno con su severidad. | | `omitido` | `–` | No pudo correr porque falta lo que necesita leer. Se dice por qué. | **Un check que no puede correr se reporta omitido, nunca aprobado.** Un `–` no es un visto bueno: es un hueco en la configuración, y el reporte dice cuál. Qué necesita cada uno está en [Las cinco verificaciones](/docs/referencia/verificaciones/). ## Puntaje ```text entropía = min(100, 40·P0 + 20·P1 + 8·P2) ``` **Más alto es peor.** Mide entropía, no salud: 0 es documentación alineada con el proyecto y 100 es documentación desconectada. Cada hallazgo suma el peso de su severidad, y el total se corta en 100. Un solo P0 pone el puntaje en 40 sin ayuda de nada más, que es la intención: una Zona Prohibida tocada no se compensa con documentación impecable en todo lo demás. Un P0, un P1 y un P2 dan 68. En la verificación de Zonas Prohibidas, la unidad del hallazgo es la zona, no el archivo: tocar tres migraciones es un P0, con los tres archivos en el detalle. El puntaje mide cuántas fronteras se cruzaron. ## Códigos de salida | Código | Cuándo | | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `0` | Sin hallazgos, o sólo P1 y P2 sin `--estricto`. | | `1` | Algún P0. O algún P1 o P2 con `--estricto`. | | `2` | Error de uso: no hay `AI-FIRST.md`, su `formato` es desconocido o su frontmatter no se puede leer, la carpeta no es un repositorio git, la ref de `--base` no existe, o una opción desconocida. También `sync`, `adr` y `handoff`, que están anunciados y todavía no existen. | Así el mismo comando sirve en un hook local, donde interrumpir por un P2 sería intolerable, y en integración continua, donde se quiere el corte. ## Reporte legible Es la salida por defecto. En una terminal lleva color; redirigida a un archivo o a otro proceso, no. Sin hallazgos: ```text ai-first audit — demo árbol de trabajo contra HEAD · 0 archivos tocados ✓ Zona Prohibida tocada ✓ Decisión sin fila en ADR – Alcance excedido — omitido: no hay ninguna spec activa en docs/changes/pending/ ✓ Artefacto huérfano – Inventario de componentes desactualizado — omitido: faltan «artefactos.inventario_componentes» o «artefactos.componentes_dir» Entropía: 0 / 100 (0 P0 · 0 P1 · 0 P2) ``` Sale con 0. Tras tocar un `.env.local` en el mismo repo, que declara `.env*` como Zona Prohibida: ```text ai-first audit — demo árbol de trabajo contra HEAD · 2 archivos tocados ✗ Zona Prohibida tocada P0 Zona Prohibida «.env*» tocada — credenciales .env.local ✓ Decisión sin fila en ADR – Alcance excedido — omitido: no hay ninguna spec activa en docs/changes/pending/ ✓ Artefacto huérfano – Inventario de componentes desactualizado — omitido: faltan «artefactos.inventario_componentes» o «artefactos.componentes_dir» Entropía: 40 / 100 (1 P0 · 0 P1 · 0 P2) ``` Sale con 1. La segunda línea dice el modo —`árbol de trabajo contra HEAD`, o `rango ...HEAD`— y cuántos archivos se tocaron. Las verificaciones van siempre en el mismo orden. Bajo cada hallazgo, con sangría, va su detalle: los archivos que lo causaron o qué hacer para silenciarlo. ## Salida JSON Con `--json`, el mismo informe de la corrida con P0: ```json { "proyecto": "demo", "modo": "arbol", "cambiados": [ ".env.local", "src/a.ts" ], "resultados": [ { "check": "zona-prohibida", "estado": "hallazgos", "hallazgos": [ { "severidad": "P0", "ruta": ".env*", "mensaje": "Zona Prohibida «.env*» tocada — credenciales", "detalle": [ ".env.local" ] } ] }, { "check": "decision-sin-adr", "estado": "aprobado" }, { "check": "alcance-excedido", "estado": "omitido", "razon": "no hay ninguna spec activa en docs/changes/pending/" }, { "check": "artefacto-huerfano", "estado": "aprobado" }, { "check": "inventario-componentes", "estado": "omitido", "razon": "faltan «artefactos.inventario_componentes» o «artefactos.componentes_dir»" } ], "conteo": { "p0": 1, "p1": 0, "p2": 0 }, "entropia": 40, "codigoDeSalida": 1 } ``` | Campo | Tipo | Qué contiene | | ------------------------ | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `proyecto` | cadena o `null` | El `proyecto` de `AI-FIRST.md`, o `null` si no lo declara. | | `modo` | `"arbol"` o `"rango"` | El modo de comparación. | | `base` | cadena | La ref de `--base`. Sólo aparece en modo rango. | | `cambiados` | lista de cadenas | Los archivos tocados, relativos a la raíz, sin duplicados y en orden alfabético. | | `resultados` | lista | Uno por verificación, en el orden fijo del reporte. | | `resultados[].check` | cadena | El identificador: `zona-prohibida`, `decision-sin-adr`, `alcance-excedido`, `artefacto-huerfano` o `inventario-componentes`. | | `resultados[].estado` | cadena | `aprobado`, `hallazgos` u `omitido`. | | `resultados[].razon` | cadena | Por qué se omitió. Sólo con `omitido`. | | `resultados[].hallazgos` | lista | Sólo con `hallazgos`. Cada uno lleva `severidad` (`P0`, `P1` o `P2`), `mensaje` en una línea y, cuando aplica, `ruta` —el patrón, archivo o `archivo:línea` al que se refiere— y `detalle`, una lista de líneas. | | `conteo` | objeto | Cuántos hallazgos de cada severidad: `p0`, `p1`, `p2`. | | `entropia` | número | El puntaje, de 0 a 100. | | `codigoDeSalida` | `0` o `1` | El código con el que sale esta corrida, ya aplicado `--estricto`. | Nota `codigoDeSalida` nunca vale `2`: un error de uso no produce informe, sino un mensaje en la salida de error que empieza con `ai-first:`. ## `--registrar` Escribe en el frontmatter de `AI-FIRST.md` un bloque `auditoria` con la fecha de hoy, el puntaje y el conteo. Si el bloque ya existe, lo reemplaza; si no, lo agrega al final del frontmatter. Trabaja sobre el texto, no reformatea el YAML: los comentarios y el resto del archivo quedan como estaban. Tras la corrida con P0, el frontmatter termina así: ```yaml auditoria: fecha: 2026-09-23 entropia: 40 hallazgos: p0: 1 p1: 0 p2: 0 --- ``` Sólo guarda la última corrida, y sólo cuando se pide. Si cada `audit` tocara el archivo, el ruido en los diffs haría que el equipo lo ignore. Registrado en un PR, el diff muestra si la entropía subió o bajó. El registro no cambia el código de salida. ## Relacionado [Las cinco verificaciones](/docs/referencia/verificaciones/)Qué detecta cada una y cómo se silencia. [Auditar en local y en CI](/docs/guias/auditar-en-local-y-en-ci/)El hook, el flujo de integración continua y qué hacer con cada hallazgo. [El formato de AI-FIRST.md](/docs/referencia/ai-first-md/)Lo que audit lee antes de correr. [Solución de problemas](/docs/guias/solucion-de-problemas/)Cuando el comando sale con 2 o un check aparece omitido. # Las cinco verificaciones > Qué detecta cada verificación de audit, con qué severidad, qué lee de AI-FIRST.md, cuándo se omite y cómo se silencia. `audit` corre cinco verificaciones, siempre en el mismo orden. Todas son código puro —git, sistema de archivos y expresiones regulares—, sin modelo, sin conexión y sin API key: la misma entrada da el mismo resultado. Cada una lee una parte de `AI-FIRST.md`, y si esa parte falta se reporta omitida, nunca aprobada. ## Resumen | # | Verificación | Sev. | Qué detecta | Por qué importa | Lee de `AI-FIRST.md` | | - | ------------------------------------------------------------------------------------- | ------ | ------------------------------------------------------------ | --------------------------------------------------- | ----------------------------------------------------------------- | | 1 | [Zona Prohibida tocada](#zona-prohibida-tocada) | **P0** | Se tocó una ruta declarada como Zona Prohibida | Es lo único que corta el flujo aun sin `--estricto` | `zonas_prohibidas` | | 2 | [Decisión sin fila en ADR](#decisi%C3%B3n-sin-fila-en-adr) | **P1** | Señales de decisión arquitectónica sin fila nueva en el ADR | La decisión existe en el código y no en el registro | `superficies_de_decision`, `artefactos.adr` | | 3 | [Alcance excedido](#alcance-excedido) | **P1** | Más archivos tocados de los que declara la spec activa | El alcance creció y nadie lo midió | `alcance.spec`, `alcance.tolerancia` | | 4 | [Artefacto huérfano](#artefacto-hu%C3%A9rfano) | **P2** | Un documento declarado, o una ruta que menciona, no existe | Un documento apunta a algo que ya nadie mantiene | `artefactos` | | 5 | [Inventario de componentes desactualizado](#inventario-de-componentes-desactualizado) | **P2** | Componentes en disco que el inventario no nombra, o al revés | El inventario empezó a mentir | `artefactos.inventario_componentes`, `artefactos.componentes_dir` | Cuatro de las cinco son deterministas y no admiten discusión: una ruta cambió o no cambió, un archivo referenciado existe o no existe, un componente aparece en el inventario o no aparece. **La segunda no lo es**, porque «se tomó una decisión arquitectónica» no cabe en una expresión regular: se resuelve declarando dónde un cambio se presume decisión, produce falsos positivos y por eso se puede silenciar. Una verificación que no se puede silenciar termina desactivada entera, que es peor que tenerla ruidosa. Los patrones de ruta que usan las verificaciones 1, 2 y 3 siguen las reglas de [Patrones de ruta](/docs/referencia/ai-first-md/#patrones-de-ruta). Qué es «tocado» depende del modo, árbol o rango: ver [Modos](/docs/referencia/audit/#modos). *** ## Zona Prohibida tocada **Severidad:** P0 · **Identificador:** `zona-prohibida` Compara cada archivo tocado contra los patrones de `zonas_prohibidas`. Un hallazgo por zona, no por archivo: tocar tres migraciones es una Zona Prohibida tocada, con los tres archivos en el detalle. Si la zona declara `razon`, el mensaje la incluye. * **Lee:** `zonas_prohibidas[].ruta` y `zonas_prohibidas[].razon`. * **Se omite si** no hay ninguna zona declarada: `no hay «zonas_prohibidas» declaradas`. * **No se silencia.** Una Zona Prohibida no impide el cambio, lo hace visible: el hallazgo existe para que un humano decida. Si el cambio estaba aprobado, se publica igual; lo que no se hace es quitar la zona para que el detector calle. ```text ✗ Zona Prohibida tocada P0 Zona Prohibida «.env*» tocada — credenciales .env.local ``` Por qué y cómo se eligen las zonas está en [Gobierno del contexto](/docs/parte-2/gobierno-del-contexto/). *** ## Decisión sin fila en ADR **Severidad:** P1 · **Identificador:** `decision-sin-adr` Busca dos señales de que se tomó una decisión arquitectónica: * **Cambió un archivo que coincide con `superficies_de_decision`.** * **Un `package.json`, en cualquier carpeta, ganó o perdió una dependencia de producción.** Se comparan las claves de `dependencies`; `devDependencies` no cuenta. Esta señal no hay que declararla. Si hay alguna señal y el archivo de `artefactos.adr` no ganó una fila en el mismo tramo, emite un P1. **Una fila** es una línea agregada que empieza con un encabezado de nivel 2 o 3 seguido de `ADR-` y un número, como `## ADR-007 — La cola de trabajos pasa a SQS`. * **Lee:** `superficies_de_decision` y `artefactos.adr`. * **Se omite si** no hay `artefactos.adr`: `no hay «artefactos.adr» declarado`. Sin superficies declaradas, igual corre: le queda la señal de las dependencias. * **Se silencia de dos formas:** 1. **Agregando la fila al ADR**, si de verdad era una decisión. 2. **Con la anotación en el cuerpo de un commit del rango**, si no lo era, por ejemplo subir un timeout en un `*.config.*`: ```text ``` La anotación **sólo se lee en modo rango**, con `--base`: en modo árbol no hay commits cuyo cuerpo leer. Ahí el P1 queda como advertencia y no corta salvo con `--estricto`. El hook `pre-push` corre en modo rango cuando la rama ya existe en el remoto, y el flujo de CI siempre. ```text ✗ Decisión sin fila en ADR P1 Hay señales de decisión arquitectónica y ADR.md no ganó ninguna fila vite.config.ts (superficie «**/*.config.*») Silenciar: agregar la fila al ADR, o «» en el cuerpo del commit. ``` Una dependencia aparece en el detalle como `package.json: +nombre` o `package.json: -nombre`. Qué merece una fila y qué no está en [Gobierno del contexto](/docs/parte-2/gobierno-del-contexto/). *** ## Alcance excedido **Severidad:** P1 · **Identificador:** `alcance-excedido` Compara los archivos tocados contra los que declara la spec activa. Si los que quedan fuera superan `tolerancia`, emite un solo P1 con la lista. **La spec activa** es `alcance.spec`: un archivo, o una carpeta, y entonces cuenta cada `.md` o `.mdx` que haya dentro y no empiece por punto. `init` la apunta a `docs/changes/pending/`, donde vive el CHG del cambio en curso. **Cómo declara archivos una spec:** en una sección cuyo encabezado empiece por «Archivos» o «Alcance», de cualquier nivel y sin importar mayúsculas, con cada ruta entre acentos graves. Se admiten patrones. La sección llega hasta el siguiente encabezado de igual o mayor nivel, y lo que esté dentro de un bloque de código no cuenta. ```md ## Archivos - `src/lib/cola.ts` - `src/lib/cola.test.ts` - `docs/specs/cola.md` ``` En la 0.5.1, una ruta declarada tiene que llevar una barra o una extensión conocida, como `.ts`, `.md`, `.json` o `.yml`. Un archivo sin carpeta y sin extensión reconocida —`.npmrc`, `LICENSE`, `Makefile`— no se puede declarar: si lo tocas, cuenta fuera del alcance y sólo lo cubre la tolerancia. **Nunca cuentan como fuera de alcance:** `AI-FIRST.md`, la propia spec o su carpeta, y cualquier archivo declarado en `artefactos`. Actualizar el registro de sesión al cerrar es parte del protocolo, no un desvío. * **Lee:** `alcance.spec` y `alcance.tolerancia`. Sin tolerancia declarada vale 0. * **Se omite si:** * no hay `alcance.spec`: `no hay «alcance.spec» declarado`; * no hay ninguna spec en esa ruta: `no hay ninguna spec activa en docs/changes/pending/`. Es el caso normal cuando no hay un cambio abierto: no hay alcance que exceder; * las specs no listan archivos: `las specs en … no listan archivos (sección «Archivos» o «Alcance» con rutas entre acentos graves)`. * **Se silencia** declarando en la spec lo que de verdad entró en el cambio, o subiendo `tolerancia` si el proyecto acepta cierto margen. ```text ✗ Alcance excedido P1 3 archivos fuera del alcance declarado (tolerancia: 0) src/b.ts src/c.ts vite.config.ts ``` *** ## Artefacto huérfano **Severidad:** P2 · **Identificador:** `artefacto-huerfano` Verifica que existan los documentos declarados en `artefactos` y que las rutas que mencionan resuelvan. Dos cosas cuentan como huérfano: * **Un artefacto declarado que no existe.** Una clave que apunta a una carpeta sólo tiene que existir; un archivo, además, se recorre. * **Una ruta mencionada dentro de un artefacto que no existe**, sea en un enlace `[texto](ruta)` o entre acentos graves. **Qué cuenta como mención de ruta:** un token con barra o con una extensión conocida, sin espacios. No cuentan las URL, lo que empieza con `/`, `@`, `-` o `~`, las refs de git como `origin/main`, los patrones con `*` y los marcadores como `CHG-XXX` o `docs/…`. **Lo que está dentro de un bloque de código tampoco**: ahí las rutas son ejemplos. **Cómo resuelve, en orden:** 1. Desde la raíz del repo y desde la carpeta del documento. Lo que `.gitignore` cubre, como `dist/` o `.env`, cuenta como existente: está ausente a propósito. 2. Un nombre sin carpeta, como `cola.ts`, se busca por nombre en todo el repo: la prosa nombra archivos, no siempre los ubica. 3. Una ruta con carpeta cuyo **primer segmento no existe** en la raíz se asume de otro árbol —otro proyecto, un ejemplo, un repo externo— y no se reporta. Un check que no puede verificar algo no lo cuenta como fallo. * **Lee:** todas las claves de `artefactos`, las conocidas y las que agregues. * **Se omite si** no hay ningún artefacto declarado: `no hay «artefactos» declarados`. Tras `init` nunca pasa, porque declara `adr` y `agents`. * **Se silencia** corrigiendo la ruta o quitando la mención. Si la ruta es de otro repositorio, escríbela con su carpeta o sin acentos graves; si es un ejemplo, dentro de un bloque de código. ```text ✗ Artefacto huérfano P2 docs/ARQUITECTURA.md menciona src/lib/queue.ts, que no existe ``` Un artefacto que no existe se reporta como `«artefactos.clave» apunta a ruta, que no existe`. En JSON, la `ruta` del hallazgo lleva el número de línea: `docs/ARQUITECTURA.md:3`. *** ## Inventario de componentes desactualizado **Severidad:** P2 · **Identificador:** `inventario-componentes` Compara los componentes que hay en `componentes_dir` con lo que nombra el documento de `inventario_componentes`. Es por nombre, así que un renombre sin actualizar el inventario también lo caza. Mira en las dos direcciones: * **Un componente en disco que el inventario no menciona.** Basta con que el nombre aparezca como palabra entera en cualquier parte del documento. * **Un encabezado del inventario que nombra un componente que ya no existe.** Sólo cuentan los encabezados de nivel 2 o más con forma de componente: entre acentos graves o ángulos, como `` `Boton` `` o ``, o con mayúscula interna, como `BotonPrimario`. Una palabra capitalizada suelta, como «Formularios», es un título de sección y se deja pasar. **Qué cuenta como componente:** cada archivo `.astro`, `.tsx`, `.jsx`, `.vue`, `.svelte`, `.ts` o `.js` dentro de la carpeta, a cualquier profundidad. `Boton/index.tsx` es el componente `Boton`; un `index` en la raíz de la carpeta es el barril de exportación y no cuenta. Se ignoran los archivos de prueba, de stories y de declaración de tipos, lo que empieza por `.` o `_`, y `node_modules`. * **Lee:** `artefactos.inventario_componentes` y `artefactos.componentes_dir`. Hacen falta las dos. * **Se omite si:** * falta alguna de las dos claves: `faltan «artefactos.inventario_componentes» o «artefactos.componentes_dir»`. Es lo que pasa en un repo recién iniciado: `init` las deja comentadas; * la carpeta no existe o no es una carpeta; * el inventario no existe. Eso ya lo reporta la verificación de artefactos huérfanos. * **Se silencia** agregando el componente al inventario, o quitando el encabezado del que ya se borró. ```text ✗ Inventario de componentes desactualizado P2 Tarjeta existe en src/components/ y no aparece en COMPONENTES.md P2 COMPONENTES.md documenta Modal, que ya no existe en src/components/ ``` Nota Los ejemplos de hallazgo de las verificaciones 2 a 5 salen de una corrida del detector sobre un repo de prueba con esas cinco situaciones montadas. El de la verificación 1 es la corrida de [`ai-first audit`](/docs/referencia/audit/#reporte-legible). ## Relacionado [ai-first audit](/docs/referencia/audit/)Modos, puntaje y códigos de salida. [El formato de AI-FIRST.md](/docs/referencia/ai-first-md/)Cada campo que leen las verificaciones. [Auditar en local y en CI](/docs/guias/auditar-en-local-y-en-ci/)Qué hacer con cada hallazgo en el hook y en el pull request. [Gobierno del contexto](/docs/parte-2/gobierno-del-contexto/)Los cuatro instrumentos que estas verificaciones miden. # El formato de AI-FIRST.md > El frontmatter de AI-FIRST.md campo por campo, con su tipo, si es obligatorio y quién lo lee, más las reglas de los patrones de ruta. `AI-FIRST.md` es el contrato entre el proyecto y el detector: dice qué gobierna al proyecto y dónde vive cada cosa, en una forma que `audit` puede verificar sin interpretar prosa. Vive en la raíz del repo, lo escribe `init` y lo mantiene el equipo a mano. ## La frontera con AGENTS.md **`AGENTS.md` es para los agentes. `AI-FIRST.md` es para las herramientas.** El primero es normativo y está en presente: «no toques `migrations/`». El segundo es declarativo y no da órdenes: «`migrations/` es Zona Prohibida desde el 2026-03-12, por esta razón». No lo lee el agente para trabajar; lo lee el detector para medir. La única skill que lo lee al empezar es `protocolo-arranque`, que toma de ahí el perfil, la fase, el comando de verificación y las Zonas Prohibidas. ## Estructura Markdown con un frontmatter YAML entre dos líneas `---`. **El frontmatter es el contrato**: lo lee el detector sin ambigüedad. **El cuerpo es para humanos** y el detector no lo interpreta: van ahí las notas que ninguna máquina puede verificar, como por qué cada zona es prohibida, o la tabla de permisos del repositorio. El cuerpo no repite el frontmatter: si un dato está en los dos lados, uno de los dos va a mentir. Una clave que el detector no conoce se ignora, no es error. ## Campos | Campo | Tipo | Obligatorio | Lo escribe `init` | Quién lo lee | | ----------------------------------------------------- | ---------------- | ----------- | ------------------------------------- | ------------------------------------------- | | [`formato`](#formato) | número | **Sí** | Sí | `audit`, antes que nada | | [`proyecto`](#proyecto) | cadena | No | Sí | El reporte de `audit` | | [`fase`](#fase) | cadena | No | Sí | Quien abre el archivo; `protocolo-arranque` | | [`actualizado`](#actualizado) | fecha | No | Sí | Quien abre el archivo | | [`verificacion`](#verificacion) | cadena | No | Si lo deduce; si no, comentado | El humano; `protocolo-arranque` | | [`perfil`](#perfil) | mapa | No | Sólo con entrevista | `protocolo-arranque` | | [`zonas_prohibidas`](#zonas_prohibidas) | lista | No | Sí | Verificación 1; `protocolo-arranque` | | [`superficies_de_decision`](#superficies_de_decision) | lista de cadenas | No | Si encuentra alguna; si no, comentado | Verificación 2 | | [`alcance`](#alcance) | mapa | No | Sí, con `spec` | Verificación 3 | | [`artefactos`](#artefactos) | mapa | No | Sí | Verificaciones 2, 3, 4 y 5 | | [`auditoria`](#auditoria) | mapa | No | No: lo escribe `audit --registrar` | El humano, en el diff del PR | Sin un campo opcional, la verificación que lo necesita se omite y el reporte dice por qué. Nunca se aprueba. ### `formato` La versión **del formato de este archivo**, no del proyecto. Hoy la única que existe es `1`. Cualquier otro valor, o su ausencia, detiene `audit` con un mensaje y sale con 2: un formato desconocido no se interpreta a medias. ```yaml formato: 1 ``` ### `proyecto` El nombre que encabeza el reporte y el campo `proyecto` del JSON. Sin él, el reporte dice `(sin nombre)` y el JSON, `null`. `init` lo toma del `name` de `package.json`, sin el scope, o del nombre de la carpeta. ### `fase` `exploracion`, `mvp` o `produccion`. No cambia ninguna verificación: la lee quien abre el archivo, y `protocolo-arranque` para saber en qué punto está el proyecto. `init` escribe `exploracion` salvo que la entrevista diga otra cosa. ### `actualizado` La fecha de la última revisión del archivo, en formato `AAAA-MM-DD`. `init` pone la del día. Ninguna verificación la lee. ### `verificacion` El comando que decide si el proyecto está sano, como `pnpm build && pnpm test`. **Lo corre el humano, no el detector**: `audit` mide documentación, no compila nada. `init` lo arma con los scripts `build` y `test` de `package.json`; si no los hay, deja la línea comentada. ### `perfil` Qué clase de producto es y en qué forma de repositorio vive. Decide qué skills instala `init` con entrevista y qué artefactos escribe `protocolo-arranque`. ```yaml perfil: producto: saas # saas | landing | api | cli | movil repositorio: unico # unico | monorepo | multiple ``` Las dos claves son obligatorias si el campo está. Un valor fuera de la lista es error de formato y sale con 2, no se reemplaza por uno por defecto: adivinar mal el perfil es peor que no tenerlo. Sin `perfil`, el archivo funciona igual; `protocolo-arranque` lo pregunta. ### `zonas_prohibidas` Las rutas que el agente no modifica sin aprobación explícita. El criterio es el costo de revertir un error ahí, no la importancia del archivo. Pocas, o se vuelven ruido. ```yaml zonas_prohibidas: - ruta: "migrations/" razon: "esquema vivo en producción" desde: 2026-03-12 - ".env*" ``` | Clave | Tipo | Obligatoria | Qué es | | ------- | ------ | ----------- | ---------------------------------------------------------- | | `ruta` | patrón | **Sí** | Qué se protege. Ver [Patrones de ruta](#patrones-de-ruta). | | `razon` | cadena | No | Por qué. Aparece en el mensaje del hallazgo. | | `desde` | fecha | No | Desde cuándo rige. | Cada entrada puede ser un mapa o, si sólo lleva ruta, una cadena suelta. Un mapa sin `ruta` es error de formato. ### `superficies_de_decision` Los archivos donde un cambio se presume decisión arquitectónica: el esquema, los puntos de entrada de los paquetes, las configuraciones. Si uno se toca y el ADR no gana una fila, la verificación 2 emite un P1. Las dependencias de producción se vigilan solas, sin declararlas. ```yaml superficies_de_decision: - "**/*.config.*" - "packages/*/src/index.ts" - "src/lib/queue.ts" ``` Tiene que ser una lista de cadenas. ### `alcance` De dónde sale el alcance declarado del cambio en curso. ```yaml alcance: spec: docs/changes/pending/ tolerancia: 3 ``` | Clave | Tipo | Por defecto | Qué es | | ------------ | ------ | ----------- | ----------------------------------------------------------------------------------------------------------- | | `spec` | ruta | — | Un archivo, o una carpeta cuyos `.md` y `.mdx` son las specs activas. Sin ella, la verificación 3 se omite. | | `tolerancia` | número | `0` | Cuántos archivos fuera del alcance se aceptan antes de emitir el P1. | Cómo lista archivos una spec está en [Alcance excedido](/docs/referencia/verificaciones/#alcance-excedido). Un valor del tipo equivocado, como `tolerancia: "3"` entre comillas, se ignora sin error. ### `artefactos` Los documentos que hablan de **este** repo, como un mapa de nombre a ruta relativa a la raíz. La verificación 4 comprueba que existan y que lo que mencionan exista; la 3 nunca los cuenta fuera de alcance. ```yaml artefactos: adr: docs/ADR.md agents: AGENTS.md arquitectura: docs/ARQUITECTURA.md guia_diseno: docs/GUIA_DISENO.md inventario_componentes: docs/COMPONENTES.md componentes_dir: src/components/ tech_notes: docs/TECH_NOTES.md ``` | Clave | La usa además | | ---------------------------------------------------------------------------------- | ---------------------------------------------------------- | | `adr` | Verificación 2: es el archivo que tiene que ganar la fila. | | `inventario_componentes` | Verificación 5, junto con `componentes_dir`. | | `componentes_dir` | Verificación 5. Es una carpeta: sólo tiene que existir. | | `agents`, `arquitectura`, `guia_diseno`, `tech_notes`, `session_log`, `change_log` | Sólo la 4. | Se admite cualquier otra clave: es un documento más que la verificación 4 recorre. Cada valor tiene que ser una cadena con la ruta; una clave con valor nulo se ignora. Precaución Declarar el registro de sesión o el de cambios es posible, pero `init` no lo hace a propósito: son cronología, nombran archivos que ya se retiraron, y la verificación 4 cobraría cada mención vieja para siempre. ### `auditoria` El resultado de la última corrida registrada. Lo escribe `audit --registrar` y nadie más; ninguna verificación lo lee. Existe para que el diff del PR muestre si la entropía subió o bajó. ```yaml auditoria: fecha: 2026-09-23 entropia: 40 hallazgos: p0: 1 p1: 0 p2: 0 ``` Cómo se escribe está en [`--registrar`](/docs/referencia/audit/#--registrar). ## Patrones de ruta `zonas_prohibidas`, `superficies_de_decision` y las rutas que declara una spec usan las mismas reglas, pocas y explícitas: | Forma | Ejemplo | Coincide con | | -------------- | ------------------------- | ------------------------------------------------------------------------------- | | Termina en `/` | `migrations/` | Todo lo que esté debajo de esa carpeta, a cualquier profundidad, desde la raíz. | | Sin `/` | `.env*` | El nombre del archivo, en cualquier carpeta: también `apps/web/.env.local`. | | Con `/` | `packages/*/src/index.ts` | La ruta completa desde la raíz. | Dentro de un patrón, `*` y `?` no cruzan carpetas; `**` sí, y puede valer cero carpetas. Las rutas son relativas a la raíz y se escriben con `/`, que es como las entrega git. ## Errores de formato Cualquiera de estos detiene `audit` y sale con 2, con el mensaje en la salida de error: | Mensaje | Causa | | ---------------------------------------------------------------------- | --------------------------------------------- | | `No hay AI-FIRST.md en …` | El archivo no existe en la raíz. | | `AI-FIRST.md no tiene frontmatter YAML entre dos líneas «---».` | Falta el frontmatter, o no está al principio. | | `El frontmatter no es un mapa YAML.` | El YAML es una lista o un valor suelto. | | `«formato: …» no está soportado. Este detector entiende el formato 1.` | `formato` falta o no es `1`. | | `«zonas_prohibidas» debe ser una lista.` | — | | `«zonas_prohibidas[n]» necesita al menos «ruta».` | Una entrada es un mapa sin `ruta`. | | `«superficies_de_decision» debe ser una lista de cadenas.` | — | | `«alcance» debe ser un mapa.` | — | | `«artefactos» debe ser un mapa de nombre → ruta.` | — | | `«artefactos.clave» debe ser una ruta.` | Un valor no es cadena. | | `«perfil.producto» debe ser uno de: saas, landing, api, cli, movil.` | También su equivalente para `repositorio`. | ## Un ejemplo real El `AI-FIRST.md` que deja `init --sin-entrevista` en una carpeta vacía llamada `demo`: ```md --- # Versión del FORMATO de este archivo, no del proyecto. formato: 1 proyecto: "demo" fase: exploracion # exploracion | mvp | produccion actualizado: 2026-09-23 # El comando que decide si el proyecto está sano. Lo corre el humano, no el # detector: audit mide documentación, no compila nada. # verificacion: pnpm build && pnpm test # Rutas que el agente no modifica sin aprobación explícita. El criterio es el # costo de revertir un error ahí, no la importancia del archivo. Pocas, o se # vuelven ruido. Revisa las sugeridas y completa la razón. zonas_prohibidas: - ruta: ".env*" razon: "credenciales" desde: 2026-09-23 # Superficies donde un cambio se presume decisión arquitectónica. Si una se toca # y el ADR no gana una fila, audit emite P1. Las dependencias de producción se # vigilan solas, sin declararlas. # superficies_de_decision: # - "**/*.config.*" # - src/lib/queue.ts # Alcance de la sesión en curso: la spec del cambio abierto (CHG-XXX), que vive # en la carpeta que init acaba de crear. Requiere que la spec liste archivos en # una sección «Archivos» o «Alcance», con rutas entre acentos graves. Sin spec # activa el check se omite, que es lo correcto: no hay alcance que exceder. alcance: spec: docs/changes/pending/ # tolerancia: 3 # Documentos que hablan de ESTE repo. audit verifica que lo que mencionan # exista. Un check sin su artefacto se omite, nunca se aprueba. artefactos: adr: "docs/ADR.md" agents: "AGENTS.md" --- # AI-FIRST.md — demo > Qué gobierna a este proyecto. Las reglas que el agente obedece están en > `AGENTS.md`; acá está el mapa que las herramientas verifican. ## Notas Por qué `.env*` es Zona Prohibida: _(completar: qué cuesta revertir un error ahí)_. ``` Con entrevista, el archivo lleva además el bloque `perfil` y la `fase` y la `verificacion` que se respondieron. En un repo con componentes, `init` agrega bajo `artefactos` las dos claves de la verificación 5, comentadas, para que las actives tú. ## Relacionado [Las cinco verificaciones](/docs/referencia/verificaciones/)Qué hace cada una con estos campos. [ai-first init](/docs/referencia/init/)Cómo se genera este archivo y qué deduce el escaneo. [Gobierno del contexto](/docs/parte-2/gobierno-del-contexto/)Por qué existen las Zonas Prohibidas, el ADR y la medición de entropía. # Las 11 skills > El catálogo de las once skills del paquete, con cuándo se activa cada una, qué escribe, cuáles instala init y dónde se explica. El paquete trae once skills. Una **skill** es un procedimiento en un formato que el agente carga solo cuando la tarea coincide con su descripción: el formato `SKILL.md` del estándar Agent Skills, con `name` y `description` en el frontmatter. `init` las instala en `.agents/skills/`; esta página dice qué hace cada una. Hay dos tipos. **Cinco son protocolos**: los cuatro de la Parte III del manual en formato ejecutable, más `protocolo-arranque`, que corre antes que todos. **Seis son de oficio**: nacieron resolviendo problemas concretos en proyectos reales y resultaron transferibles. ## Resumen | Skill | Tipo | Se activa | Por defecto | Perfiles que la instalan | Pide interfaz | | ------------------------------------------------------- | --------- | ---------------------------------------------------------------------------------- | ----------- | ---------------------------- | ------------- | | [`protocolo-arranque`](#protocolo-arranque) | Protocolo | Al principio: hay una idea o un requerimiento y todavía no hay PRD ni arquitectura | No | Todos, con entrevista | No | | [`protocolo-features`](#protocolo-features) | Protocolo | Comando, módulo o feature nuevo, antes de escribir código | **Sí** | Todos | No | | [`protocolo-cambios`](#protocolo-cambios) | Protocolo | Algo que ya funciona tiene que cambiar, incluidos los documentos de gobierno | **Sí** | Todos | No | | [`protocolo-cierre`](#protocolo-cierre) | Protocolo | Al cerrar cualquier tramo con commits | **Sí** | Todos | No | | [`protocolo-ux`](#protocolo-ux) | Protocolo | Al diseñar un feature con interfaz, antes de codear | No | `saas`, `landing`, `movil` | Sí | | [`test-fix`](#test-fix) | Oficio | Después de implementar, o cuando la suite falla | **Sí** | Todos | No | | [`version-bump`](#version-bump) | Oficio | Después de `protocolo-cierre`, para decidir el número de versión | **Sí** | Todos | No | | [`information-architecture`](#information-architecture) | Oficio | Al crear, mover o renombrar un módulo, ruta o ítem de navegación | No | `saas`, `movil` | Sí | | [`ux-writer`](#ux-writer) | Oficio | Al escribir cualquier texto visible | No | `saas`, `landing`, `movil` | Sí | | [`ux-audit`](#ux-audit) | Oficio | Antes de mergear frontend | No | `saas`, `landing`, `movil` | Sí | | [`i18n`](#i18n) | Oficio | Al agregar textos, plantillas o catálogos | No | Ninguno: sólo con `--skills` | No | **Por defecto** es lo que instala `init` sin entrevista y sin `--skills`: las cinco que no piden interfaz. **Perfiles** es lo que instala con entrevista, según la respuesta a «¿Qué clase de producto es?». Con `--skills todas` entran las once, y con `--skills` y una lista, exactamente ésas. El detalle está en [Qué skills instala](/docs/referencia/init/#qu%C3%A9-skills-instala). La columna «Se activa» es la misma que `init` escribe en el bloque de `AGENTS.md`. Las descripciones de cada sección son el `description` literal del `SKILL.md`, que es lo que el agente lee para decidir si la carga. Nota Cinco skills mandan al registro de decisiones, `docs/ADR.md`, cada decisión difícil de revertir: `protocolo-arranque`, `protocolo-features`, `protocolo-cambios`, `protocolo-cierre` e `information-architecture`. `protocolo-features` y `protocolo-cambios` además piden aprobación antes de tocar una Zona Prohibida. Los dos instrumentos se explican en [Gobierno del contexto](/docs/parte-2/gobierno-del-contexto/). *** ## Protocolos ### `protocolo-arranque` > Protocolo de arranque de un proyecto: del requerimiento en bruto a los artefactos que el desarrollo necesita. Descubrimiento con benchmark de mercado y cuestionamiento exhaustivo hasta cerrar todo vacío, decisión de stack con su fila de ADR, y generación de PRD, arquitectura, specs y guía de diseño a partir de los templates del paquete, en el repo y no en un adjunto. Activar cuando el proyecto todavía no está definido: hay una idea, un requerimiento o notas de reunión, y no hay PRD ni arquitectura escritos. Para implementar un feature de un proyecto ya definido, usar protocolo-features. **Qué escribe**, en este orden y cada documento desde su [template](/docs/apendices/templates/): la fila de la decisión de stack en `docs/ADR.md`; `docs/PRD.md`; `docs/ARQUITECTURA.md`; `docs/GUIA_DISENO.md` y `docs/COMPONENTES.md` si el producto tiene interfaz; una spec por módulo en `docs/specs/`, o una sola del sitio en una landing; `docs/TECH_NOTES.md`. Al final completa `AI-FIRST.md` y `AGENTS.md`, este último fuera de las marcas de `init`. No instala dependencias ni corre generadores. Lee primero `AI-FIRST.md`: el perfil decide qué artefactos escribe. Es la única que corre una sola vez por proyecto. Trae `references/artefactos-por-perfil.md`. Se explica en [La cadena de artefactos](/docs/parte-2/cadena-de-artefactos/) y se usa en [Arrancar un producto desde cero](/docs/guias/arrancar-un-producto/). [`SKILL.md`](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/protocolo-arranque/SKILL.md) ### `protocolo-features` > Protocolo de desarrollo de features nuevos: pre-implementación en 7 pasos (spec → inventario de reuso → diseño → UX → dependencias → contexto → secuencia), secuencia estricta de implementación por capas, validación incremental y checklists post-implementación. Comprueba Zonas Prohibidas antes de escribir código y manda al ADR las decisiones difíciles de revertir. Activar ANTES de implementar cualquier feature nuevo, página, módulo o endpoint. Para modificar algo que ya existe, usar protocolo-cambios. **Qué escribe:** el código del feature, en la secuencia de capas del proyecto, y una fila en `docs/ADR.md` si el feature tomó una decisión difícil de revertir. Da por hecha la spec que deja `protocolo-arranque`. La entrevista de `init` le escribe la secuencia, los comandos de verificación y si hay agentes en paralelo. Se explica en [Protocolo de desarrollo de features](/docs/parte-3/protocolo-features/) y se usa en [Desarrollar una feature](/docs/guias/desarrollar-una-feature/). [`SKILL.md`](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/protocolo-features/SKILL.md) ### `protocolo-cambios` > Protocolo para modificar features ya implementados: clasificación del cambio (corrección / ajuste / requerimiento / prioridad), flujo corto (1-2 archivos) vs. flujo completo (3+ archivos o cambio de schema), documento CHG-XXX obligatorio antes de tocar código, análisis de impacto, implementación por pasos en sesión limpia y cierre en el CHANGE\_LOG. Distingue el cambio, que se archiva, de la decisión arquitectónica, que va al ADR y sobrevive. Activar cuando algo que YA funciona necesita cambiar. **Qué escribe:** el documento del cambio en `docs/changes/pending/`, antes de tocar código, a partir del molde que trae en `references/documento-de-cambio.md`; ese documento es el que lee la verificación de [alcance excedido](/docs/referencia/verificaciones/#alcance-excedido). Al cerrar, su resumen en `docs/changes/CHANGE_LOG.md`, y el archivo de `pending/` se elimina. Si el cambio es además una decisión arquitectónica, una fila en `docs/ADR.md`. Se explica en [Protocolo de gestión de cambios](/docs/parte-3/protocolo-cambios/) y se usa en [Cambiar algo que ya funciona](/docs/guias/gestionar-un-cambio/). [`SKILL.md`](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/protocolo-cambios/SKILL.md) ### `protocolo-cierre` > Ejecuta la Fase A del protocolo de cierre de sesión: actualiza el SESSION\_LOG, actualiza los docs afectados y enruta los aprendizajes al destino correcto según el árbol de decisión del AGENTS.md, incluida la fila del ADR cuando la sesión tomó una decisión arquitectónica. Activar al terminar cualquier sesión de implementación, antes de hacer commit. Las Fases B (verificar) y C (commit) las hace el humano. **Qué escribe:** la entrada de la sesión en `docs/SESSION_LOG.md`, los documentos que la sesión dejó desactualizados, y cada aprendizaje en su destino: una fila en `docs/ADR.md` si se decidió algo, una cicatriz en `docs/TECH_NOTES.md`, un cambio cerrado en `docs/changes/CHANGE_LOG.md`. No hace el commit: verificar y firmar es del humano. Se explica en [Protocolo de cierre de sesión](/docs/parte-3/protocolo-cierre/) y se usa en [Cerrar la sesión](/docs/guias/cerrar-la-sesion/). [`SKILL.md`](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/protocolo-cierre/SKILL.md) ### `protocolo-ux` > Reglas de comportamiento e interacción: cuándo modal vs. página nueva, confirmaciones destructivas, navegación por capas (Browse → Create/Edit → Detail), patrones de tabla, formularios, toasts y los 4 estados obligatorios. Activar al DISEÑAR cómo debe comportarse un feature con interfaz — antes de escribir código. Define el QUÉ (comportamiento), no el CÓMO (implementación en el stack). **Qué escribe:** nada propio. Es una skill de criterio: decide cómo se comporta la interfaz antes de que exista, y la implementación la hace `protocolo-features`. Con entrevista, `init` le escribe dónde están la guía de diseño y el inventario de componentes, o que todavía no existen. Se explica en [Protocolo UX](/docs/parte-3/protocolo-ux/). [`SKILL.md`](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/protocolo-ux/SKILL.md) *** ## Skills de oficio ### `test-fix` > Corre los tests del alcance que la sesión tocó —unitarios e integración siempre; de extremo a extremo (E2E) sólo bajo decisión explícita—, clasifica cada falla en mecánica (se corrige sin preguntar) o de negocio (se pregunta), aplica la corrección mínima, con un tope de dos rondas, y corre la suite completa una sola vez al final. Activar después de implementar un feature o un cambio, cuando la suite falla y hay que diagnosticar, o como verificación antes del cierre de sesión. **Qué escribe:** la corrección mínima de cada falla mecánica, en el código o en la prueba. Una falla de negocio no la corrige: la reporta con la decisión que tiene que tomar el humano. Si tras dos rondas quedan fallas, para y reporta. La entrevista de `init` le escribe los comandos de la suite, de tipos y de lint. Se presenta en [Skills, hooks y gestión de contexto](/docs/parte-2/skills-hooks-contexto/). [`SKILL.md`](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/test-fix/SKILL.md) ### `version-bump` > Analiza los commits desde el último tag de versión, clasifica el cambio según SemVer (MAJOR/MINOR/PATCH), recomienda el bump apropiado y lo aplica actualizando los manifiestos del proyecto. Pide confirmación explícita antes de aplicar y NUNCA crea el tag — eso lo hace el humano. Activar al final de una sesión de implementación, después de protocolo-cierre. **Qué escribe:** el número de versión en todos los manifiestos del proyecto, después de tu confirmación, y la fecha de la entrada del CHANGELOG en el mismo commit, si el proyecto lleva uno. Nunca el tag. La entrevista de `init` le escribe cuál es el manifiesto. Se presenta en [Skills, hooks y gestión de contexto](/docs/parte-2/skills-hooks-contexto/). [`SKILL.md`](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/version-bump/SKILL.md) ### `information-architecture` > Arquitectura de información del producto: qué es una cosa, cómo se llama en cada capa y dónde vive. Reglas de naming (un concepto, un lema), navegación principal vs. configuración, agrupación, modelo de contenido (qué muestra una lista, cuándo un detalle lleva pestañas), relaciones entre módulos y cuándo un cambio de estructura es cambio formal. Activar al diseñar la ESTRUCTURA y el ETIQUETADO de un feature —crear un módulo o ruta, mover algo, renombrar, definir pestañas o columnas, agregar un ítem a la navegación— ANTES de protocolo-ux (comportamiento) y de tu ux-patterns (implementación). **Qué escribe:** nada propio. Decide la estructura sobre la que `protocolo-ux` define el comportamiento. Un cambio de estructura en algo que ya está en producción lo manda a `protocolo-cambios`, y a `docs/ADR.md` si la razón se va a preguntar en seis meses. Se menciona en [Protocolo UX](/docs/parte-3/protocolo-ux/). [`SKILL.md`](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/information-architecture/SKILL.md) ### `ux-writer` > Contenido, tono y voz del producto: glosario canónico de términos, registros por audiencia, reglas mecánicas de microcopy (botones, títulos, estados vacíos, errores, toasts, confirmaciones) y la regla de temperatura. Activar al escribir o editar CUALQUIER string visible — claves de i18n, plantillas de email y notificación, mensajes de error — y al auditar copy existente. **Qué escribe:** los textos visibles, según sus reglas. Trae cinco referencias —glosario, voz, superficies, inglés y deuda conocida— que se adaptan al producto: el glosario de otro proyecto no es el tuyo. Se presenta en [Skills, hooks y gestión de contexto](/docs/parte-2/skills-hooks-contexto/). [`SKILL.md`](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/ux-writer/SKILL.md) ### `ux-audit` > Auditoría UX/UI en cuatro capas: análisis estático automatizable (tokens, iconos, i18n, tipografía), validación de patrones de interacción por lectura de código, análisis visual con navegador headless + axe, y juicio subjetivo delegado. Produce un reporte con severidades. Activar antes de mergear un PR de frontend, como gate previo a un release, o ante un reporte de inconsistencia visual. **Qué escribe:** un reporte de auditoría con los hallazgos por severidad y una acción concreta por hallazgo. No corrige. Trae dos scripts para la primera capa, en `checks/`: el análisis estático y la fidelidad de los skeletons. Se presenta en [Skills, hooks y gestión de contexto](/docs/parte-2/skills-hooks-contexto/). [`SKILL.md`](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/ux-audit/SKILL.md) ### `i18n` > Las tres capas de internacionalización: strings de interfaz en el frontend, plantillas bilingües de email y notificación en el backend, y campos de etiqueta por idioma en la base de datos para datos dinámicos (roles, estados, catálogos). Activar al agregar cualquier string visible, plantilla de comunicación, campo de catálogo, o al formatear fechas, números y monedas. **Qué escribe:** los textos y etiquetas en todos los idiomas a la vez: ningún string nuevo se entrega en uno solo. Trae tres referencias, una por capa. Es la única que ningún perfil instala y para la que la entrevista no escribe adaptación. Se menciona en [GUIA\_DISEÑO.md — Documentación evolutiva](/docs/parte-2/guia-diseno/). [`SKILL.md`](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/i18n/SKILL.md) *** ## Cómo se relacionan ```text protocolo-arranque ──> information-architecture ──> protocolo-ux ──> ux-audit │ ▲ └──────────> protocolo-features ──┬──────────┘ ├──> ux-writer ────> i18n └──> test-fix protocolo-cambios ───┘ protocolo-cierre ────────> version-bump ``` Las flechas indican «invoca» o «asume cargada», no un orden de instalación obligatorio: cada skill funciona por separado. Si tu proyecto ya tiene una skill con el mismo nombre que una del paquete, `init` salta la del paquete entera. Qué hacer entonces está en [Adoptar en un proyecto existente](/docs/empezar/proyecto-existente/). ## Relacionado [Adaptar las skills a tu proyecto](/docs/guias/adaptar-las-skills/)Lo que escribe la entrevista y lo que queda por hacer a mano. [ai-first init](/docs/referencia/init/)Cómo se instalan, con qué opciones y qué perfil pide cuáles. [Templates](/docs/apendices/templates/)Los moldes de los que protocolo-arranque escribe cada documento. [Skills, hooks y gestión de contexto](/docs/parte-2/skills-hooks-contexto/)Por qué un protocolo rinde más como skill que como documento. # Templates > Los ocho templates de documento del paquete y el molde del documento de cambio: qué documento sale de cada uno, dónde vive y quién lo escribe. Un template es el molde de un documento del proyecto: trae la estructura, las secciones y lo que va en cada una. El paquete trae ocho, más el molde del documento de cambio, que vive dentro de su skill. Viajan en el paquete npm, en su carpeta `templates/`, y cada tarjeta de esta página abre el archivo tal como está publicado. ## Quién los usa **Los templates ya no se rellenan a mano.** `protocolo-arranque` escribe cada documento a partir del suyo, en su ruta definitiva del repo, después de un descubrimiento que cierra los vacíos y de registrar la decisión de stack en el ADR. El perfil del producto, que declara `AI-FIRST.md`, decide cuáles escribe: un producto sin interfaz no lleva guía de diseño ni inventario de componentes. Qué hace la skill está en [Las 11 skills](/docs/referencia/skills/#protocolo-arranque). | Template | Documento en tu proyecto | Lo escribe | Cuándo | | ------------------------------- | ---------------------------------------- | ------------------------------------------------------------------------------------------ | --------------------------------------------------------------- | | `PRD_TEMPLATE.md` | `docs/PRD.md` | `protocolo-arranque` | Siempre | | `ARQUITECTURA_TEMPLATE.md` | `docs/ARQUITECTURA.md` | `protocolo-arranque` | Siempre | | `SPEC_MODULO_TEMPLATE.md` | `docs/specs/.md` | `protocolo-arranque` | Una por módulo; en una landing, una sola, `docs/specs/sitio.md` | | `GUIA_DISENO_TEMPLATE.md` | `docs/GUIA_DISENO.md` | `protocolo-arranque` | Si el producto tiene interfaz: `saas`, `landing`, `movil` | | `COMPONENT_LIBRARY_TEMPLATE.md` | `docs/COMPONENTES.md` | `protocolo-arranque` | Si el producto tiene interfaz | | `TECH_NOTES_TEMPLATE.md` | `docs/TECH_NOTES.md` | `protocolo-arranque` | Siempre | | `AGENTS_MD_TEMPLATE.md` | `AGENTS.md` | `init` crea el archivo con su bloque; `protocolo-arranque` lo completa fuera de las marcas | Siempre | | `CLAUDE_MD_TEMPLATE.md` | `CLAUDE.md` | Tú: es una línea, `@AGENTS.md` | Si usas Claude Code | | `documento-de-cambio.md` | `docs/changes/pending/CHG-XXX_nombre.md` | `protocolo-cambios` | Al abrir cada cambio | Si prefieres escribir un documento sin la skill, el template sirve igual: copia el molde, reemplaza los marcadores `{...}` con lo de tu proyecto y quita las secciones marcadas `[OPCIONAL]` que no apliquen. Funcionan con cualquier agente, no sólo con Claude Code. ## Archivos de contexto Los que el agente lee al abrir cada sesión. [AGENTS\_MD\_TEMPLATE.md](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/templates/AGENTS_MD_TEMPLATE.md)Fuente de verdad cross-tool (\~150 líneas) [CLAUDE\_MD\_TEMPLATE.md](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/templates/CLAUDE_MD_TEMPLATE.md)Puntero liviano + ecosistema de archivos ## Documentos de definición Los que dicen qué se construye y cómo se ve, antes de escribir código. [PRD\_TEMPLATE.md](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/templates/PRD_TEMPLATE.md)PRD completo (10 secciones) [GUIA\_DISENO\_TEMPLATE.md](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/templates/GUIA_DISENO_TEMPLATE.md)Guía de diseño organizada por sistema: tokens, tipografía, layout en niveles, móvil, formularios y cicatrices (18 secciones) [SPEC\_MODULO\_TEMPLATE.md](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/templates/SPEC_MODULO_TEMPLATE.md)La spec autocontenida de un módulo, que la AI carga sólo cuando trabaja en él; con el índice de docs/specs/ como apéndice Cada spec lleva una sección «Archivos» o «Alcance» con las rutas entre acentos graves: es la que lee la verificación de [alcance excedido](/docs/referencia/verificaciones/#alcance-excedido). ## Documentos vivos Crecen con el proyecto y se mantienen en el mismo commit que el código. Son los que el capítulo [Gobierno del contexto](/docs/parte-2/gobierno-del-contexto/) nombra como destino de lo que se aprende, y los que `AI-FIRST.md` declara en `artefactos`. [ARQUITECTURA\_TEMPLATE.md](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/templates/ARQUITECTURA_TEMPLATE.md)Documento de estado del plano técnico: stack, capas y reglas de dependencia, mapa de módulos, ambientes. El porqué va al ADR [TECH\_NOTES\_TEMPLATE.md](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/templates/TECH_NOTES_TEMPLATE.md)Catálogo de cicatrices técnicas por stack: síntoma, causa, solución y fecha para poder podarlas [COMPONENT\_LIBRARY\_TEMPLATE.md](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/templates/COMPONENT_LIBRARY_TEMPLATE.md)Inventario vivo de componentes UI por capas: cuándo usar cada uno, cuándo no y qué usar en su lugar El inventario de componentes es el que vigila la [verificación 5](/docs/referencia/verificaciones/#inventario-de-componentes-desactualizado). Para que lo vigile, `AI-FIRST.md` necesita `artefactos.inventario_componentes` y `artefactos.componentes_dir`. ## El documento de cambio Los cuatro protocolos de la Parte III ya no se descargan como documento: su versión vigente es la skill. El de cambios exige producir un documento propio antes de tocar código, y éste es su molde: [documento-de-cambio.md](https://raw.githubusercontent.com/HoruxDeEdfu/falcux-ai-first-package/prod/skills/protocolo-cambios/references/documento-de-cambio.md)El CHG que el protocolo de cambios exige antes de tocar código: impacto, plan, validación y rollback. Vive dentro de su skill, que lo consulta al abrir un cambio Cada CHG nace en `docs/changes/pending/` del proyecto: ahí lo lee la verificación de alcance y ahí lo revisa un humano en el pull request. El molde vive dentro de la skill porque tiene una sola dueña; los demás templates se quedan aparte porque son documentos permanentes que el `AI-FIRST.md` declara. Nota **Las skills no se descargan desde aquí.** Las instala `init`, y el catálogo con el enlace a cada `SKILL.md` está en [Las 11 skills](/docs/referencia/skills/). Cómo instalarlas está en [Inicio rápido](/docs/empezar/inicio-rapido/), y cómo hacerlo en un repo que ya tiene las suyas, en [Adoptar en un proyecto existente](/docs/empezar/proyecto-existente/). ## Relacionado [Arrancar un producto desde cero](/docs/guias/arrancar-un-producto/)Cómo protocolo-arranque escribe estos documentos a partir de sus templates. [La cadena de artefactos](/docs/parte-2/cadena-de-artefactos/)Qué alimenta cada documento y en qué orden se escriben. [Las 11 skills](/docs/referencia/skills/)Las skills del paquete, con su enlace de descarga. # La metodología > El manual de Falcux AI-First. Doce capítulos en cuatro partes, de la justificación económica a la adopción en equipo. Doce capítulos en cuatro partes, de la justificación económica a la adopción en equipo. Explican el porqué de lo que el paquete instala: se leen en orden o se entra directo por el protocolo que haga falta hoy. ## ¿Por qué? 2 capítulos 1. [01El costo de no documentarPor qué documentar antes de codear tiene un ROI medible — con datos reales](/docs/parte-1/costo-de-no-documentar/) 2. [02AI-First no es vibe codingQué es el enfoque AI-First, los 4 roles del developer, y qué lo diferencia del vibe coding](/docs/parte-1/ai-first-no-es-vibe-coding/) ## Fundamentos 5 capítulos 1. [01La cadena de artefactosEl flujo completo: Idea → PRD → Arquitectura → Schema → Contexto AI → Código](/docs/parte-2/cadena-de-artefactos/) 2. [02AGENTS.md — El cerebro del proyectoTemplate y guía para crear el archivo de contexto principal para AI coding agents](/docs/parte-2/agents-md/) 3. [03Gobierno del contextoLos cuatro instrumentos que impiden que la documentación se despegue del proyecto: Zonas Prohibidas, registro de decisiones, permisos del repositorio y la medición de entropía](/docs/parte-2/gobierno-del-contexto/) 4. [04GUIA\_DISEÑO.md — Documentación evolutivaTemplate de guía de diseño que crece orgánicamente con el proyecto](/docs/parte-2/guia-diseno/) 5. [05Skills, hooks y gestión de contextoLas tres capas de optimización: conocimiento on-demand, automatización determinista, y contexto finito](/docs/parte-2/skills-hooks-contexto/) ## Protocolos 4 capítulos 1. [01Protocolo UXPatrones de comportamiento e interacción para que la AI produzca interfaces consistentes](/docs/parte-3/protocolo-ux/) 2. [02Protocolo de gestión de cambiosCómo modificar lo que ya funciona sin romperlo: clasificación, análisis de impacto e implementación por pasos](/docs/parte-3/protocolo-cambios/) 3. [03Protocolo de cierre de sesiónLas tres fases del cierre y por qué solo la primera es delegable a la AI](/docs/parte-3/protocolo-cierre/) 4. [04Protocolo de desarrollo de featuresDe la spec a la verificación: pre-implementación, secuencia estricta y checklists](/docs/parte-3/protocolo-features/) ## Escalar 1 capítulo 1. [01Escalar al equipo y costosCómo llevar la metodología de individual a equipo, y comparación de herramientas y costos](/docs/parte-4/escalar-y-costos/) # El costo de no documentar > Por qué documentar antes de codear tiene un ROI medible — con datos reales > *El argumento más fuerte a favor de documentar no es filosófico — es económico. Cada hora invertida en contexto ahorra días de retrabajo.* *** ## Tres historias, un patrón ### Historia 1: Los 5 restarts Un product designer con experiencia en desarrollo decide construir un MVP con AI coding agents. Inicializa el proyecto, describe la idea, y le pide al agente que implemente. Los primeros resultados se ven prometedores. Pero al probar, la mitad de la interfaz es decorativa — botones que no hacen nada, formularios que no envían, menús que no navegan. Cuando empieza a implementar las features reales, el agente cambia el diseño, duplica funcionalidades, y pierde el hilo de lo que ya existe. Llega un punto donde es imposible continuar. El proyecto es un collage de implementaciones parciales sin coherencia. La única opción es empezar de cero. Esto ocurre 5 veces. 5 restarts del mismo MVP. 2 sprints de trabajo perdido — no en código, sino buscando cómo hacer que la AI mantenga el contexto del proyecto entre sesiones. La solución no fue un mejor prompt ni una herramienta diferente. Fue documentar qué se estaba construyendo antes de pedirle a la AI que construyera. ### Historia 2: Las 11 horas Un tech lead recibe acceso a un AI coding agent para trabajar en un proyecto existente. El proyecto no tiene documentación de arquitectura, ni guía de diseño, ni archivo de contexto para la AI. El tech lead pasa 11 horas construyendo un solo prompt — intentando darle a la AI suficiente contexto sobre el proyecto para que pudiera ser útil. 11 horas para escribir un prompt. Ni una línea de código. Solo tratando de explicarle al agente qué era el proyecto, cómo estaba estructurado, y qué reglas seguir. En un proyecto con documentación, ese contexto ya habría existido en un AGENTS.md de 150 líneas que se lee en segundos. ### Historia 3: Las 2 horas Un equipo de tres personas — product owner, tech lead, y un developer — necesitan implementar una mejora en su producto de firma electrónica. El cliente quiere replicar una experiencia que ya existe en otro módulo de la aplicación. El proyecto tiene documentación: PRD, specs por módulo, guía de diseño, archivo de contexto para la AI. El equipo configura la sesión, le da el contexto al agente, y trabaja. En 2 horas, la mejora está implementada, probada, y lista para producción. Lo que en un flujo tradicional hubiera ocupado un sprint completo — estimación, desarrollo, testing, iteración — se resolvió en una mañana. *** ## El patrón Las tres historias tienen el mismo protagonista: un AI coding agent. La misma tecnología. La misma capacidad de generar código. La diferencia es una sola: **contexto previo documentado.** | Escenario | Documentación previa | Resultado | Tiempo | | -------------------- | -------------------- | ----------------------------- | ------------------ | | 5 restarts | Ninguna | MVP nunca terminado | 2 sprints perdidos | | Prompt del tech lead | Ninguna | 0 líneas de código producidas | 11 horas | | Mejora AutenTIC Sign | Completa | Feature en producción | 2 horas | El AI coding agent no se volvió más inteligente entre el primer escenario y el tercero. Lo que cambió fue la calidad del contexto que recibió. *** ## Por qué la documentación tradicional no alcanza La objeción inmediata es: “Pero los proyectos ya tienen documentación — README, comentarios en código, wikis.” Hay una diferencia fundamental entre documentación para humanos y documentación para AI coding agents. **Documentación para humanos** asume que el lector tiene contexto implícito. Un developer que lee un README sabe qué es una API REST, entiende las convenciones del framework, y puede inferir patrones del código existente. Los humanos son buenos llenando vacíos. **Documentación para AI coding agents** no puede asumir nada. El agente empieza cada sesión sin memoria de la anterior. No infiere convenciones — las sigue o las ignora dependiendo de si están escritas explícitamente. No “entiende” que “nunca hardcodear colores” es una regla del proyecto a menos que alguien se lo diga. Por eso un README típico no funciona como contexto para AI: dice qué es el proyecto y cómo instalarlo, pero no dice qué patrones seguir, qué errores evitar, ni cómo se ve el resultado esperado. La documentación que Falcux AI-First propone no reemplaza la documentación tradicional. La complementa con una capa diseñada específicamente para que un AI coding agent trabaje como un miembro del equipo que acaba de llegar y necesita saber las reglas del juego. *** ## El concepto: contexto como producto En desarrollo tradicional, la documentación es un subproducto del código. Se escribe después, si hay tiempo, y se abandona cuando queda obsoleta. En desarrollo AI-First, **el contexto es el producto principal.** El código es el subproducto. Esto suena contraintuitivo, pero la lógica es simple: la AI puede generar código a velocidades que ningún humano iguala. Lo que no puede hacer es decidir qué código generar, con qué convenciones, siguiendo qué patrones, respetando qué restricciones. Esas decisiones son humanas. Y la forma de comunicarlas a la AI es a través de documentos de contexto. Cuando inviertes tiempo en un PRD claro, un AGENTS.md con las reglas del proyecto, y una guía de diseño con los patrones visuales, no estás “documentando” — estás construyendo la interfaz entre tu criterio humano y la capacidad de ejecución de la AI. El código que la AI produce es tan bueno como el contexto que recibe. Invertir en contexto es invertir directamente en la calidad del código. *** ## La ecuación de tiempo La objeción que siempre aparece: “Todo eso suena bien, pero toma tiempo. Yo necesito shippear.” Hagamos la cuenta: **Sin documentación previa (vibe coding):** * Sesión 1: AI produce resultado que se ve bien pero no funciona → 2h perdidas * Sesión 2: Intento corregir, AI pierde contexto → 3h * Sesión 3: Inconsistencias de diseño, retrabajo → 2h * Sesión 4: Feature nuevo rompe feature anterior → 3h arreglando * Sesión 5: Pierdo la paciencia, restart → todo lo anterior perdido * Total por iteración: 10+ horas con resultado incierto * Con 5 restarts: 2 sprints sin un MVP funcional **Con cadena de artefactos:** * Preparación: PRD + AGENTS.md + schema → 2-4 horas (una vez) * Sesión 1: AI produce resultado consistente → 2h productivas * Sesión 2: Retoma donde quedó la anterior → 2h productivas * Sesión 3: Feature nuevo se integra sin romper → 2h productivas * Total: 8-10 horas con MVP funcional * Sin restarts: el proyecto avanza linealmente **La paradoja:** Invertir 2-4 horas en preparación antes de codear se siente como “perder tiempo”. Pero la alternativa — codear sin preparación — cuesta 10x más en retrabajo, correcciones, e inconsistencias. No se trata de documentar por documentar. Se trata de que cada hora invertida en contexto ahorra días de retrabajo. *** ## Para quién es esta metodología Falcux AI-First no es para todos. Es para equipos y personas que: * **Construyen productos, no experimentos.** Si estás probando una idea en una tarde y la vas a tirar mañana, no necesitas esto. Si estás construyendo algo que va a producción y que otros van a mantener, sí. * **Trabajan con AI coding agents como herramienta principal.** Si usas AI para autocompletar código (Copilot) pero el humano escribe el 80%, esta metodología es excesiva. Si la AI genera el 60-80% del código y el humano dirige y valida, esta metodología es esencial. * **Valoran consistencia sobre velocidad bruta.** El vibe coding es más rápido para la primera sesión. Falcux AI-First es más rápido para el proyecto completo. Si tu horizonte es “hoy”, vibecodeá. Si tu horizonte es “las próximas semanas o meses”, sigue leyendo. * **Están dispuestos a invertir en proceso.** No mucho — estamos hablando de 2-4 horas de preparación por proyecto, no de semanas de planificación. Pero esas horas de preparación existen, y hay que hacerlas. *** ## Lo que viene en este libro Este primer capítulo hizo el caso de negocio: documentar antes de codear tiene un ROI medible. El resto del libro explica cómo hacerlo. **Parte I** (este capítulo y el siguiente) establece el por qué y define qué significa “AI-First” como enfoque de desarrollo. **Parte II** detalla los fundamentos: la cadena de artefactos que produce el contexto, cómo estructurar el AGENTS.md, cómo construir una guía de diseño evolutiva, y cómo gestionar el contexto durante las sesiones. **Parte III** entrega los 4 protocolos operativos: consistencia de UX, gestión de cambios, cierre de sesión, y desarrollo de features. Cada uno es un proceso replicable con templates y checklists. **Parte IV** aborda la adopción en equipos: cómo pasar de un workflow individual a una práctica de equipo, y cómo elegir herramientas según presupuesto. **Los apéndices** incluyen todos los templates descargables, casos de estudio, y un glosario de términos. Puedes leer el libro de inicio a fin, o saltar directamente a la parte que necesites. Cada capítulo funciona por sí solo, pero todos se alimentan de la misma premisa: **El costo de no documentar es medible. Y siempre es más alto de lo que crees.** # AI-First no es vibe coding > Qué es el enfoque AI-First, los 4 roles del developer, y qué lo diferencia del vibe coding > *El developer AI-First no escribe código — diseña sistemas, dirige ejecución, cura contexto, y valida resultados. Los cuatro roles a la vez.* *** ## El espectro Hay un espectro en cómo los equipos usan AI para construir software. Los extremos son claros. El medio es donde está la oportunidad — y la confusión. ### Desarrollo tradicional El humano escribe todo el código. La AI, si aparece, es autocompletado inteligente — sugiere la siguiente línea, completa una función, genera un snippet. El humano toma el 95% de las decisiones y escribe el 95% del código. La AI es un asistente de escritura, no un constructor. Funciona. Es predecible. Pero no aprovecha lo que la AI puede hacer hoy. ### Vibe coding El humano describe una idea en lenguaje natural y la AI genera todo: frontend, backend, base de datos, estilos. El humano no planifica, no documenta, no estructura — simplemente pide y evalúa el resultado. Si se ve bien, avanza. Si no, pide correcciones o empieza de nuevo. El vibe coding tiene un atractivo innegable: la velocidad inicial es intoxicante. En 10 minutos tienes algo que se ve como un producto. El problema aparece en el minuto 11 — cuando quieres agregar la segunda feature y la AI no recuerda la primera, o cuando el diseño cambia con cada prompt, o cuando descubres que la mitad de la interfaz es decorativa. El vibe coding funciona para prototipos desechables, demos, y pruebas de concepto que nadie va a mantener. No funciona para productos que van a producción, que necesitan evolucionar, o que más de una persona va a tocar. ### AI-First (donde vive Falcux AI-First) El humano diseña el sistema, documenta el contexto, y define las reglas. La AI genera el 80-90% del código siguiendo ese contexto. El humano valida, corrige, y mantiene la documentación actualizada para la siguiente sesión. La diferencia con el vibe coding no es de grado — es de naturaleza. El vibe coder pide y espera. El developer AI-First prepara, dirige, y verifica. El vibe coder trabaja con prompts. El developer AI-First trabaja con sistemas de contexto. La diferencia con el desarrollo tradicional tampoco es de grado. El developer tradicional invierte su tiempo en escribir código. El developer AI-First invierte su tiempo en diseñar la arquitectura, curar el contexto, y validar los resultados. El código lo genera otro — y ese otro es extraordinariamente rápido pero necesita dirección clara. *** ## Los 4 roles del developer AI-First En desarrollo tradicional, un developer es fundamentalmente un escritor de código. En desarrollo AI-First, el código lo escribe la AI. Entonces, ¿qué hace el humano? Hace cuatro cosas, todo el tiempo, simultáneamente: ### Arquitecto Diseña la estructura del sistema antes de que exista una línea de código. Define las capas, los patrones, las tecnologías, y las restricciones. La AI puede proponer una arquitectura, pero la decisión de adoptarla — con sus tradeoffs de escalabilidad, mantenibilidad, y complejidad — es humana. El arquitecto responde: ¿cómo se estructura esto? En la práctica: escribe (o valida) el PRD, la arquitectura técnica, el schema de BD. Define la cadena de artefactos del capítulo anterior. Estas decisiones no son delegables porque dependen de contexto que la AI no tiene — el tamaño del equipo, el presupuesto, la experiencia disponible, las restricciones del negocio. ### Director Define qué se construye en cada sesión, en qué orden, y con qué restricciones. Le dice a la AI qué hacer, qué no tocar, y qué resultado esperar. No microgestiona cada línea — da la dirección y deja que la AI ejecute. El director responde: ¿qué hacemos ahora y cómo? En la práctica: prepara el prompt de implementación con contexto completo. Define la secuencia (schema → backend → frontend → tests). Divide features grandes en pasos pequeños. Detiene la sesión cuando la AI va por mal camino. Es el Protocolo de Desarrollo de Features en acción. ### Curador Mantiene el contexto del proyecto vivo y actualizado. Cada sesión de implementación produce conocimiento nuevo — gotchas descubiertos, patrones que funcionan, anti-patrones que se deben evitar. El curador captura ese conocimiento y lo integra en los documentos que la AI lee. El curador responde: ¿qué sabe la AI sobre este proyecto? En la práctica: mantiene el AGENTS.md con reglas críticas. Actualiza la guía de diseño con cada componente nuevo y cada gotcha. Agrega anti-patrones a “What NOT to Do” conforme se descubren. Ejecuta el Protocolo de Cierre de Sesión. Sin el curador, cada sesión empieza un poco más perdida que la anterior. ### Validador Revisa lo que la AI produce con criterio técnico y de producto. No lee cada línea de código — verifica que el resultado cumple la spec, que los tests pasan, que el diseño es consistente, y que no se rompió nada existente. El validador responde: ¿esto está bien? En la práctica: ejecuta los checklists post-implementación. Verifica que la documentación que la AI actualizó es precisa. Cruza el resultado con el PRD y la guía de diseño. Aprueba o rechaza antes de avanzar al siguiente paso. ### Los 4 roles no son secuenciales No se ejerce un rol y luego otro. En una sesión típica, el developer AI-First alterna entre los cuatro constantemente: ```plaintext "Vamos a implementar el módulo de tags" → Director "Seguir la clean architecture de 3 capas" → Arquitecto "No modificar el módulo de decisiones" → Director [AI implementa] "Los tests pasan, el endpoint responde bien" → Validador "Descubrí que ScrollArea necesita altura fija" → Curador (agrega gotcha) "Ahora el frontend, usar shadcn/ui" → Director [AI implementa] "El diseño no es consistente con la tabla anterior" → Validador "Agregar regla: siempre ícono de ojo para detalle" → Curador ``` Esta alternancia constante es lo que hace que el rol sea nuevo — no existe en el desarrollo tradicional porque el humano escribe el código en vez de dirigir a otro que lo escribe. *** ## Qué NO es AI-First ### No es “la AI hace todo sola” El developer AI-First no pone un prompt y se va a tomar café. Está presente durante toda la sesión, validando paso a paso, corrigiendo el rumbo, y tomando decisiones que la AI no puede tomar. La AI es el ejecutor más rápido que ha existido, pero sin dirección humana produce los mockups decorativos del capítulo anterior. ### No es reemplazar developers Un equipo AI-First no necesita menos developers — necesita developers con habilidades diferentes. Menos tiempo escribiendo for loops, más tiempo diseñando sistemas, definiendo arquitecturas, y manteniendo contexto. Las habilidades de programación siguen siendo necesarias para validar lo que la AI produce, entender los tradeoffs, y corregir errores que la AI no detecta. ### No es solo para developers Un product designer que entiende arquitectura y sabe validar código puede ser un developer AI-First efectivo. Un product owner que puede escribir specs claras y evaluar resultados puede dirigir sesiones de implementación. AI-First reduce la barrera de quién puede construir software, pero no la elimina — todavía hay que entender qué se está construyendo. ### No es una bala de plata Hay proyectos donde AI-First no funciona bien: sistemas legacy sin documentación (la AI no tiene contexto de dónde partir), investigación pura (no hay spec posible porque no se sabe qué se busca), código que requiere optimización de bajo nivel (la AI genera código funcional pero no necesariamente eficiente), y sistemas con requisitos de seguridad extremos (la AI puede introducir vulnerabilidades sutiles que un humano no detecta en la validación). *** ## DEV AI First: el enfoque dentro del enfoque Falcux AI-First es la metodología. DEV AI First es el enfoque de desarrollo que la metodología enseña. La distinción importa: **DEV AI First** como enfoque significa: diseñar todo el flujo de desarrollo asumiendo que la AI es el builder principal. No es “desarrollo tradicional con AI auxiliar” — es un flujo rediseñado desde cero donde: * La documentación se escribe para que la AI la entienda, no solo los humanos * La arquitectura se define antes del código, no emerge del código * Las convenciones se codifican explícitamente, no se asumen implícitamente * La verificación es sistemática, no ocasional * El contexto es un producto, no un subproducto Cuando un equipo adopta DEV AI First, no está “agregando AI a su proceso” — está cambiando su proceso para que la AI sea central. La cadena de artefactos, los protocolos, los templates — todo existe porque la AI es el builder principal y necesita una infraestructura de contexto para funcionar bien. *** ## El cambio de mentalidad La transición más difícil no es técnica. Es mental. En desarrollo tradicional, el valor del developer se mide en código producido. Más líneas, más commits, más features implementadas. Documentar se siente como “no trabajar” porque no produce código. En desarrollo AI-First, el valor del developer se mide en calidad de dirección. Un AGENTS.md bien escrito produce mejores resultados que 8 horas de vibe coding. Una guía de diseño con gotchas documentados evita horas de correcciones. Un protocolo de cambios previene regresiones. El cambio de mentalidad es: **tu trabajo más productivo ya no se ve como trabajo.** Las horas que inviertes preparando artefactos, curando contexto, y documentando anti-patrones son las horas que más impacto tienen en la calidad y velocidad del proyecto. Pero no se ven como “programar” — se ven como “documentar”. Equipos que no internalizan este cambio terminan con un developer que “vibecodeá rápido” y tres developers arreglando los problemas que el vibe coding creó. Equipos que sí lo internalizan terminan con un developer AI-First que produce el equivalente a un equipo completo — pero invierte la mitad de su tiempo en contexto, no en código. *** ## Dónde empieza el viaje Si vienes del vibe coding y quieres estructura: empieza por la cadena de artefactos (capítulo 3) y el template de AGENTS.md (capítulo 4). Solo eso ya transforma tu flujo. Si vienes del desarrollo tradicional y quieres velocidad: empieza por los protocolos (capítulos 7-10). Son procesos concretos que puedes adoptar mañana. Si eres un líder y quieres que tu equipo adopte esto: empieza por el caso de negocio (capítulo 1, que acabas de leer) y la guía de onboarding (capítulo 11). El resto del libro detalla cada pieza del sistema. Pero el fundamento es este capítulo y el anterior: documentar antes de codear tiene un ROI medible, y el developer AI-First es un rol nuevo que combina arquitectura, dirección, curaduría, y validación. El código lo escribe la AI. Tu trabajo es todo lo demás. # La cadena de artefactos > El flujo completo: Idea → PRD → Arquitectura → Schema → Contexto AI → Código > *Idea → PRD → Arquitectura → Schema → Contexto AI → Código* > > El flujo que convierte una idea en software funcional sin perder el hilo en el camino. *** ## La historia de los 5 restarts En mis primeros laboratorios con AI coding agents, el flujo era simple: inicializar un proyecto con un stack, describir una idea en un par de líneas, y pedirle al agente que implementara. El primer resultado siempre parecía prometedor. La UI aparecía rápido, con menús, botones, y secciones que se veían completas. Pero al probar, la realidad era otra: la mayoría de las opciones eran mockups — se veían pero no hacían nada. Botones decorativos. Formularios que no enviaban. Navegación que no llevaba a ningún lado. Lo peor venía después, cuando empezaba a implementar las features de verdad. La AI cambiaba el diseño cada vez que le pedía algo nuevo. Funcionalidades se duplicaban en distintas partes de la interfaz. Features nuevas aparecían visibles en la UI pero sin funcionalidad real, mientras las anteriores dejaban de funcionar. Y cuando pedía ajustar el diseño, la AI perdía el contexto de lo que ya existía. Llegaba un punto — siempre llegaba — donde era imposible continuar. El proyecto se había convertido en capas de implementaciones parciales, sin coherencia entre ellas. La única opción era empezar de cero. Tuve que reiniciar un mismo MVP al menos 5 veces. Cada restart era un intento de descubrir cómo mantener el contexto del proyecto a lo largo de múltiples sesiones de implementación. Lo que descubrí, después de esos 5 intentos, no fue un truco de prompting ni una configuración mágica. Fue algo más fundamental: **la AI necesita saber qué está construyendo antes de escribir la primera línea de código.** Y esa información no se puede dar en un párrafo — necesita una cadena de documentos, cada uno alimentando al siguiente. Esa cadena es lo que este capítulo documenta. *** ## La cadena completa ```plaintext Idea ↓ PRD (qué se construye y para quién) ↓ Arquitectura (cómo se estructura técnicamente) ↓ DB Schema (qué datos existen y cómo se relacionan) ↓ Contexto AI (AGENTS.md + GUIA_DISEÑO.md) ↓ Implementación con AI coding agent ↓ Documentación post-implementación ``` Cada eslabón produce un artefacto que el siguiente eslabón consume. Romper la cadena — saltar un eslabón — significa que la AI trabaja con información incompleta. A veces funciona. A veces produce los mockups decorativos del inicio de esta historia. *** ## Los eslabones en detalle ### Eslabón 1: PRD — El contrato de qué se construye **Qué es:** Un documento que describe el producto desde la perspectiva del usuario. Qué hace, para quién, qué problema resuelve, y cuáles son los límites de lo que se construye en esta fase. **Por qué es el eslabón más crítico:** De toda la cadena, el PRD es el único artefacto que no debería saltarse nunca. Sin PRD, la AI no tiene un norte. Puede generar código que funcione técnicamente pero que no resuelve el problema correcto, o que incluye features que nadie pidió mientras omite las que sí importan. **Quién lo produce:** Típicamente el PO o el product designer. En equipos pequeños, un LLM puede generar un borrador a partir de un documento de requerimientos o una descripción verbal — pero un humano debe validar que refleja lo que realmente se necesita. **Señales de un buen PRD para AI:** * Describe comportamiento esperado, no solo features (“el usuario puede registrar una decisión en 30 segundos” vs. “formulario de decisiones”) * Define explícitamente qué NO se incluye en esta fase * Lista criterios de aceptación verificables * Es independiente de la implementación técnica **El error más común:** PRDs generados por AI que agregan features que nadie pidió. El LLM tiende a “completar” lo que parece faltar basándose en patrones de productos similares. Siempre validar que cada feature listada fue explícitamente solicitada. **Formato:** Markdown (`docs/PRD.md`). Puede dividirse por módulo si el producto es grande (`docs/PRD-MODULE1.md`, `docs/PRD-MODULE2.md`). *** ### Eslabón 2: Arquitectura — El plano técnico **Qué es:** Un documento que define cómo se estructura el sistema: qué tecnologías se usan, cómo se organizan las capas, cómo fluyen los datos, cómo se maneja la autenticación, y qué patrones de diseño se siguen. **Por qué importa para la AI:** Sin un documento de arquitectura, la AI toma decisiones arquitectónicas por ti. A veces acierta. A veces crea un monolito cuando necesitas microservicios, o pone lógica de negocio en los controllers cuando debería ir en use cases. El documento de arquitectura elimina esa ambigüedad. **Quién lo produce:** El tech lead o el developer senior. Un LLM puede generar un borrador basado en el PRD + el stack elegido, pero las decisiones de arquitectura son inherentemente humanas — dependen de contexto que la AI no tiene (tamaño del equipo, presupuesto de infraestructura, experiencia del equipo, requisitos de escalabilidad). **Qué incluir como mínimo:** * Stack tecnológico con versiones * Patrón de arquitectura (monolito, clean architecture, microservicios, etc.) * Estructura del proyecto (monorepo, multi-repo, carpetas) * Flujo de autenticación * Patrones de comunicación entre módulos * Decisiones técnicas y sus justificaciones **Cuándo se puede saltar:** En prototipos muy rápidos donde el objetivo es validar una idea en horas, no construir algo mantenible. Pero hay que ser honesto: si saltas la arquitectura, estás aceptando deuda técnica desde el día uno. **Formato:** Markdown (`docs/ARQUITECTURA.md`). Es un documento de estado: describe cómo es el sistema hoy y se sobreescribe cuando cambia; el porqué de cada decisión va al `docs/ADR.md`. (Template: ARQUITECTURA\_TEMPLATE.md) *** ### Eslabón 3: DB Schema — La estructura de los datos **Qué es:** La definición de los modelos de datos, sus relaciones, y las reglas de integridad. En proyectos con Prisma, es el `schema.prisma`. En otros ORMs, sus equivalentes. **Por qué importa para la AI:** El schema de BD es el contrato más estricto del sistema. Si la AI empieza a implementar features sin saber qué datos existen y cómo se relacionan, va a inventar modelos sobre la marcha — y cada modelo inventado sobre la marcha es una migración futura que probablemente falle. **Quién lo produce:** Es el artefacto más variable. Tres escenarios comunes: 1. **El humano lo diseña completo:** Basándose en el PRD y la arquitectura, define los modelos antes de implementar. Máximo control, más tiempo. 2. **La AI lo propone, el humano valida:** Se le da el PRD y se le pide que proponga un schema. Rápido, pero hay que revisar con cuidado — la AI tiende a sobre-normalizar o crear relaciones que no se necesitan. 3. **Se define incrementalmente:** Se empieza con los modelos mínimos y se agregan conforme se implementan features. Funciona en MVPs, pero requiere disciplina en migraciones. **El gotcha de las migraciones:** Las migraciones de Prisma (y de otros ORMs) a veces fallan cuando la AI modifica el schema sin considerar los datos existentes. Esto es especialmente problemático cuando hay campos que pasan de opcionales a obligatorios, o cuando se renombran tablas. Documentar el estado actual del schema antes de cada cambio reduce significativamente estos problemas. **Formato:** El archivo del ORM (`packages/prisma/schema.prisma`) + documentación de las decisiones de modelado en `docs/ARQUITECTURA.md` o en la spec del módulo al que pertenecen (`docs/specs/.md`, una por módulo, con índice en `docs/specs/README.md`). (Template: SPEC\_MODULO\_TEMPLATE.md) *** ### Eslabón 4: Contexto AI — La interfaz entre el humano y el agente **Qué es:** Los archivos que le dan a la AI la información que necesita para trabajar en el proyecto: AGENTS.md (reglas, comandos, restricciones), GUIA\_DISEÑO.md (cómo debe verse y comportarse la UI), y skills (conocimiento especializado on-demand). **Por qué es donde todo converge:** Los tres eslabones anteriores (PRD, arquitectura, schema) producen conocimiento. El contexto AI es donde ese conocimiento se traduce a instrucciones que la AI puede seguir. Sin este eslabón, los documentos anteriores existen pero la AI no los consulta automáticamente. **Qué incluye:** * `AGENTS.md` — El cerebro del proyecto. Reglas críticas, comandos, estructura, “What NOT to Do”. Máximo \~150 líneas, el resto delegado a docs y skills. (Template: AGENTS\_MD\_TEMPLATE.md) * `GUIA_DISEÑO.md` — La guía visual. Tokens de color, tipografía, componentes, patrones de página, gotchas. Crece con el proyecto. (Template: GUIA\_DISENO\_TEMPLATE.md) * `.claude/skills/` (o equivalente) — Conocimiento especializado que se carga on-demand: clean architecture, testing, i18n, dominio del negocio. **El principio del AGENTS.md:** Cada línea debe responder a la pregunta “¿la AI cometería un error sin esta instrucción?” Si la respuesta es no, la línea no necesita estar ahí. **Cuándo se puede simplificar:** Para un prototipo rápido, un AGENTS.md mínimo con descripción del proyecto + stack + comandos + 5 reglas críticas es suficiente. La guía de diseño puede esperar hasta que haya UI que implementar. **Formato:** Markdown en la raíz del proyecto y en `docs/`. *** ### Eslabón 5: Implementación — Donde la AI trabaja **Qué es:** Las sesiones de implementación con el AI coding agent, siguiendo el Protocolo de Desarrollo de Features. **Cómo se alimenta de la cadena:** Cada sesión de implementación consume los artefactos anteriores: * El PRD le dice QUÉ construir * La arquitectura le dice CÓMO estructurarlo * El schema le dice QUÉ DATOS existen * El AGENTS.md le dice QUÉ REGLAS seguir * La GUIA\_DISEÑO le dice CÓMO DEBE VERSE Cuando todos los eslabones están en su lugar, la AI produce resultados consistentes desde el primer intento. Cuando falta alguno, la AI llena el vacío con suposiciones — y esas suposiciones son la causa de los mockups decorativos, las inconsistencias de diseño, y los restarts. *** ### Eslabón 6: Documentación post-implementación — Cerrar el loop **Qué es:** La actualización de la documentación después de cada sesión, siguiendo el Protocolo de Cierre de Sesión. **Por qué es un eslabón de la cadena y no un paso suelto:** La documentación que se produce al cerrar una sesión alimenta la siguiente sesión. El SESSION\_LOG.md le dice a la próxima sesión qué se hizo. Los anti-patrones descubiertos se agregan al AGENTS.md. Los gotchas de CSS se agregan a la GUIA\_DISEÑO. Lo que costó horas resolver y ya está resuelto va a `TECH_NOTES.md`, con fecha (Template: TECH\_NOTES\_TEMPLATE.md). Sin este eslabón, cada sesión empieza desde cero — que es exactamente lo que causaba los restarts. *** ## Los artefactos: quién los produce y con qué | Eslabón | Artefacto | Quién produce | Con qué herramienta | | ------------------- | ------------------------------- | ------------------------------------------------- | -------------------------------------------------- | | PRD | `docs/PRD.md` | PO/Designer valida, LLM puede generar borrador | Claude.ai, ChatGPT, o cualquier LLM conversacional | | Arquitectura | `docs/ARQUITECTURA.md` | Tech lead/Dev senior decide, LLM puede documentar | LLM + conocimiento humano del contexto | | Schema | `schema.prisma` o equivalente | Variable: humano, AI propone, o incremental | Claude Code, herramienta de diseño de BD | | Contexto AI | `AGENTS.md` + `GUIA_DISEÑO.md` | Humano estructura, AI puede llenar detalles | Editor de texto + templates de Falcux AI-First | | Implementación | Código fuente | AI coding agent ejecuta, humano valida | Claude Code, Antigravity, Cursor, etc. | | Post-implementación | SESSION\_LOG, docs actualizados | AI documenta, humano verifica | El mismo AI coding agent de la sesión | **Patrón predominante:** El humano define la estructura y valida. El LLM genera el contenido detallado. Esto aplica a casi todos los eslabones — la AI es excelente produciendo texto estructurado a partir de una dirección clara, pero mala decidiendo qué dirección tomar. *** ## Qué pasa cuando saltas un eslabón No todos los eslabones son obligatorios en todas las circunstancias. Pero saltar un eslabón tiene consecuencias predecibles: | Eslabón saltado | Consecuencia más probable | Cuándo es aceptable saltarlo | | ------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------ | | PRD | La AI implementa features que nadie pidió o ignora las que sí importan | Nunca — siempre tener al menos una spec mínima | | Arquitectura | La AI toma decisiones de arquitectura inconsistentes entre sesiones | Prototipos de validación rápida (menos de 1 día) | | Schema | Migraciones que fallan, modelos inventados sobre la marcha | Cuando la AI propone y el humano valida inmediatamente | | AGENTS.md | La AI no respeta convenciones, repite errores ya conocidos | Nunca en proyectos con más de 1 sesión | | GUIA\_DISEÑO | Inconsistencia visual, cada componente se ve diferente | Primera sesión de un MVP (se crea durante, no antes) | | Post-implementación | La siguiente sesión no tiene contexto, pendientes se pierden | Cambios triviales (fix de typo, ajuste cosmético) | **La regla práctica:** En un MVP rápido, el mínimo absoluto es PRD + AGENTS.md mínimo. Todo lo demás acelera la calidad pero no es bloqueante para empezar. Conforme el proyecto crece, la deuda de artefactos faltantes se acumula — y pagarla después siempre cuesta más que crearlos desde el inicio. *** ## La cadena adaptada por contexto No todos los proyectos necesitan la cadena completa al mismo nivel de detalle. ### Prototipo rápido (validar idea en horas) ```plaintext Idea → Spec mínima (1 página) → AGENTS.md mínimo (50 líneas) → Implementar → Evaluar ``` Se saltan: arquitectura formal, schema previo, guía de diseño. Se aceptan las consecuencias: la AI va a tomar atajos. El objetivo no es calidad — es velocidad de validación. ### MVP serio (construir algo que se shippea) ```plaintext Idea → PRD → Arquitectura → Schema → AGENTS.md completo + GUIA_DISEÑO básica → Implementar por features → Docs post-sesión ``` Todos los eslabones presentes. La guía de diseño empieza básica (tokens, layout, breakpoints) y crece con cada feature implementado. ### Producto en crecimiento (equipo, múltiples features en paralelo) ```plaintext PRD por módulo → Arquitectura viva → Schema con migraciones controladas → AGENTS.md + skills + GUIA_DISEÑO madura → Protocolos completos (features, cambios, cierre, UX) ``` La cadena completa con los 4 protocolos activos. El AGENTS.md delega a skills para mantener el contexto ligero. La guía de diseño tiene cientos de líneas documentando cada componente y gotcha. *** ## El costo de la cadena vs. el costo de no tenerla La objeción más común: “Esto es mucho trabajo antes de empezar a codear.” La respuesta está en los números: **Sin cadena de artefactos:** * 5 restarts de un MVP buscando cómo mantener contexto * 11 horas de un tech lead construyendo un prompt para un proyecto sin documentación * Features tipo mockup que hay que reimplementar * Inconsistencias de diseño que hay que corregir sesión tras sesión **Con cadena de artefactos:** * 2 horas implementando algo que hubiera tomado un sprint * Features que funcionan desde el primer intento * Sesiones que retoman donde quedó la anterior sin perder contexto * Una guía de diseño de 1134 líneas que crece sola mientras se construye El tiempo que inviertes en artefactos previos no es overhead — es la diferencia entre construir sobre una base sólida y construir sobre arena. *** ## Resumen accionable 1. **Siempre** empieza con un PRD o spec mínima — nunca le pidas a la AI que implemente una idea sin documentar qué es. 2. **El AGENTS.md es obligatorio** a partir de la segunda sesión — sin él, cada sesión es un restart parcial. 3. **Deja que la AI genere borradores** de PRD, arquitectura, y schema — pero valida todo antes de implementar. En un producto nuevo, la skill `protocolo-arranque` los escribe en el repo desde los templates del paquete: ver [Arrancar un producto desde cero](/docs/guias/arrancar-un-producto/). 4. **La guía de diseño crece con el proyecto** — no intentes escribirla completa al inicio. Empieza con tokens y layout, agrega componentes y gotchas conforme aparecen. 5. **Cierra cada sesión actualizando la documentación** — el eslabón de post-implementación es lo que hace que la cadena sea un ciclo, no una línea recta. 6. **Adapta la cadena al contexto** — un prototipo no necesita lo mismo que un producto en producción. Pero sé consciente de qué estás saltando y qué deuda estás asumiendo. # AGENTS.md — El cerebro del proyecto > Template y guía para crear el archivo de contexto principal para AI coding agents > Este template define la estructura recomendada para el archivo AGENTS.md (o equivalente). El CLAUDE.md debe contener únicamente: `@AGENTS.md` > > **Principio:** Máximo \~150 líneas en este archivo. Todo conocimiento especializado va en skills (.claude/skills/) o documentación referenciada. Cada línea aquí debe responder a: “¿La AI cometería un error sin esta instrucción?” *** ## Cómo usar este template 1. Copiar este archivo como `AGENTS.md` en la raíz del proyecto 2. Crear `CLAUDE.md` con solo: `@AGENTS.md` 3. Reemplazar los placeholders `{...}` con información del proyecto 4. Eliminar las secciones marcadas como `[OPCIONAL]` si no aplican 5. Mover conocimiento extenso a skills o docs referenciados ### Convención de archivos ```plaintext CLAUDE.md → Solo referencia: @AGENTS.md (Claude Code) AGENTS.md → Fuente de verdad cross-tool (este archivo) ``` Para herramientas que no soportan AGENTS.md (Antigravity, Lovable, etc.), copiar el contenido relevante en el campo de contexto del proyecto. ### El template viaja en el paquete Este template es `AGENTS_MD_TEMPLATE.md` y viaja en la carpeta `templates/` del paquete `@falcux/ai-first`. En un producto nuevo no hace falta copiarlo a mano: la skill `protocolo-arranque` escribe el AGENTS.md desde él, al final del arranque, cuando ya se conocen el stack, la arquitectura y los comandos. El recorrido está en [Arrancar un producto desde cero](/docs/guias/arrancar-un-producto/). ### El bloque que mantiene `init` `npx @falcux/ai-first@latest init` no redacta tu AGENTS.md: le agrega un bloque entre `` y `` con las skills instaladas, cuándo invocar cada una y dónde escribe cada una. Si el archivo no existía, lo crea con ese bloque y un puntero a este template; si existía, pone el bloque al final. Cada corrida lo reescribe con lo que encuentra instalado, y fuera de las marcas no toca nada. La regla que sale de ahí: lo tuyo va fuera de las marcas, y lo de adentro no se edita a mano, porque la próxima corrida lo pisa. Qué más escribe `init` está en [Qué deja init en tu repo](/docs/empezar/que-instala/). *** # {Nombre del Proyecto} > {Descripción en 1-2 líneas: qué es, para quién, qué problema resuelve.} **Dominio:** {URLs de producción si existen} ## Estructura del Monorepo ```plaintext {nombre}/ ├── apps/ │ ├── web/ → {Framework frontend} │ └── api/ → {Framework backend} ├── packages/ │ ├── ui/ → {Librería de componentes} │ ├── shared/ → {Schemas, types, constantes} │ └── prisma/ → {ORM schema, migraciones} ├── docs/ → {Documentación del proyecto} │ ├── PRD.md │ ├── GUIA_DISENO.md │ ├── ARQUITECTURA.md │ └── changes/ → Protocolo de gestión de cambios │ ├── CHANGE_LOG.md │ └── pending/ └── CLAUDE.md → @AGENTS.md ``` ## Tech Stack **Frontend:** {Framework, form library, validación, UI library, CSS, i18n, iconos, testing} **Backend:** {Framework, ORM, validación, auth strategy, scheduling, docs API, testing} **Auth:** {Proveedor → mecanismo → estrategia en backend} **Servicios:** {Email, billing, monitoring, etc.} **Infra:** {Hosting frontend, hosting backend, DB, Auth provider} **Monorepo:** {Package manager, orchestrator, TS config} ## Comandos ```bash # Desarrollo {comando dev} # {descripción} {comando build} # {descripción} {comando lint} # {descripción} {comando typecheck} # {descripción} # Testing {comando test frontend} # {descripción} {comando test backend} # {descripción} # Base de datos {comando migraciones} # {descripción} {comando seed} # {descripción} {comando studio/GUI} # {descripción} # UI Components [si aplica] {comando agregar componente} # {descripción + notas} ``` ## Reglas Críticas > Solo incluir reglas que la AI violaría sin esta instrucción. Para reglas extensas, crear un skill en .claude/skills/ ### Arquitectura * {Regla 1 — patrón arquitectónico principal y qué NUNCA violar} * {Regla 2 — dependencias permitidas entre capas} * {Regla 3 — dónde va la lógica de negocio} ### Multi-tenancy \[si aplica] * {Regla de aislamiento de datos entre tenants} * {Cómo se obtiene el tenant\_id} ### UI y Diseño * {Regla de tokens — NUNCA hardcodear colores} * {Regla de tipografía o peso de fuente} * {Referencia a guía de diseño}: ver `docs/GUIA_DISENO.md` * {Referencia a protocolo UX}: ver la skill `protocolo-ux` ### i18n \[si aplica] * {Regla de no hardcodear strings} * {Referencia a skill o convenciones}: ver `.claude/skills/i18n-patterns/` ### ORM / Base de datos * {Convención de naming — snake\_case, @map, etc.} * {Campos obligatorios por modelo — id, timestamps, tenant\_id} * {Soft delete u otras convenciones} ### Git * Ramas: `{patrón de ramas}` * Commits: `{patrón de commits}` ## Protocolo de Desarrollo de Features (OBLIGATORIO) Antes de escribir código para cualquier feature nueva: 1. **Leer** `docs/GUIA_DISENO.md` — aplicar tokens, patrones, layout 2. **Consultar** la skill `protocolo-ux` — verificar navegación por capas, interacciones 3. **\[Si aplica] Lanzar agente especializado** — `{nombre del agente}` para validar enfoque 4. **Verificar** {verificaciones pre-implementación: i18n, tipos, etc.} 5. **Implementar** por pasos pequeños, validando después de cada uno 6. **Después de implementar:** ejecutar `{comando de verificación}` + actualizar docs ### Gestión de cambios post-implementación Para cambios de requerimientos en features existentes, se activa la skill `protocolo-cambios`. NUNCA implementar un cambio sin documento CHG-XXX previo. ## Documentación > Listar TODOS los documentos que la AI debe conocer, agrupados por función. ### Especificaciones del producto * `docs/PRD.md` — {descripción breve} * `docs/ARQUITECTURA.md` — {descripción breve} * `docs/specs/\{modulo\}.md` — Specs autocontenidas, una por módulo; cargar la del módulo en curso \[si existen] ### Diseño y UX * `docs/GUIA_DISENO.md` — Guía de diseño del proyecto (tokens, componentes, gotchas) * `docs/COMPONENT_LIBRARY.md` — Inventario de componentes UI \[si existe] ### Gestión de cambios * `docs/changes/CHANGE_LOG.md` — Registro histórico de cambios * `docs/changes/pending/` — Cambios en proceso ### Requerimientos externos \[si aplica] * `docs/requerimientos/{archivo}` — {descripción} ## What NOT to Do > Anti-patrones descubiertos durante el desarrollo. Cada línea existe porque la AI ya cometió este error al menos una vez. * NO {anti-patrón 1 — framework/librería} * NO {anti-patrón 2 — arquitectura} * NO {anti-patrón 3 — UI/diseño} * NO {anti-patrón 4 — base de datos} * NO {anti-patrón 5 — navegación/UX} * NO {anti-patrón 6 — tooling/build} > Mantener esta lista viva: agregar nuevos anti-patrones conforme se descubren. ## Agent Teams \[OPCIONAL — si se usan equipos de agentes] > Activar con la configuración correspondiente de la herramienta. Definir roles solo si el proyecto tiene backend + frontend + tests separables. * **Backend Agent**: {scope, reglas, archivos que puede tocar} * **Frontend Agent**: {scope, reglas, archivos que puede tocar} * **Test Agent**: {scope, reglas, qué valida} Regla: cada agente respeta su scope. Schemas compartidos viven en {paquete compartido}. ## Skills \[OPCIONAL — si la herramienta soporta skills] > Skills cargan conocimiento on-demand sin inflar este archivo. * `.agents/skills/{nombre}/` — {descripción} * `.agents/skills/{nombre}/` — {descripción} ## Estado Actual \[OPCIONAL pero recomendado] > Fase actual del proyecto. Ayuda a la AI a entender qué existe y qué no. **Fase actual:** {nombre y descripción de la fase} **Completado:** {resumen de lo que ya está implementado} **En progreso:** {qué se está construyendo ahora} **Pendiente:** {qué NO implementar todavía} *** # Notas sobre el template ## Secciones obligatorias (mínimo viable) 1. Descripción del proyecto (1-2 líneas) 2. Estructura del repo (árbol) 3. Tech stack (1 línea por capa) 4. Comandos (los que se usan día a día) 5. Reglas críticas (solo las que la AI violaría sin ellas) 6. Documentación (mapa de docs) 7. What NOT to do (anti-patrones reales) ## Secciones recomendadas 8. Protocolo de desarrollo de features 9. Estado actual del proyecto ## Secciones opcionales 10. Agent teams (si se usan) 11. Skills (si la herramienta los soporta) ## Criterio para incluir vs. delegar | Pregunta | Sí → inline | No → delegar | | ----------------------------------------- | ----------- | -------------------- | | ¿La AI comete errores sin esto? | ✓ | | | ¿Aplica a TODAS las tareas? | ✓ | | | ¿Son menos de 5 líneas? | ✓ | | | ¿Es conocimiento de dominio extenso? | | → skill | | ¿Son specs detalladas de un módulo? | | → doc referenciado | | ¿Son reglas de diseño con tokens/valores? | | → GUIA\_DISENO.md | | ¿Son endpoints o páginas? | | → doc referenciado | | ¿Son reglas de negocio extensas? | | → PRD o doc dedicado | ## Señales de que tu AGENTS.md es demasiado largo * Más de 200 líneas → mover conocimiento a skills * La AI empieza a ignorar reglas del final del archivo → priorizar, mover lo menos crítico * Tienes secciones que solo aplican a ciertos módulos → convertir en skill * El archivo tiene código de ejemplo extenso → mover a doc referenciado # Gobierno del contexto > Los cuatro instrumentos que impiden que la documentación se despegue del proyecto: Zonas Prohibidas, registro de decisiones, permisos del repositorio y la medición de entropía > *La cadena de artefactos resuelve cómo empezar bien. El gobierno del contexto resuelve cómo seguir bien doscientas sesiones después.* Nota **Varias skills del paquete ejecutan lo que este capítulo prescribe.** Cinco dan por hecho el `docs/ADR.md` y le mandan cada decisión arquitectónica como fila nueva: `protocolo-arranque`, `protocolo-features`, `protocolo-cambios`, `protocolo-cierre` e `information-architecture`. La primera es anterior a los cuatro protocolos de la Parte III: abre el registro con la decisión de stack y declara en `AI-FIRST.md` las Zonas Prohibidas que la arquitectura crea. Es también la única que corre una sola vez por proyecto, o una vez por giro grande de producto; las otras cuatro son recurrentes. Dos, `protocolo-features` y `protocolo-cambios`, además piden aprobación antes de tocar una Zona Prohibida. La matriz de permisos no la invoca ninguna: es un instrumento para humanos. Si este capítulo cambia, esas skills se revisan con él. [Ver las skills del paquete](/docs/referencia/skills/) *** ## El problema que aparece en el mes cuatro Los capítulos anteriores resuelven el arranque: una cadena de artefactos que alimenta a la AI, un AGENTS.md que le da reglas, una guía de diseño que crece con el proyecto. Con eso, un proyecto nuevo deja de tener restarts. Pero hay un segundo problema, y no aparece en la primera semana. Aparece cuando el proyecto lleva meses, cientos de sesiones y más de una persona trabajando encima. El AGENTS.md dice que la lógica de negocio va en los casos de uso — y hace seis semanas alguien la puso en un controller porque tenía prisa, y nadie actualizó nada. La guía de diseño documenta un componente que se renombró en marzo. El PRD apunta a una spec que se borró. Y cuando alguien pregunta por qué la cola de trabajos usa este proveedor y no aquel, nadie se acuerda: la decisión se tomó en una sesión de agosto y su justificación, si quedó escrita, está en alguna parte de un registro de veintisiete mil líneas. Nada de eso rompe el build. Todo eso hace que la AI trabaje con información falsa. **Esa distancia entre lo que el proyecto documenta y lo que el proyecto es se llama entropía documental.** No es desorden: es un desajuste que crece solo, porque el código cambia en cada sesión y la documentación solo cambia cuando alguien se acuerda. La diferencia entre las dos velocidades es la entropía. El gobierno del contexto es el conjunto de instrumentos que la mantienen acotada. *** ## El síntoma que nadie mide Un dato de un proyecto real —un CRM de compliance multi-tenant, en producción, construido enteramente con esta metodología— para ver la escala del problema: | Artefacto | Tamaño | | ---------------- | -------------------------------------------- | | `SESSION_LOG.md` | 27.682 líneas, 626 sesiones | | `TECH_NOTES.md` | 1.587 líneas de gotchas por stack | | Cambios formales | 385 documentos `CHG-XXX` | | `AGENTS.md` | 201 líneas, contra un techo declarado de 200 | Ese proyecto está bien documentado. Tiene los cuatro protocolos activos, cierra cada sesión y enruta sus aprendizajes con un árbol de decisión explícito. No es un caso de negligencia — es lo que pasa cuando la metodología funciona durante meses. Y aun así: si alguien pregunta hoy por qué se eligió un patrón de arquitectura sobre otro, la respuesta está enterrada en una de las 626 entradas del registro o en uno de los 385 cambios. No hay índice. Buscarla cuesta más que volver a decidir, así que en la práctica nadie la busca — y la decisión se vuelve a tomar, a veces al revés. El `AGENTS.md` de ese proyecto tiene un árbol de decisión de documentación con siete destinos. Vale la pena leerlo con atención, porque es bueno: | Tipo de contenido | Destino | | ----------------------------------------------- | ------------------------------ | | Invariante arquitectónico o convención vigente | `AGENTS.md` | | Fix histórico, cicatriz de una librería o stack | `TECH_NOTES.md` | | Estado de fase, progreso, lo pendiente | `SESSION_LOG.md` | | Cambio formal con diseño y rollback | `CHG-XXX.md` → `CHANGE_LOG.md` | | Reglas de diseño, UX, microinteracciones | `GUIA_DISENO.md` | | Detalles de un módulo | `specs/{modulo}.md` | | Arquitectura, pilares, stack | `ARQUITECTURA.md` | Siete destinos, y **ninguno responde «por qué se eligió esto en vez de aquello»**. Están el qué es la regla, el qué se rompió, el qué pasó, el qué cambió, el cómo se ve, el qué hace el módulo y el cómo está armado. Falta el porqué. Esa fila faltante es el primero de los cuatro instrumentos que siguen. *** ## Instrumento 1 — Zonas Prohibidas Una Zona Prohibida es una ruta o un patrón del repositorio que el agente no modifica sin aprobación explícita. Migraciones de base de datos, infraestructura, secretos, archivos de licencia. La instrucción en sí no es nueva: cualquiera le ha escrito a un agente «no toques la carpeta de migraciones». Lo que cambia es dónde vive. Escrita en un prompt, dura lo que dura la ventana de contexto y se pierde en la sesión siguiente. Declarada como sección del AGENTS.md, la lee cualquier agente en cualquier herramienta, al abrir la sesión y sin que nadie se acuerde de repetirla. ```markdown ## Zonas Prohibidas No se modifican sin aprobación explícita: /migrations esquema vivo en producción /infra terraform, DNS y secretos .env* credenciales ``` **Qué la distingue de un `.gitignore` o de un CODEOWNERS.** Ninguno de los dos sirve para esto. Un `.gitignore` saca el archivo del control de versiones, que es lo contrario de lo que se quiere: una migración tiene que estar versionada. Un CODEOWNERS pide revisión de una persona al abrir un PR, cuando el cambio ya está hecho. Una Zona Prohibida no impide el cambio ni espera al PR: lo **hace visible en el momento**, para que un humano decida antes de que el trabajo se acumule encima. La regla práctica al declararlas: una Zona Prohibida se justifica cuando el costo de revertir un error ahí es desproporcionado respecto al costo de pedir permiso. Una migración mal ordenada contra una base con datos de producción no se revierte sin ventana de mantenimiento. Un componente mal escrito se reescribe en diez minutos. El primero es zona prohibida; el segundo, no. Declarar demasiadas las vuelve ruido, y el ruido se ignora. *** ## Instrumento 2 — El registro de decisiones Un ADR —*Architecture Decision Record*— es el registro de por qué se tomó una decisión, qué alternativas se descartaron y qué consecuencias trajo. Una fila por decisión, en orden, sin borrar nunca. La idea no es de esta metodología: los ADR existen desde hace años. Lo que este capítulo agrega es dónde encajan en la cadena de artefactos y por qué ninguno de los artefactos anteriores los reemplaza. ### Por qué no lo cubre nada de lo que ya hay * **`ARQUITECTURA.md` no lo cubre.** Es un documento de estado: describe cómo está armado el sistema hoy. Cuando la decisión cambia, el documento se reescribe y la justificación anterior se sobrescribe. Queda el qué y se pierde el porqué — justo lo que hace falta para saber si la decisión sigue siendo válida o si su premisa ya no aplica. * **`TECH_NOTES.md` no lo cubre.** Guarda cicatrices: qué se rompió y cómo se arregló. «Prisma genera los tipos pero no el cliente que corre» es un hallazgo, no una decisión. No hubo alternativas que evaluar. * **`SESSION_LOG.md` no lo cubre.** Es cronología. La decisión aparece ahí mezclada con todo lo demás que pasó ese día, y a las seiscientas sesiones es inencontrable. * **`CHG-XXX` no lo cubre.** Documenta un cambio a algo que ya funciona, con su diseño y su rollback. Muchos cambios no son decisiones arquitectónicas, y varias decisiones arquitectónicas no pasan por un cambio formal. ### Qué entra y qué no Un ADR se justifica cuando la decisión cumple las tres condiciones: 1. **Es difícil de revertir.** Si deshacerla cuesta una tarde, no hace falta registrarla. 2. **Tenía alternativas reales que se descartaron.** Si no había otra opción, no hubo decisión: hubo una restricción. 3. **Alguien va a preguntar por qué dentro de seis meses.** Es el filtro que más descarta. | Sí es ADR | No es ADR | | --------------------------------------------------- | ------------------------------------------ | | Elegir Postgres sobre Mongo | Subir una versión menor de una librería | | Pasar de una cola propia a un servicio administrado | Arreglar un gotcha de la librería de turno | | Que el dominio no importe de infraestructura | Cambiar el color de un botón | | Adoptar monorepo | Modificar un feature que ya funciona | Las cuatro de la derecha tienen destino en el árbol: `SESSION_LOG`, `TECH_NOTES`, `GUIA_DISENO` y `CHG-XXX`, respectivamente. ### El formato ```markdown ## ADR-007 — La cola de trabajos pasa a un servicio administrado - **Fecha:** 2026-09-12 - **Estado:** aceptada - **Supera a:** ADR-003 **Contexto.** La cola propia sobre Postgres aguantaba 200 trabajos por minuto y el pico de cierre de mes llegó a 1.400. Escalarla significaba operar reintentos, visibilidad y letra muerta a mano. **Decisión.** Se adopta el servicio administrado con cola de letra muerta. El módulo de cola pasa a ser un adaptador. **Alternativas.** Redis con una librería de colas: menos latencia, pero suma una pieza que hay que operar. Subir la cola propia: más barato hoy, y nos deja manteniendo infraestructura que no es el producto. **Consecuencias.** Dependemos del proveedor en una pieza más. Los tests de integración necesitan un doble local. El costo de infraestructura sube. ``` **Un ADR no se edita cuando cambias de opinión.** Se agrega uno nuevo que lo supera, y el viejo queda marcado como superado con el enlace al que lo reemplaza. Editarlo destruye la única información que el artefacto existe para conservar: que en su momento, con la información de entonces, esa decisión tenía sentido. Es un registro, no un estado. Es lo que lo hace distinto de todo lo demás en la cadena. *** ## Instrumento 3 — Permisos del repositorio Quién puede modificar qué parte del repositorio: personas, equipos y agentes. Una tabla, versionada junto al código. ```markdown | Superficie | Quién modifica | Agentes | |---------------------|-----------------------------|----------------| | `packages/prisma/` | backend | con aprobación | | `packages/ui/` | diseño y frontend | sí | | `infra/` | solo la persona de infra | no | | `docs/ADR.md` | quien toma la decisión | solo propone | ``` La columna que no existe en ninguna herramienta de control de acceso es la tercera. Los permisos de un repositorio se diseñaron para personas: un agente que trabaja bajo las credenciales de quien lo ejecuta hereda todos sus permisos, y no hay forma de decir «esta persona sí, pero su agente no». Esta tabla es lo que llena ese hueco, y por eso es un documento y no una configuración. Cuidado con el nombre En muchos productos ya existe una «matriz de permisos» que significa otra cosa: los roles y permisos **de la aplicación** —quién aprueba, quién consulta, quién administra—, que es un artefacto del producto y suele vivir en `docs/`. Son dos tablas distintas con el mismo nombre y conviven sin problema, pero conviene titular esta explícitamente **«Permisos del repositorio»** para que nadie las confunda al buscar. **Cuándo hace falta.** Trabajando solo, no hace falta: la tabla diría lo mismo en todas las filas. Empieza a pagar cuando hay más de una persona y más de un agente sobre el mismo repositorio, que es exactamente donde aparecen los conflictos que nadie atribuye a nadie. *** ## Instrumento 4 — Medir la entropía Los tres instrumentos anteriores declaran. Este verifica que la declaración siga siendo cierta, porque una Zona Prohibida que nadie comprueba es una advertencia enterrada en un documento, que es donde empezamos. La clave es que las verificaciones corran **en código puro** —control de versiones, sistema de archivos y expresiones regulares—, sin modelo y sin API key. Tres razones: no cuesta tokens, es determinista (la misma entrada da el mismo resultado, siempre), y sale con código de salida, así que el mismo comando sirve en un hook local y en integración continua. Cinco verificaciones cubren la mayor parte del desajuste real, y sólo una corta el flujo: tocar una Zona Prohibida. Las otras avisan de una decisión que llegó al código sin llegar al registro, de un alcance que creció más de lo que la spec declaraba, de documentos que apuntan a cosas que ya no existen y de una librería de componentes que cambió sin que su inventario se enterara. Tres de las cinco son deterministas y no admiten discusión: una ruta cambió o no cambió, un archivo referenciado existe o no existe, un componente aparece en el inventario o no. La que detecta decisiones no lo es, porque «se tomó una decisión arquitectónica» no cabe en una expresión regular; se resuelve declarando en qué superficies un cambio se presume decisión, en vez de adivinarlo, y tiene que poder silenciarse con una anotación en el commit. Una verificación que no se puede silenciar termina desactivada entera, que es peor que tenerla ruidosa. Los hallazgos se resumen en un número de 0 a 100 que **mide entropía, no salud**: 0 es documentación alineada, y un solo P0 mueve la aguja por sí solo, porque una Zona Prohibida tocada no se compensa con documentación impecable en todo lo demás. El valor no está en el número sino en la serie: ver en un PR que la entropía pasó de 12 a 68 dice algo que ninguna lista de hallazgos dice con la misma fuerza. Todo eso ya corre: es `npx @falcux/ai-first@latest audit`, y `init` deja escritos los dos puntos donde se mide, un hook de git `pre-push` que sólo corta ante un P0 y un flujo de integración continua que corre con `--estricto` en cada pull request. Es un hook de git, no del agente. Qué detecta cada verificación y con qué severidad está en [Las cinco verificaciones](/docs/referencia/verificaciones/); las opciones, el puntaje y los códigos de salida, en [`ai-first audit`](/docs/referencia/audit/); cómo montarlo, en [Auditar en local y en CI](/docs/guias/auditar-en-local-y-en-ci/). Los cuatro instrumentos de este capítulo no dependen del comando: las Zonas Prohibidas, el registro de decisiones y la tabla de permisos son documentos que se escriben a mano, y `audit` los verifica, no los redacta. *** ## Qué no es gobierno del contexto * **No es control de acceso.** Nada de esto impide técnicamente un cambio. Lo hace visible. Un agente decidido a tocar una Zona Prohibida puede hacerlo; lo que no puede es que pase inadvertido. * **No es más documentación.** Es la documentación que ya existe, con los cuatro huecos que deja tapados. Si al agregar estos instrumentos el proyecto termina con más páginas que nadie lee, se aplicó mal. * **No reemplaza a los protocolos.** Los cuatro protocolos de la Parte III siguen siendo cómo se trabaja. El gobierno del contexto es qué se declara y qué se verifica, que es otra cosa. * **No sirve en la primera semana.** En un proyecto de dos sesiones no hay entropía que medir. Esto empieza a pagar cuando hay historia que perder. *** ## Resumen accionable 1. **Declara las Zonas Prohibidas en el AGENTS.md**, no en un prompt. El criterio es el costo de revertir un error, no la importancia del archivo. Pocas, o se vuelven ruido. 2. **Abre un `docs/ADR.md` hoy, aunque empiece vacío.** Es el artefacto que ninguno de los otros cubre, y el único cuyo valor depende de haberlo empezado temprano: un registro de decisiones que arranca en el mes seis nace con seis meses de huecos. 3. **Una decisión entra al ADR si es difícil de revertir, tenía alternativas reales y alguien va a preguntar por qué.** Las tres, no dos. 4. **Nunca edites un ADR para cambiar de opinión.** Agrega uno nuevo que lo supere. La justificación vieja es información, no basura. 5. **Agrega la tabla de permisos cuando entre la segunda persona**, no antes. Su columna útil es la de los agentes, que ninguna herramienta de control de acceso tiene. 6. **Lo que no se verifica, se degrada.** Cualquier verificación que corra en código puro y salga con código de salida sirve — empieza por las deterministas, que se montan en una tarde y no admiten discusión. # GUIA_DISEÑO.md — Documentación evolutiva > Template de guía de diseño que crece orgánicamente con el proyecto > Este template define la estructura recomendada para la guía de diseño de un proyecto construido con AI coding agents. Está extraído de la GUIA\_DISENO.md de Virso (1134 líneas co-creadas con Claude Code durante 5 fases de implementación). > > **Principio:** Este documento es EVOLUTIVO. No se escribe completo al inicio. Se empieza con las secciones obligatorias y crece conforme se implementa. Cada sesión de implementación puede agregar gotchas, componentes, o patrones nuevos. > > **Relación con otros documentos:** > > * la skill `protocolo-ux` = principios agnósticos (Capa 1, no cambia entre proyectos) > * `GUIA_DISENO.md` = especificaciones de proyecto (Capa 2, este documento, único por proyecto) *** ## Cómo usar este template 1. Copiar como `docs/GUIA_DISENO.md` en tu proyecto 2. Llenar las secciones marcadas como **\[OBLIGATORIO]** antes de la primera sesión de implementación de UI 3. Las secciones **\[CRECE CON EL PROYECTO]** se van llenando conforme se implementa 4. Las secciones **\[OPCIONAL]** se agregan si el proyecto las necesita 5. Eliminar toda la guía de uso y los comentarios `` cuando el documento esté en uso Este template es `GUIA_DISENO_TEMPLATE.md` y viaja en la carpeta `templates/` del paquete `@falcux/ai-first`. En un producto nuevo con interfaz no hace falta copiarlo a mano: la skill `protocolo-arranque` escribe `docs/GUIA_DISENO.md` desde él, después de la arquitectura y antes de las specs. Un producto sin interfaz no la lleva. El recorrido está en [Arrancar un producto desde cero](/docs/guias/arrancar-un-producto/). *** ## Índice 1. [Paleta de colores](#1-paleta-de-colores) — OBLIGATORIO 2. [Tipografía](#2-tipograf%C3%ADa) — OBLIGATORIO 3. [Espaciado y bordes](#3-espaciado-y-bordes) — OBLIGATORIO 4. [Sistema de temas](#4-sistema-de-temas) — OBLIGATORIO si hay dark mode 5. [Layout principal](#5-layout-principal) — OBLIGATORIO 6. [Componentes UI](#6-componentes-ui) — CRECE CON EL PROYECTO 7. [Patrones de página](#7-patrones-de-p%C3%A1gina) — CRECE CON EL PROYECTO 8. [Animaciones y motion](#8-animaciones-y-motion) — OPCIONAL 9. [Iconografía](#9-iconograf%C3%ADa) — OBLIGATORIO 10. [Accesibilidad](#10-accesibilidad) — OBLIGATORIO 11. [Internacionalización](#11-internacionalizaci%C3%B3n) — OPCIONAL 12. [Gotchas del framework CSS](#12-gotchas-del-framework-css) — CRECE CON EL PROYECTO 13. [Responsive design](#13-responsive-design) — OBLIGATORIO 14. [Estructura de archivos UI](#14-estructura-de-archivos-ui) — OBLIGATORIO 15. [Efectos visuales especiales](#15-efectos-visuales-especiales) — OPCIONAL 16. [Checklist para nuevas funcionalidades](#16-checklist-para-nuevas-funcionalidades) — OBLIGATORIO *** ## Principio fundamental **{Tu principio fundamental de diseño aquí.}** *** ## 1. Paleta de colores \[OBLIGATORIO] ### 1.1 Colores principales | Rol | Valor | Uso | | -------------------------- | --------- | ------------------------------- | | **Primary** | `{valor}` | CTAs, active states, highlights | | **Primary Foreground** | `{valor}` | Texto sobre fondo primary | | **Destructive** | `{valor}` | Acciones destructivas | | **Destructive Foreground** | `{valor}` | Texto sobre fondo destructive | ### 1.2 Reglas de contraste * {Color problemático}: ratio {X:1} contra {fondo}. Solución: {token alternativo} * **Regla:** `{clase para texto de marca}` para texto legible, NUNCA `{clase primary}` sobre fondos claros ### 1.3 Tokens del tema ```css /* Copiar los tokens CSS de tu proyecto aquí. Esto es la referencia definitiva para la AI. */ /* Light theme */ --color-primary: {valor}; --color-background: {valor}; --color-foreground: {valor}; --color-card: {valor}; --color-card-foreground: {valor}; --color-muted: {valor}; --color-muted-foreground: {valor}; --color-border: {valor}; /* ... */ /* Dark theme (si aplica) */ /* ... */ ``` ### 1.4 Tokens semánticos de estado \[CRECE CON EL PROYECTO] | Token | Uso | Light | Dark | | -------------------- | ------------- | --------- | --------- | | `{--color-status-x}` | {descripción} | `{valor}` | `{valor}` | ### 1.5 Fondos semánticos (transparencias) \[CRECE CON EL PROYECTO] | Contexto | Background | Border | Hover | | ---------- | --------------- | ------------------- | --------------------- | | Badges | `bg-{color}/8` | `border-{color}/15` | — | | Botones | `bg-{color}/10` | `border-{color}/20` | `hover:bg-{color}/15` | | Containers | `bg-{color}/8` | `border-{color}/15` | — | *** ## 2. Tipografía \[OBLIGATORIO] ### 2.1 Font stacks ```css --font-sans: {fuente body}, ui-sans-serif, system-ui, sans-serif; --font-heading: {fuente headings}, {fallback}; /* --font-mono: {fuente mono}; /* si aplica */ ``` ### 2.2 Escala tipográfica | Nivel | Clases | Uso | | ------- | ---------- | ------------------------ | | H1 | `{clases}` | {dónde se usa} | | H2 | `{clases}` | {dónde se usa} | | H3 | `{clases}` | {dónde se usa} | | Body | `{clases}` | Texto general | | Caption | `{clases}` | Fechas, hints, metadatos | | Label | `{clases}` | Labels de formularios | ### 2.3 Reglas * {Fuente} en todos los headings y títulos * Nunca `{peso prohibido}` (ej: font-thin, font-light) * {Otras reglas tipográficas del proyecto} *** ## 3. Espaciado y bordes \[OBLIGATORIO] ### 3.1 Border radius | Token | Valor | Uso | | ------ | ------- | ------------------ | | `{sm}` | {valor} | Badges, chips | | `{md}` | {valor} | Buttons, inputs | | `{lg}` | {valor} | Cards, dialogs | | `{xl}` | {valor} | Containers grandes | **Patrón:** `{radio grande}` para containers, `{radio pequeño}` para controles internos. ### 3.2 Sombras ```css --shadow-card: {valor light}; /* light */ --shadow-card: {valor dark}; /* dark (si aplica) */ ``` ### 3.3 Espaciado común | Contexto | Valor | | ----------------------- | ------- | | Padding de página | {valor} | | Gap entre cards | {valor} | | Padding interno de card | {valor} | | Margin entre secciones | {valor} | *** ## 4. Sistema de temas \[OBLIGATORIO si hay dark mode] ### 4.1 Arquitectura ```plaintext {Librería de temas} con {estrategia (class/attribute)}, defaultTheme="{default}" ``` ### 4.2 Reglas de adaptación entre modos | Aspecto | Light mode | Dark mode | | --------------- | ------------- | ------------- | | Fondo del botón | {descripción} | {descripción} | | Saturación | {descripción} | {descripción} | | Texto del botón | {descripción} | {descripción} | | Sombras | {descripción} | {descripción} | **Fórmula para nuevos colores:** {ej: subir lightness +0.07, bajar chroma -0.03, invertir foreground} ### 4.3 Qué NO hacer * NO dejar el mismo color idéntico en ambos modos * NO invertir el color simplemente * {Otras reglas específicas del proyecto} *** ## 5. Layout principal \[OBLIGATORIO] ### 5.1 Estructura ```plaintext {Diagrama ASCII del layout principal} Ejemplo: SidebarProvider ├── Sidebar (collapsible) └── ContentArea ├── TopBar (sticky, header) └── main (contenido scrolleable) ``` ### 5.2 Sidebar * **Modo:** {collapsible, fixed, drawer, etc.} * **Ancho expandido:** {valor} * **Ancho colapsado:** {valor} * **Mobile:** {Sheet, drawer, overlay, etc.} * **Persistencia:** {cookie, localStorage, etc.} * **Keyboard shortcut:** {atajo} ### 5.3 TopBar / Header ```plaintext {Diagrama ASCII del header} ``` ### 5.4 Focus layout (segundo nivel) \[si aplica] | Layout | Route group | Casos de uso | | ----------- | ----------- | ------------ | | Con sidebar | `{grupo}` | {ejemplos} | | Sin sidebar | `{grupo}` | {ejemplos} | #### Header del focus layout ```plaintext {variante 1} → {descripción} {variante 2} → {descripción} ``` *** ## 6. Componentes UI \[CRECE CON EL PROYECTO] ### 6.1 Biblioteca base {Cantidad} componentes en `{ruta}`: {Lista de componentes} ### 6.2 Componentes con reglas especiales #### {Nombre del componente} * **Variantes:** {listar} * **Regla especial:** {lo que la AI debe saber} * **Gotcha:** {error común al usarlo} *** ## 7. Patrones de página \[CRECE CON EL PROYECTO] ### 7.1 {Nombre del patrón} (ej: Auth Pages) {Descripción breve del layout y comportamiento} ### 7.2 {Nombre del patrón} (ej: Listado con filtros) {Descripción breve del layout y comportamiento} ### 7.3 Empty state {Icono} + heading + subtítulo + CTA *** ## 8. Animaciones y motion \[OPCIONAL] ### 8.1 Keyframes | Nombre | Efecto | Duración | | -------- | ------------- | ---------- | | {nombre} | {descripción} | {duración} | ### 8.2 Reglas * Solo animar `transform` y `opacity` para 60fps * Duraciones: {micro}ms (micro), {standard}ms (transiciones), {entrance}ms (entradas) * NO animar `height`, `width`, `top`, `left` * `will-change: transform` solo donde sea estrictamente necesario ### 8.3 Reduced motion ```css @media (prefers-reduced-motion: reduce) { /* Desactivar todas las animaciones */ } ``` *** ## 9. Iconografía \[OBLIGATORIO] **Librería:** {nombre} — única librería de iconos. | Contexto | Tamaño | | ------------- | -------- | | Nav items | {clases} | | Card metadata | {clases} | | Headings | {clases} | | Empty state | {clases} | * Iconos decorativos: `aria-hidden="true"` * NO mezclar librerías de iconos *** ## 10. Accesibilidad \[OBLIGATORIO] ### 10.1 Contraste WCAG AA * Texto normal: 4.5:1 mínimo * Texto grande: 3:1 mínimo * {Notas específicas del proyecto sobre contraste} ### 10.2 Focus visible Todos los interactivos: `{clases de focus}` ### 10.3 ARIA patterns | Pattern | Uso | | --------------------- | ------------------------------ | | `aria-label` | Botones de solo ícono | | `aria-current="page"` | Nav link activo | | `aria-hidden="true"` | Iconos decorativos | | `aria-describedby` | Inputs vinculados a error | | `aria-invalid` | Inputs con error de validación | | `role="alert"` | Mensajes de error dinámicos | | `role="status"` | Indicadores de carga | ### 10.4 Formularios accesibles ```tsx {código de ejemplo de tu stack} ``` ### 10.5 Landmarks | Landmark | Ubicación | | ---------- | --------- | | `
` | {dónde} | | `
` | {dónde} | | `