Documentación de equipo

Casos prácticos: legacy vs. proyecto nuevo

El archivo que se envía. Cada ficha es un ticket de hoy: qué decirle al chat, qué modelo, qué ya tiene que estar en AGENTS.md. No es la enciclopedia.

Septiembre 2026 · Consultora / producto genérico. Sin nombres de cliente ni de un portfolio concreto.

Elegí el río: código que ya está, o repo que todavía no tiene features.

Dos columnas. Un click.

Índice: guia-inicio.html. Prompts para pegar: casos/prompts-base.md. Manual (solo “ver más”): guia-agentes-reglas-y-modelos.html.

Código que ya está

Legacy (14 casos)

Importante — clave 7: no reescribir. Lista: Puntos clave.

El código mezcla capas, faltan tests, el estilo es el del vecino. El ticket gana si el diff cabe en una review de 15 minutos.

L1 · Bug de producción, sin reescribir el módulo

Legacy React

Un síntoma. Los componentes ya existen.

Contexto

Catálogo en producción. Al cambiar la categoría con página > 1, la grilla queda vacía: FilterBar actualiza el filtro y ProductList sigue pidiendo page=4. El contrato HTTP no cambia. No hay ticket de login ni de rediseño.

Pasos

  1. Chat: nuevo, workspace en la raíz. Un síntoma. No reusar el hilo de ayer.
  2. Modelo: rápido (Composer / Grok). pensar solo si el estado vive en tres padres.
  3. AGENTS.md: mapa src/pages/, src/components/, src/api/; “solo lo que el ticket nombra”; no store ni admin; si hay spec, extenderlo.

Prompt

Plantilla completa: prompts-base R1. Corto:

Bug acotado. No rediseñes.
Síntoma: [al cambiar categoría con page>1 la grilla queda vacía].
Componentes: [FilterBar, ProductList, Pagination].
Tocá solo esos archivos y el spec si existe.
Al cambiar filtro, page = 1. Sin login, store ni cliente HTTP nuevo.

Ventajas

  • Diff de tres componentes que el equipo ya conoce.
  • El modelo rápido alcanza si el mapa está escrito.
  • No toca el contrato HTTP.

Desventajas

  • Sin acotar, el rápido “mejora” media app.
  • Opus acá puede proponer un rediseño de estado.
  • Si el filtro vive en tres padres, deja de ser local.

DoD

Categoría con page > 1 vuelve a página 1. Mismos componentes, mismo rol. Spec tocado en rojo→verde si existía. Sin commit.

Fallo típico: Zustand “para el filtro”, una ruta de admin, o extraer un hook genérico de tres pantallas.

Ver más: #tr-react-bug · ficha react-bug-acotado.md.

L2 · Endpoint Spring en las capas que ya hay

Legacy Java

GET nuevo. Mismo controller, service y repository.

Contexto

Spring Boot en marcha. Ticket: GET /api/shipments/{id}/events. Ya existen Shipment, el repository y un controller con el GET del envío. Hay que agregar lectura, no un bounded context.

Pasos

  1. Chat: nuevo. Nombrá el GET vecino a copiar. Un solo artefacto.
  2. Modelo: rápido con el vecino. pensar si propone módulo Maven o hexagonal.
  3. AGENTS.md: controller delgado → service → repository → DTO; no *Entity en JSON; JUnit del patrón del módulo; un deploy.

Prompt

prompts-base J1. Corto:

Endpoint nuevo, mismas capas que el vecino. Un Spring Boot.
GET /api/shipments/{id}/events. Paquete de shipments, no "events-service".
Controller sin SQL. JSON = DTO. JUnit como el GET vecino.

Ventajas

  • El patrón ya está: copiar el GET hermano.
  • Composer alcanza si el MD nombra las tres capas.
  • Un test de service o WebMvcTest cierra el contrato.

Desventajas

  • El atajo (SQL en el controller) compila.
  • Opus sin mapa rediseña “bien” el servicio.
  • Sin JUnit en el MD, queda “probado a mano”.

DoD

El GET responde DTO. Tres tipos (controller / service / repository). Camino feliz + “no existe” si ese 404 ya es convención. ./mvnw test en el módulo. Sin segundo Boot.

Fallo típico: @Query en el controller, devolver *Entity, o un segundo @SpringBootApplication.

Ver más: #tr-java-endpoint · java-spring-endpoint.md.

L3 · No partir el monolito en microservicios

Legacy Java

Un campo. Un JAR. Nadie pidió Kafka.

Contexto

Facturación: un deploy, un esquema, paquetes invoice, customer, mail. Ticket: persistir notes (texto corto) en la tabla que ya existe. El código mezcla un poco las capas; el backlog no pide split.

Pasos

  1. Chat: ticket literal (“campo notes, mismos archivos que dueDate”). Si ya apareció un *-service, chat nuevo, no negociar el split.
  2. Modelo: rápido para el campo. pensar solo para decir “no hace falta un proceso nuevo”.
  3. AGENTS.md: “un Spring Boot, un artefacto”; campo en el paquete dueño; prohibido segundo Boot, Kafka, hexagonalizar de paso.

Prompt

prompts-base J2.

Ventajas

  • Una línea “un deploy” evita un proyecto de infra fantasma.
  • El campo llega en un PR de 15 minutos.
  • Se puede tocar un mapper sin migrar el monolito.

Desventajas

  • El legacy sigue mezclado; el MD no lo limpia.
  • Un prompt vago (“mejorá facturación”) autoriza el rediseño.
  • Opus es peligroso si el pedido dice “mejorá la arquitectura”.

DoD

Campo ida y vuelta en el API existente. Migración solo si el equipo ya versiona schema. Cero procesos nuevos. Sin commit.

Fallo típico: invoice-service, docker-compose de cuatro servicios y un ADR de microservicios para un string.

Ver más: #tr-java-legacy · java-spring-legacy.md.

L4 · Mismo patrón que el vecino (Android / Angular)

Legacy Android / Angular

Copiá el archivo de al lado. No el del tutorial.

Contexto

App Android en MVVM, o front Angular con features por carpeta. Ticket chico: un campo más en la lista, un diálogo de confirmación, un método en el servicio que ya lista. Hay un vecino que hace exactamente eso. El riesgo no es “no saber el framework”: es que el agente traiga Compose Navigation nueva, un HttpClient en el componente, o una Activity gorda “porque es más simple”.

Pasos

  1. Chat: nombrá el path del vecino. “Mismo paquete, mismo estilo. No inventes capa.”
  2. Modelo: rápido si el vecino es obvio. pensar (T3) si duda entre Activity gorda y ViewModel.
  3. AGENTS.md: Android: ViewModel sin Views; HTTP en el repositorio/capa de datos. Angular: el componente no usa HttpClient; pasa por fachada/repositorio. “No crear árbol features/ o módulo nuevo si el disco no lo tiene.”

Prompt

Angular: A1. Android: D1. Si reescribe el toolkit: D2 / A3. Corto:

Mismo patrón que el vecino. No el del tutorial.

Vecino a copiar: [OrderListViewModel / pedidos.service.ts / path].
Ticket: [campo visible en la fila / diálogo al confirmar].
Android: el ViewModel no importa Activity/Fragment; el diálogo lo muestra la vista.
Angular: HTTP solo en el servicio/fachada, no en el .ts de la plantilla.
No Navigation Component nuevo, no módulo Angular nuevo, no librería.
Listá archivos (máximo los del paquete) y esperá OK de una línea.

Ventajas

  • El review compara con un archivo que ya pasó QA.
  • Haiku/Composer copian bien si el vecino está nombrado.
  • No se cuela un segundo estilo en el mismo módulo.

Desventajas

  • Si el vecino ya está mal, el agente multiplica el atajo.
  • Sin path concreto, trae “best practice” de 2024.
  • Un modelo capaz justifica Compose/signals “para modernizar”.

DoD

El diff se lee al lado del vecino: mismos nombres, misma capa. Cero librerías nuevas. El diálogo o el campo se puede demo en el flujo existente.

Fallo típico: lógica en la Activity; HttpClient en el componente; o un módulo shared-ui/ “para reutilizar el diálogo”.

Ver más: #arquitectura · Angular A1 · Android D1 · si duda el patrón, T3.

L5 · Faltan tests: agregá uno, no reescribas la suite

Legacy React Java

El módulo viejo casi no tiene specs. Un caso del invariante.

Contexto

El arreglo ya está (o va en el mismo PR). El módulo tiene cero tests, o tres verdes que no cubren el síntoma. El equipo no pidió “cobertura del paquete” ni migrar de JUnit 4 a 5, ni de Jest a Vitest.

Pasos

  1. Chat: “un caso en el spec que ya existe, o un archivo junto al código, estilo vecino”. Corré solo ese path.
  2. Modelo: rápido. pensar solo si hay que elegir unit vs. e2e — y igual no instales Playwright de paso.
  3. AGENTS.md: comando (npm test / ./mvnw test); “no reescribir tests verdes”; “cambio de invariante → test”; runner del disco, no otro.

Prompt

Front: prompts-base R5. Java: J4.

Ventajas

  • Un spec vecino es más barato que una suite nueva.
  • CI atrapa la regresión sin un rewrite de infra.
  • El review ve rojo→verde en un archivo.

Desventajas

  • El rápido declara “es chico” y saltea el test.
  • Pedir 100% genera tests que repiten la implementación.
  • @SpringBootTest de 40 s para un if si no era la convención.

DoD

El caso nuevo falla en HEAD (o si revertís el fix) y pasa con el arreglo. Comando y salida pegados. Cero infra nueva de test. Sin commit.

Fallo típico: carpeta __tests__/ nueva, snapshots del árbol, @Disabled, o reescribir 20 tests verdes para esconder un refactor.

Ver más: #tr-react-tests · #tr-java-junit.

L6 · Primero leer (Opus), después un parche chico (Composer)

Legacy React Java

Exploración de solo lectura. Plan cerrado. Chat B implementa.

Contexto

El módulo es grande y el síntoma no es obvio (estado duplicado, regla de anulación, un job que toca mail y persistencia). Un solo hilo “pensá y codeá” termina moviendo carpetas. El equipo quiere entender el cauce y luego un diff acotado.

Pasos

  1. Chat A: pensar (Opus / GPT). Ask o “no edites”. Paths, qué no tocar, tests, riesgo de capas. Máximo 6 pasos.
  2. Chat B nuevo: rápido (Composer / Grok). Pegá el plan. “No lo mejores. No agregues archivos que el plan no nombra.”
  3. AGENTS.md: mapa y prohibiciones ya mergeados (valen en ambos chats). El plan no vive en el MD; caduca con el ticket.

Prompt

Los dos bloques: prompts-base T8.

Ventajas

  • Opus no parchea a ciegas; Composer no diseña el mapa.
  • El diff del rápido ⊆ lista del plan: reviewable.
  • Si el plan choca con el disco, se para antes de codear.

Desventajas

  • Dos chats: hay que pegar el plan, no “acordarse”.
  • Composer “completa” el plan si no se lo prohibís.
  • Un solo chat Auto suele elegir rápido y saltarse el mapa.

DoD

Plan con paths, sin snippets masivos. Lista de files del Chat B = lista del plan. Tests del plan corridos. Review humano (R6 / J5 si el diff lo escribió el agente).

Fallo típico: Opus también edita; o Composer agrega un archivo “por si hace falta” que el plan no nombraba.

Ver más: #vd-fast-vs-think · #flujo-dia-0.

L7 · Cambio SMTP / ops en Java que ya envía correo

Legacy Java

Host, timeout o un envío de prueba. El mailer ya existe.

Contexto

El servicio Java ya manda notificaciones (JavaMail, Spring Mail, o un cliente SMTP del módulo mail). El ticket es ops: timeout, From, o un envío de prueba desde el mismo entry point que el equipo ya usa en no-prod (un main de herramienta, un job, un perfil dev). No es “plataforma de mail”. No hay nombres de cliente ni de un banco en el prompt.

Pasos

  1. Chat: path del mailer actual + qué cambia (propiedad, timeout, comando de prueba). “No inventes un microservicio de correo.”
  2. Modelo: rápido para el parche. pensar solo si el agente propone broker o segundo Boot.
  3. AGENTS.md: un deploy; secretos por variable de entorno, no en código; no loguear destinatarios ni el cuerpo; no tocar prod; el test de envío usa el mecanismo que el módulo ya tiene.

Prompt

Cambio SMTP en el mailer que YA existe. No un producto de correo.

Path: [paquete mail / MailSender / application-*.yml del perfil no-prod].
Cambio: [timeout / From / comando de prueba en el entry point que ya usa el equipo].
Prohibido: segundo Boot, Kafka "de mail", librería nueva, hardcodear host/password,
loguear destinatario o cuerpo, tocar prod, inventar nombres de cliente.
Secretos: solo env vars que el módulo ya lea.
DoD: el envío de prueba usa el mismo cliente; diff en el paquete mail + config;
sin commit. Si hace falta un dato de host, preguntá; no lo inventes.

Ventajas

  • Reutiliza el cliente y los perfiles que ops ya conoce.
  • El MD de secretos evita un password en el diff.
  • Un timeout o un From es un PR de un paquete.

Desventajas

  • El agente “mejora” a un bus de eventos para un mail.
  • Un prompt vago pide credenciales; hay que parar.
  • Un test real contra SMTP de prod no es el DoD.

DoD

La propiedad o el comando de prueba está en el módulo mail existente. Cero secretos en Git. Logs sin destinatario ni cuerpo. Sin push a prod. El equipo corre la prueba en el entorno que ya usa para eso.

Fallo típico: mail-service nuevo, password en application.yml, o un log INFO con el mensaje completo.

Ver más: capas y un deploy en #tr-java-legacy · Git/secretos #equipo.

L8 · Angular: cambio en el módulo que ya está

Legacy Angular

Un campo o un diálogo. El NgModule (o la carpeta) ya existe.

Contexto

Front Angular en producción. Ticket: un campo más en la lista de pedidos, o un diálogo de confirmación en la pantalla que ya lista. El módulo pedidos (o la carpeta feature del disco) ya tiene componente, servicio y rutas. No hay ticket de standalone, de signals en todo el árbol, ni de un segundo SPA.

Pasos

  1. Chat: nombrá el componente y el servicio vecinos. “Mismo módulo. No crees otro.”
  2. Modelo: rápido si el vecino es obvio. pensar (T3) si propone HttpClient en el .ts de la plantilla o un módulo nuevo.
  3. AGENTS.md: componente flaco; HTTP en servicio/fachada, no en el componente; “no módulo Angular nuevo si el disco no lo tiene”; no mezclar React.

Prompt

Plantilla completa: prompts-base A1. Si duda el patrón: T3. Corto:

Cambio Angular en el módulo que YA existe. No reescribas el front.

Módulo / carpeta: [src/app/pedidos/ o el path del disco].
Vecino a copiar: [pedidos-list.component.ts / pedidos.service.ts].
Ticket: [campo en la fila / diálogo al confirmar].
El componente no usa HttpClient; pasa por el servicio/fachada que ya lista.
No módulo nuevo, no tree features/ si el disco no lo tiene, no React, no librería.
Listá archivos (máximo los del módulo) y esperá OK de una línea.

Ventajas

  • El review compara con el servicio que ya pasó QA.
  • Haiku/Composer copian el patrón si el path está nombrado.
  • No se cuela un segundo estilo en el mismo feature.

Desventajas

  • Sin path, trae standalone + signals “porque es el default de 2025”.
  • Un modelo capaz justifica un shared-ui/ para un diálogo.
  • Si pegás R2 (React) en un repo Angular, el agente trae src/api/. Usá A1.

DoD

El diff vive en el módulo existente. Cero HttpClient en el componente. Cero módulo o librería nueva. El campo o el diálogo se ve en el flujo que ya está.

Fallo típico: HttpClient en el .ts de la plantilla; un NgModule PedidosV2; o un componente React “para comparar”.

Ver más: L4 (vecino) · #arquitectura · A1 / T3.

L9 · Android: mismo patrón, no reescribir la arquitectura

Legacy Android

Un campo o un diálogo. MVVM (o el que ya está) se queda.

Contexto

App Android nativa. Ticket chico: un campo más en la fila, o un diálogo al confirmar. El paquete ya tiene pantalla + ViewModel + repositorio. El riesgo no es Kotlin: es que el agente migre a Compose Navigation, meta lógica en la Activity, o reescriba XML a Compose “de paso”.

Pasos

  1. Chat: nombrá el ViewModel vecino. “Misma capa. No Navigation nuevo.”
  2. Modelo: rápido si el vecino es obvio. pensar (T3) si duda entre Activity gorda y ViewModel.
  3. AGENTS.md: ViewModel sin Views; HTTP en repositorio/capa de datos; “no Compose Navigation / no librería si el disco no lo tiene”.

Prompt

Plantilla completa: prompts-base D1. Si reescribe el toolkit: D2. T3 solo si duda el patrón. Corto:

Cambio Android en el paquete que YA existe. No reescribas la arquitectura.

Paquete: [ui.orders / data.orders o el path del disco].
Vecino: [OrderListViewModel].
Ticket: [campo en la fila / diálogo al confirmar].
El ViewModel no importa Activity/Fragment; el diálogo lo muestra la vista.
HTTP en el repositorio, no en la Activity.
No Navigation Component nuevo, no migrar XML→Compose, no librería.
Listá archivos (máximo los del paquete) y esperá OK de una línea.

Ventajas

  • El review compara con un ViewModel que ya pasó QA.
  • Un campo no abre un proyecto de navegación.
  • El MD de “sin Views en el VM” corta el atajo típico.

Desventajas

  • Si el vecino ya tiene lógica en la Activity, el agente la copia.
  • Sin path, trae Compose + NavHost “moderno”.
  • Si pegás T3 como implementación, el agente review-ea y no parchea. Usá D1.

DoD

El diff se lee al lado del vecino. Cero librerías nuevas. Cero rewrite de UI toolkit. El diálogo o el campo se puede demo en el flujo existente.

Fallo típico: lógica en la Activity; NavHost nuevo; o reescribir la pantalla a Compose porque el modelo “ya lo sabe”.

Ver más: L4 · #arquitectura (MVVM) · D1 / D2.

LR1 · Loop de useEffect / closure vieja, sin reescribir la app

Legacy React

El efecto se dispara en círculo, o el click ve el filtro de hace tres renders.

Contexto

Lista de pedidos en producción. OrderList ya existe. Al montar (o al cambiar un filtro) el useEffect vuelve a pedir la lista en loop: depende de un objeto/array creado en cada render, o el setState del efecto entra en las deps. Variante: el botón “Reintentar” usa un handler que cierra sobre el filtro viejo. No hay ticket de React Query, de extraer un hook genérico ni de rediseñar el estado.

Pasos

  1. Chat: nuevo. Un síntoma (loop o dato viejo). Nombrá el componente y, si lo viste, el efecto. No el hilo del filtro de ayer.
  2. Modelo: rápido. pensar solo si el estado vive en tres padres y hay que elegir dueño — igual no inventes store.
  3. AGENTS.md: mapa src/pages/, src/components/, src/api/; “solo lo que el ticket nombra”; no store; HTTP sigue en el cliente que ya usa la lista.

Prompt

Plantilla completa: prompts-base R7. Corto:

Bug de efecto. No rediseñes. No React Query.

Síntoma: [OrderList refetch en loop / Reintentar usa el filtro viejo].
Componente: [src/pages/OrderList.tsx]. Cliente HTTP: el que YA usa la lista.
Arreglá deps, identidad del objeto, o leé el filtro actual. Sin store nuevo.
Tocá ese archivo y el spec si existe. Sin login ni hook genérico.

Ventajas

  • Diff de un componente que el equipo ya debuguea.
  • El rápido alcanza si el síntoma y el path están nombrados.
  • No cambia el contrato HTTP ni el árbol.

Desventajas

  • Sin acotar, “arregla” el efecto metiendo React Query.
  • Opus propone un hook compartido de tres pantallas.
  • Un eslint-disable de deps esconde el loop, no lo cierra.

DoD

Un cambio de filtro dispara un fetch (o el que el vecino ya haga). “Reintentar” usa el filtro actual. Mismo componente, mismo cliente. Spec tocado si existía. Sin commit.

Fallo típico: React Query “para los efectos”, Zustand, o eslint-disable react-hooks/exhaustive-deps como único cambio.

Ver más: L1 · #tr-react-bug · R7.

LR2 · Campo extra en un formulario que ya existe

Legacy React

Un input más. Misma validación, mismo submit. No hay ticket de login.

Contexto

ContactForm (o el alta de pedido) ya está en producción: campos, validación local, submit al cliente HTTP que ya existe. Ticket: agregar phone o notes, mismo patrón que el campo vecino. El contrato del POST ya acepta esa clave, o el ticket dice que el back ya puede. Nadie pidió auth, React Hook Form, ni un wizard de tres pasos.

Pasos

  1. Chat: nombrá el form y el campo vecino a copiar. “No inventes login.”
  2. Modelo: rápido si el vecino es obvio. pensar si el agente propone otra lib de forms o un store.
  3. AGENTS.md: UI no pega URLs; HTTP en src/api/; “solo lo que el ticket nombra”; no auth ni admin.

Prompt

Plantilla completa: prompts-base R8. Corto:

Campo extra en el form que YA existe. No reescribas el form.

Form: [src/components/ContactForm.tsx]. Campo nuevo: [phone / notes].
Copiá validación y markup del campo vecino [email / dueDate].
Mismo submit, mismo cliente HTTP. Sin login, sin React Hook Form,
sin wizard. Spec del form si existe: un caso del campo nuevo.

Ventajas

  • El review compara el input nuevo con el de al lado.
  • Composer copia el patrón si el path está nombrado.
  • No se cuela un segundo estilo de validación.

Desventajas

  • Sin path, instala React Hook Form “porque es el default”.
  • “Dejalo production-ready” mete captcha y auth.
  • Si el POST no tiene la clave, el agente inventa el contrato.

DoD

El campo se ve, valida como el vecino y viaja en el mismo submit. Diff en el form + cliente si hace falta la clave + spec si existía. Cero auth. Sin commit.

Fallo típico: LoginModal, Zod + RHF de cero, o un segundo formulario “más limpio” al lado del que ya funciona.

Ver más: L1 · R8 · ficha react-bug-acotado.md.

LR3 · No migrar class components a hooks si nadie lo pidió

Legacy React

Un badge o una prop. La class se queda class.

Contexto

UserCard o FilterPanel es un class component de hace años. Ticket: un badge de estado, un texto, una prop más. El agente “aprovecha” y lo pasa a función + hooks, o reescribe componentDidMount a tres useEffect. El backlog no pide migración. Los tests del class, si hay, usan el API viejo.

Pasos

  1. Chat: “es una class. Dejala class. Solo el badge/prop.” Si ya empezó la migración, chat nuevo, no negociar el rewrite.
  2. Modelo: rápido para el parche. pensar (review) si el PR ya convirtió el archivo.
  3. AGENTS.md: “no convertir class→función ni XML de UI de paso”; mapa de carpetas; solo lo que el ticket nombra.

Prompt

Plantilla completa: prompts-base R9. Corto:

Cambio en una class que YA existe. No la pases a hooks.

Archivo: [src/components/UserCard.jsx]. Ticket: [badge de estado / una prop].
Dejá class, lifecycle y this.state. No useEffect, no extraer hooks.
Si el spec monta la class, extendelo; no lo reescribas a Testing Library "moderna".

Ventajas

  • El PR del badge cabe en una review de 10 minutos.
  • No se mezclan dos estilos en el mismo archivo “a medias”.
  • Los tests del class siguen significando lo mismo.

Desventajas

  • El class sigue viejo; este ticket no lo limpia.
  • Un modelo capaz justifica “es más simple en hooks”.
  • Sin la frase “dejala class”, la migración entra sola.

DoD

El badge o la prop se ve. El archivo sigue siendo class. Cero useState/useEffect nuevos en ese componente. Spec extendido, no reescrito. Sin commit.

Fallo típico: function UserCard + tres hooks “equivalentes”, o un PR de 200 líneas para un span.

Ver más: L3 (no partir) · R9 · react-arquitectura.md.

LR4 · No meter Redux/Zustand si ya hay Context o estado simple

Legacy React

El tema, el carrito o el filtro ya tienen dueño. No un store “de verdad”.

Contexto

El front ya guarda tema (o carrito, o filtros de la lista) en React.createContext, o la página usa useState en el padre. Ticket chico: un toggle, un chip, un valor más. El agente instala Zustand o Redux Toolkit “porque el Context no escala”. Nadie pidió store global ni una carpeta src/store/.

Pasos

  1. Chat: nombrá el Context o el state del padre. “Extendé eso. No instales store.”
  2. Modelo: rápido. pensar solo para decir “no hace falta Redux” si el PR ya lo metió.
  3. AGENTS.md: “no Redux/Zustand/Jotai si el disco no los tiene”; estado en el Context o el padre que ya existe.

Prompt

Plantilla completa: prompts-base R10. Corto:

Estado que YA existe. No instales store.

Dueño actual: [ThemeContext / el useState de OrderList].
Ticket: [toggle dark / un filtro más].
Extendé ese Context o ese state. Prohibido zustand, redux, jotai,
src/store/, providers nuevos. Sin login.

Ventajas

  • Una línea “el disco no tiene store” corta el hábito del tutorial.
  • El review no aprueba un package.json de paso.
  • El toggle llega en el provider que QA ya conoce.

Desventajas

  • Si el Context ya está mal, el agente multiplica el atajo.
  • Un prompt vago (“mejorá el estado”) autoriza Redux.
  • Opus justifica el store con un blog de 2024.

DoD

El cambio usa el Context o el useState existente. package.json sin store nuevo. Cero src/store/. Sin commit.

Fallo típico: useThemeStore de Zustand al lado de un ThemeContext que ya funcionaba.

Ver más: L1 · R10 · R4.

LR5 · React Router: una ruta más, igual que las que ya hay

Legacy React

Copiá la ruta hermana. No migres el router de paso.

Contexto

SPA con React Router ya cableado: o <Routes>/<Route> en App.tsx, o createBrowserRouter en un archivo de rutas. Ticket: pantalla de detalle /orders/:id (o el path del equipo). Ya hay una lista en /orders y un vecino de detalle en otro recurso. Nadie pidió data APIs, loaders, ni pasar de v5 a v6 (ni al revés).

Pasos

  1. Chat: nombrá el archivo de rutas y la ruta vecina a copiar. “Mismo helper, mismo layout.”
  2. Modelo: rápido si el vecino es obvio. pensar si propone createBrowserRouter en un repo que usa Routes.
  3. AGENTS.md: “rutas donde el disco ya las declara”; no Next app/; HTTP en src/api/, no en el loader si el equipo no usa loaders.

Prompt

Plantilla completa: prompts-base R11. Corto:

Ruta nueva, mismo patrón que las que YA hay. No migres el router.

Archivo de rutas: [src/App.tsx o src/routes.tsx].
Vecina a copiar: [/orders → OrderList / /customers/:id].
Nueva: [/orders/:id → OrderDetail]. Página en [src/pages/], HTTP en [src/api/].
No createBrowserRouter si el disco usa Routes (ni al revés).
No loaders, no Next app/, no auth. Listá files y esperá OK.

Ventajas

  • El review compara la ruta nueva con la hermana.
  • No se cuela un segundo estilo de router en el mismo SPA.
  • La página sigue el mapa de carpetas.

Desventajas

  • Sin path, el agente “actualiza” a data router el mismo PR.
  • Un detalle tienta a inventar auth “porque es ficha”.
  • Vite + app/orders/[id]/page.tsx es el mix de NR2.

DoD

La URL nueva abre la página del mapa. Misma API de Router que el resto. Cero loaders/data APIs si el disco no los tiene. HTTP en src/api/. Sin commit.

Fallo típico: migrar todo a createBrowserRouter para una ruta, o un loader con fetch que saltea el api module.

Ver más: L4 · R11 · NR2.

Repo que todavía no tiene producto

Proyectos nuevos (11 casos)

Importante — clave 7: mapa de carpetas el día 0. Lista: Puntos clave.

Acá el agente no tiene “vecinos” que lo frenen. Si el mapa no está el día 0, mezcla React con Angular, inventa auth y dora el prototipo.

N1 · Día 0: AGENTS.md + mapa de carpetas, antes de features

Nuevo React Java

El primer commit de reglas. Cero pantallas todavía.

Contexto

Repo vacío o scaffold fresco (Vite + Spring, o el par que eligió el equipo). La tentación es “tirá la login y el dashboard”. El día 0 es el mapa: quién habla con quién, comandos, prohibiciones. Después, chat nuevo para la primera feature.

Pasos

  1. Chat: “solo docs de reglas. No implementes producto.” Workspace en la raíz que va a ser el repo.
  2. Modelo: pensar para el mapa (¿raíz vs. anidado?). Copiar bloques: rápido.
  3. AGENTS.md: todavía no existe: este chat lo crea. Raíz corta (15–25 líneas) + anidado frontend/ y api/ si es mixto. No un tratado de 400 líneas.

Prompt

Mapa listo para pegar: snippets S1–S4. Corto:

Día 0. Solo AGENTS.md (y anidados si el repo es mixto). No features.
Escribí el mapa del disco que VAMOS a usar: [frontend React Vite / api Spring].
Quién habla con quién. Tests: npm test y ./mvnw test. No commit si no lo pido.
No fusiones React y JPA en un solo archivo de 400 líneas.
Cuando termines: listá paths creados y pará. La primera pantalla es OTRO chat.

Ventajas

  • El próximo chat hereda el cauce sin que nadie lo recuerde.
  • Dos anidados evitan reglas de JPA en un ticket de CSS.
  • Barato: se commitea una vez con el scaffold.

Desventajas

  • Un MD de libro (hexagonal + FSD) no es este disco.
  • Si implementás la feature en el mismo chat, el mapa llega tarde.
  • Claude Code no lee AGENTS.md solo: hace falta CLAUDE.md o @.

DoD

Hay raíz corta + anidado del stack que existe. Un humano puede señalar “front acá, API acá”. Cero componentes de producto en ese diff. Chat nuevo para N2.

Fallo típico: “de paso armo el login” o un AGENTS.md que copia Clean Architecture de un blog y no las carpetas del scaffold.

Ver más: #flujo-dia-0 · portable-agents.md.

N2 · Primera tajada vertical (una pantalla + una API)

Nuevo React Java

Un recurso de punta a punta. No el producto entero.

Contexto

El mapa del día 0 ya está en Git. El primer valor: listar (o crear) un recurso — p. ej. pedidos: GET /api/orders + una página OrderList. Misma query, DTO acordado. No admin, no pagos, no segundo recurso “para que quede redondo”.

Pasos

  1. Chat: uno para el contrato (o el GET si el back va primero), otro para la UI, o un plan T8 y luego Composer. No un hilo que abra diez tickets.
  2. Modelo: plan pensar si hay que decidir el shape del DTO. Implementar: rápido con paths del mapa.
  3. AGENTS.md: ya escrito (N1). El chat nombra OrderList + OrderController y el cliente en src/api/. No crees src/features/.

Prompt

Front: R2. API: J1. Arranque de sesión: T1.

Ventajas

  • Hay algo demoable: lista + GET.
  • El cauce se prueba en un flujo real, no en un ADR.
  • El siguiente recurso copia este, no un tutorial.

Desventajas

  • Un solo chat rápido hace endpoint + fetch en el JSX.
  • Sin DTO acordado, el front inventa campos.
  • La tajada se infla a “CRUD completo + filtros + export”.

DoD

Una pantalla usa el cliente en src/api/. El GET responde DTO. Tests del patrón del repo (un spec de lista o del service). Sin auth inventada (eso es N7). Sin commit si no se pidió.

Fallo típico: dashboard + usuarios + pedidos en el mismo PR, o un segundo árbol features/orders/ el primer día.

Ver más: #tr-react-feature · #tr-java-endpoint.

N3 · El stack va en el MD: no mezclar React y Angular

Nuevo React

Una frase en el disco. El agente deja de “completar” con el otro SPA.

Contexto

Greenfield. El equipo eligió React + Vite (o Angular, o Next: uno). Sin esa línea, un modelo capaz mete app/ de Next en un Vite, o un angular.json “porque el lead también conoce Angular”. En un mixto, el anidado de front no debe mencionar el otro framework.

Pasos

  1. Chat: si el MD aún no lo dice, este chat solo escribe la línea y para. Feature en chat nuevo (T2).
  2. Modelo: rápido para la línea. Review pensar si un PR ya mezcló árboles.
  3. AGENTS.md: “SPA React + Vite. No Next, no app/, no Angular. HTTP en src/api/.” O el inverso, si el repo es Angular.

Prompt

Fijá el stack en el MD. No implementes UI.

Este front es [React + Vite / Angular / Next]. Uno solo.
Escribí 4–6 líneas en [frontend/AGENTS.md]: framework, carpetas del disco,
prohibido el otro SPA y el otro router.
No instales el framework que no elegimos. No crees angular.json ni app/ de Next.
Chat de feature: después, T2.

Ventajas

  • Una línea corta el hábito de “traer el stack del entrenamiento”.
  • El review rechaza un segundo package de UI.
  • Portable: el anidado viaja con el front.

Desventajas

  • Si el lead cambia de opinión, hay que editar el MD y chat nuevo.
  • “React o Angular, el que quieras” autoriza el mix.
  • Un mega-MD de ambos stacks gasta tokens en cada ticket.

DoD

El MD nombra un framework y prohíbe el otro. package.json / estructura coincide. Ningún archivo del otro SPA en el diff de ese día.

Fallo típico: Vite + una carpeta app/ de App Router, o un componente Angular generado “para comparar”.

Ver más: #tr-react-folders · react-arquitectura.md · R3.

N4 · El comando de test / CI vive en el MD

Nuevo React Java

Si no está escrito, el agente “lo prueba a mano” o instala otro runner.

Contexto

Scaffold nuevo: Vitest en el front, Surefire o Gradle en la API, un workflow que corre esos dos. El agente cierra la primera feature sin correr nada, o agrega Jest/Playwright/Testcontainers “porque es más moderno”. CI no puede ser un secreto del lead.

Pasos

  1. Chat: día 0 o el PR que agrega CI: una sección “Tests” con comandos literales y “corré el spec tocado”.
  2. Modelo: rápido para escribir la línea y el YAML si el equipo ya tiene plantilla. No Auto para “elegir el runner”.
  3. AGENTS.md: npm test / npx vitest path; ./mvnw test (o Gradle). “No instales otro runner. Mostrá comando y salida. No afirmes verde si no corriste.”

Prompt

Documentá el comando de test en AGENTS.md (y anidados). No migres el runner.

Front: [npm test / npx vitest]. API: [./mvnw test].
CI ya corre [el workflow que exista; no inventes uno de 12 jobs].
El agente debe correr el spec tocado y pegar salida.
Prohibido Jest/Cypress/Playwright/Testcontainers de paso.
No rewrite de tests verdes.

Ventajas

  • CI es el candado; el MD solo recuerda el comando.
  • El review pide salida, no “los tests pasan” de oídas.
  • Evita un segundo framework de test el primer sprint.

Desventajas

  • El MD no ejecuta Vitest: hace falta que el humano (o CI) lo corra.
  • Un comando mal copiado (npm run test:e2e que no existe) confunde.
  • Pedir el monorepo entero en cada bug gasta tiempo.

DoD

Los dos comandos (front y API, o el que exista) están en el MD. El workflow, si existe, llama esos mismos. El agente de N2 pegó salida real. Sin commit de un runner nuevo.

Fallo típico: “está funcionando” sin comando, o un playwright.config en el PR de la lista de pedidos.

Ver más: #tr-react-tests · tokens/CI en #cuidar-tokens.

N5 · Flags y alcance: no dorar el prototipo

Nuevo React Java

Si no está en el ticket, no va. Un if de flag, no un framework de experiments.

Contexto

Primera o segunda feature. El modelo “deja listo” login, i18n, design system, feature-flag SaaS y un panel. El equipo a lo sumo necesita un boolean en config (exportEnabled) para no mostrar un botón. Nadie pidió LaunchDarkly.

Pasos

  1. Chat: lista de fuera de alcance en el primer mensaje (R4). Si ya doró: recortar el diff, no discutir features.
  2. Modelo: rápido, límites arriba. No Auto.
  3. AGENTS.md: S2 — “prohibido login, pagos, admin, store, librería nueva porque va a hacer falta”. Flag: “un boolean en la config que el repo ya use; no un SDK de experiments”.

Prompt

prompts-base R4. Si el botón debe poder apagarse:

Alcance cerrado: [el botón Exportar].
Si hace falta apagarlo: un boolean en [la config / env que el repo ya lea].
No instales SDK de flags, no panel, no i18n extra, no design system.
Si algo de eso te parece necesario, una frase y esperás. No lo codees.

Ventajas

  • El primer PR se lee en minutos.
  • Un boolean es reversible; un SDK no.
  • La regla S2 vale para todos los chats siguientes.

Desventajas

  • “Production-ready” en el prompt autoriza el oro.
  • El agente deja código comentado “por si acaso”.
  • Sin S2 en el MD, hay que repetir R4 cada día.

DoD

El pedido funciona. El reviewer cuenta los archivos con los dedos. Cero SDK de flags. Cero features parásitas. Sin commit.

Fallo típico: Storybook + toasts + i18n + “dejo el login comentado” en el PR del export.

Ver más: R4 · flujo #flujo-dia-0.

N6 · Review de arquitectura una vez; después implementar

Nuevo React Java

Greenfield: un sí/no de mapa. No un rediseño por ticket.

Contexto

Antes de la primera feature (o cuando alguien quiere src/features/ / hexagonal el día 2). Hace falta un veredicto: ¿el scaffold + AGENTS.md alcanzan? Si sí, se implementa N2. Si el equipo quiere otro árbol, se cambia el MD antes, no en el chat del botón.

Pasos

  1. Chat A: pensar, no editar. T3: ¿rompe el patrón? Paths. Alternativa mínima. Prohibido plan de migración de 12 pasos.
  2. Humano: acepta el mapa o cambia el MD (otro PR). Chat nuevo (T2).
  3. Chat B: T8 / R2 / J1. Composer no reabre la arquitectura.

Prompt

prompts-base T3, luego T8.

Ventajas

  • La discusión de carpetas ocurre una vez, no en cada badge.
  • Opus no implementa; Composer no diseña.
  • Si hay que cambiar el mapa, queda escrito en Git.

Desventajas

  • Hacer T3 en el mismo hilo que codea contamina el árbol.
  • Opus propone hexagonal si el prompt es “cómo lo harías vos”.
  • Sin T2, el hilo viejo sigue el árbol rechazado.

DoD

Un humano decide en un minuto. Cero diff en el chat de review. El chat de implementación respeta el mapa aceptado. Tests del plan.

Fallo típico: “review” que termina creando src/features/ o invoice-service en el mismo hilo.

Ver más: #arquitectura · #vd-opus.

N7 · React Vite o Next: primera feature, sin inventar auth

Nuevo React

Lista o formulario público (o ya mockeado). Login es otro ticket.

Contexto

Vite o Next, mapa N1/N3 ya escrito. Primera UI: la lista de N2, o un formulario de contacto. No hay IdP, no hay cookie session, no hay middleware de Next Auth. El agente, sin regla, arma LoginPage, middleware.ts y un JWT “mínimo”.

Pasos

  1. Chat: “esta app todavía no tiene autenticación. No la agregues. Si el GET exige token en prod, usá el mock/header que el MD nombre, o preguntá.”
  2. Modelo: rápido. Si elige Next: no crear app/ si el repo es Vite (N3).
  3. AGENTS.md: “no hay src/auth/ ni rutas protegidas hasta un ticket de auth”; Next: “middleware solo si el ticket lo pide”; cliente HTTP sin pegar tokens inventados.

Prompt

Primera feature de UI. No hay autenticación en este repo.

Pantalla: [OrderList / ContactForm]. Stack: [Vite pages+components / Next app/].
El GET [ya existe / se mockea en el api module]. Sin login, OAuth, JWT,
middleware de auth, ni "lo dejo preparado".
HTTP en [src/api/]. Misma regla R2/R4.
DoD: la pantalla se ve y lista/envía; grep sin LoginPage ni next-auth.
No commit.

Si el alcance se infla: variante de R4.

Ventajas

  • La primera demo no arrastra un IdP fantasma.
  • Auth, cuando llegue, es un ticket con amenaza de seguridad real.
  • Vite y Next no se mezclan si N3 está escrito.

Desventajas

  • Un GET que en prod pide Bearer tienta al agente a inventar el token.
  • “Dejalo production-ready” = login el día 1.
  • Next: el middleware vacío “por costumbre” igual es alcance.

DoD

La pantalla usa el mapa. Cero LoginPage, next-auth, JWT hardcodeado. El api module no inventa un usuario. Auth queda para un PR explícito, con reglas de secretos.

Fallo típico: /login + localStorage de token + un usuario “admin@demo” en el código.

Ver más: R2 · R4 · #tr-react-feature.

N8 · Angular: día 0 (AGENTS) + una tajada vertical

Nuevo Angular

Mapa Angular primero. Después una pantalla + un GET. Nada más.

Contexto

Greenfield. El equipo eligió Angular (un SPA). Sin mapa, el agente mete React, src/features/ de tutorial, o auth “para que quede redondo”. El día 0 escribe el MD. El chat siguiente hace una lista (o un alta) con HTTP en el servicio, no en el componente.

Pasos

  1. Chat 1: solo reglas. Workspace en la raíz. “No implementes producto.”
  2. Chat 2: una pantalla + el cliente HTTP del mapa. Sin login.
  3. Modelo: mapa pensar (¿raíz vs. anidado?). Tajada: rápido con paths ya escritos.
  4. AGENTS.md / CLAUDE.md: según la herramienta (clave 2). “SPA Angular. No React, no Next.” Carpetas del scaffold (src/app/…). Componente flaco; HTTP en servicio/fachada. Claude Code: CLAUDE.md o @AGENTS.md.

Prompt

Plantilla completa: prompts-base A2 (dos chats). Si mezcla React: A3. Día 0 también: S1–S4 (decí Angular). Corto:

Chat 1 — Día 0. Solo AGENTS.md (y CLAUDE.md si el equipo usa Claude Code).
Este front es Angular. Uno solo. No React, no Next, no app/ de App Router.
Escribí el mapa del disco: [src/app/… del scaffold]. Quién habla con quién.
HTTP en servicio/fachada, no en el .ts de la plantilla.
No features de producto en este chat. Listá paths y pará.

Chat 2 — Una tajada. Chat NUEVO.
Pantalla: [OrderList]. GET [ya existe / se mockea en el servicio].
Mismo módulo que el mapa. Sin login, JWT, ni módulo auth.
DoD: la lista se ve; grep sin LoginComponent ni HttpClient en el componente.
No commit.

Ventajas

  • N3 queda clavado: un SPA, no dos.
  • La demo es una lista, no un IdP.
  • El próximo recurso copia este módulo, no un tutorial de signals.

Desventajas

  • Si el mapa copia Clean Architecture de un blog, no es este disco.
  • Un solo chat hace MD + dashboard + auth.
  • Si pegás R2/R4 (React), el agente arma src/pages/. Usá A2.

DoD

Hay MD corto con “Angular, no React”. Una pantalla usa el servicio del mapa. Cero HttpClient en el componente. Cero login inventado. Chat de reglas distinto al de la tajada.

Fallo típico: angular.json + una carpeta React “por si acaso”, o HttpClient en el componente el primer día.

Ver más: N1 · N2 · N3 · A2 / A3 / S1.

NR1 · Vite + React día 0: AGENTS + una página + fetch a la API que ya está

Nuevo React

Mapa primero. Después una lista. El GET ya existe; no inventes el back.

Contexto

Scaffold Vite + React (o repo vacío que va a ser eso). La API ya vive en otro deploy: GET /api/orders (o el path acordado) ya responde DTO. El día 0 escribe AGENTS.md. El chat siguiente arma OrderList + cliente en src/api/. No Next, no auth, no segundo recurso “para que quede redondo”.

Pasos

  1. Chat 1: solo reglas. “SPA React + Vite. No Next, no app/.” Workspace en la raíz.
  2. Chat 2 nuevo: una página + el cliente HTTP. El GET no se implementa acá.
  3. Modelo: mapa pensar (¿raíz vs. anidado?). Tajada: rápido con paths ya escritos.
  4. AGENTS.md: “SPA React + Vite. Páginas en src/pages/, HTTP en src/api/. No Next, no Angular.” Comando npm test si el scaffold ya lo tiene.

Prompt

Plantilla completa: prompts-base R12 (dos chats). Corto:

Chat 1 — Día 0. Solo AGENTS.md. React + Vite. No Next, no app/, no Angular.
Mapa: src/pages/, src/components/, src/api/. HTTP no en el JSX.
No features de producto. Listá paths y pará.

Chat 2 — Chat NUEVO. Una página [OrderList] que lista el GET [ya existe].
Cliente en src/api/. Sin login, sin segundo recurso, sin inventar el back.
DoD: la lista se ve; grep sin LoginPage ni fetch en el JSX. No commit.

Ventajas

  • El mapa llega antes que el primer fetch.
  • La demo usa el contrato real, no un JSON inventado de 20 campos.
  • El próximo recurso copia esta página, no un tutorial de Next.

Desventajas

  • Un solo chat hace MD + dashboard + auth.
  • Sin URL del GET, el agente inventa el DTO.
  • Si pegás A2 (Angular), arma src/app/. Usá R12.

DoD

Hay MD con “React + Vite, no Next”. Una página usa src/api/ contra el GET nombrado. Cero fetch en el JSX. Cero login. Chat de reglas distinto al de la página.

Fallo típico: app/page.tsx de App Router el primer día, o un mock de pedidos con cifras inventadas.

Ver más: N1 · N2 · R12.

NR2 · No mezclar App Router de Next con un Vite SPA

Nuevo React

Si el disco es Vite, no hay app/, ni 'use client', ni Server Actions.

Contexto

El equipo eligió Vite + React (SPA). Sin una línea en el MD, un modelo capaz crea app/orders/page.tsx, 'use client', next/link o un action de formulario. N3 corta React vs Angular; este caso corta dos Reacts: Vite SPA vs Next App Router. Si el repo fuera Next, el inverso: no armes src/pages/ de CRA/Vite.

Pasos

  1. Chat: si el MD aún no lo dice, este chat solo escribe la línea y para. Feature en chat nuevo (T2). Si el PR ya mezcló, review: no sigas el árbol de Next.
  2. Modelo: rápido para la línea. Review pensar si ya hay app/ en un Vite.
  3. AGENTS.md: “SPA React + Vite. No Next. No app/, no Server Components, no 'use client', no next/link. Rutas: React Router en el archivo que el disco ya use.”

Prompt

Plantilla completa: prompts-base R13. Corto:

Este front es Vite + React (SPA). No Next.

Escribí 4–6 líneas en [frontend/AGENTS.md o la raíz]:
prohibido app/, page.tsx de App Router, 'use client', Server Actions,
next/link, next/navigation. Rutas: React Router como el disco.
No instales next. Si ya creaste app/, devolvé el código al mapa Vite.
No implementes producto en este chat si solo faltaba la línea.

Ventajas

  • Una frase corta el hábito de “traer el stack del curso de Next”.
  • El review rechaza un segundo router en el mismo SPA.
  • N3 (Angular) y NR2 (Next) no se pisan: cada uno un mix.

Desventajas

  • “React, el que quieras” autoriza Vite + app/.
  • Si el lead cambia a Next, hay que editar el MD y chat nuevo.
  • Un mega-MD de ambos stacks gasta tokens en cada ticket.

DoD

El MD nombra Vite SPA y prohíbe Next. package.json sin next. Ningún app/**/page.tsx ni 'use client' en el diff de ese día.

Fallo típico: Vite + carpeta app/ “para cuando pasemos a Next”, o un Server Action en un form de SPA.

Ver más: N3 · R13 · react-arquitectura.md.

NR3 · Un test de componente; no inventes una suite Cypress

Nuevo React

Un spec al lado del componente. El runner del scaffold. Nada de e2e el día 1.

Contexto

Vite + React fresco. Vitest + Testing Library ya vienen (o el equipo acaba de agregar el runner del scaffold). Primera UI: ContactForm o OrderList. Hay que cubrir un comportamiento (submit, lista vacía). Nadie pidió Cypress, Playwright, ni “cobertura del front”. L5/R5 son el módulo viejo; este caso es greenfield: el agente instala e2e “porque un SPA serio lo tiene”.

Pasos

  1. Chat: “un spec junto al componente, estilo Vite/RTL. Corré solo ese path.”
  2. Modelo: rápido. pensar solo si hay que elegir unit vs. e2e — y igual no instales Cypress de paso.
  3. AGENTS.md: npm test / npx vitest path; “no Cypress/Playwright/Jest si el runner es Vitest”; “un caso del invariante, no una carpeta e2e”.

Prompt

Plantilla completa: prompts-base R14. Corto:

Un test de componente. No una suite e2e.

Componente: [ContactForm / OrderList]. Caso: [submit envía phone /
lista vacía muestra el vacío].
Archivo junto al componente, Vitest + Testing Library (el runner del disco).
Simulá click/change. No Cypress, Playwright, Jest, ni carpeta e2e/.
Corré solo ese spec. Mostrá comando y salida. No commit.

Ventajas

  • El primer spec define el estilo para el resto del front.
  • CI del scaffold alcanza; no hay un segundo pipeline el día 1.
  • El review ve rojo→verde en un archivo.

Desventajas

  • “Dejalo production-ready” instala Cypress + un workflow de 8 jobs.
  • Pedir 100% genera tests que repiten el JSX.
  • Sin comando en el MD, el agente afirma verde de oídas.

DoD

Un spec junto al componente. Comando y salida pegados. package.json sin Cypress/Playwright. Cero carpeta cypress/ o e2e/ nueva. Sin commit.

Fallo típico: cypress.config.ts + un visit a localhost en el PR del formulario de contacto.

Ver más: N4 · L5 · R14.