Planos · agentic-dev-boilerplate
00 · la app, lista para testear

Una página que explica cómo testear la app, y un lugar cerrado donde viven las credenciales.

/testability-guide genera dentro de la app una página pública /qa, la Software Testability Guide for QA, y arma aparte un artefacto de credenciales que se publica donde elijas. La página enseña a probar la app en las capas de base de datos, API e interfaz; el artefacto guarda los valores reales. Al volver a correrla, detecta qué cambió en el stack y parcha solo eso.

para quien codea y quien lidera corre después de que la app existe la página nunca lleva un secreto
Fases 0-2

Detecta

Lee el repo sin tocarlo, puntúa la testeabilidad y compara contra el snapshot.

→
Fase 3

Tú decides

Un solo mensaje con las preguntas que la detección no pudo responder.

→
Fases 4-6

Genera y publica

La página /qa y el artefacto de credenciales, en paralelo.

→
Fases 7-8

Audita y verifica

Reglas de seguridad antes de publicar; tipos, build, lint y navegador después.

→
Fase 9

Abre el PR

Por /git-flow-master. La skill nunca hace push por su cuenta.

01 · cuándo usarla

Cuando hay una app real que alguien tiene que probar

Describe una app que ya funciona. Contra un scaffold hueco hay poco que documentar, y la skill te lo avisa antes de seguir.

Úsala cuando

QA necesita una puerta de entrada

  • Testers humanos o agentes de IA necesitan una sola página dentro del producto que explique cómo probarlo.
  • Quieres crear o refrescar el artefacto de credenciales que respalda el botón de la página.
  • El stack se movió (cambió el auth, se mudó la base, apareció un MCP nuevo) y la /qa quedó desactualizada.
  • Pides "guía de testeabilidad", "credenciales para testing" o "update /qa page".
No la uses para

Lo que es de otra skill

  • Definir el producto (PRD, journeys, arquitectura): /project-foundation.
  • Montar backend, frontend, OpenAPI, auth o env: /project-bootstrap. Esta skill puede correr cuando esa termina.
  • Implementar una historia: /sprint-development.
  • Unit tests: /unit-testing.
  • Casos de prueba formales o un sistema de gestión de tests: fuera de alcance.
02 · dos artefactos

Una página pública y un artefacto cerrado que se apuntan entre sí

Nunca se duplican. El botón de la página abre el destino de las credenciales, y el pie del artefacto vuelve a /qa.

Página /qa (en la app) Artefacto de credenciales
Guarda Placeholders y el procedimiento Los valores reales y bloques .env para copiar
Quién lo ve Legible para cualquiera que llegue a la página Solo el grupo de QA, con el permiso nativo del destino
Responde "Cómo testeo?" "Qué pego?"
Dónde vive En el repo, en la ruta que elijas (por defecto /qa) Epic de Jira por defecto, o Confluence, Notion, otra herramienta, o pegado a mano. Nunca en el repo.
"Pública" quiere decir documentación pública, no credenciales públicas. Si el producto es una herramienta interna o un producto de clientes donde una página operativa filtraría información, la skill cierra /qa en producción. Si es una plataforma de práctica donde la página es la puerta de entrada de testers externos, la deja abierta a propósito. Lo detecta en el discovery; si no está claro, te pregunta.
03 · el mapa

De la fase 0 a la 9, casi todas en fila

Una vez que las decisiones quedan fijas, la página y el artefacto son independientes y corren en dos subagentes en paralelo. La verificación y el PR van después de los dos.

cada fase deja una entrada en .session/testability-guide/progress.md · la fase 2 la deja como skipped cuando no hay drift, para que el no-op también quede auditado

04 · fase 0

Dos memorias distintas: la sesión y el snapshot

La skill guarda estado en dos lugares que resuelven problemas distintos. Confundirlos es el error más fácil de cometer.

Dentro de una corrida

.session/testability-guide/

  • Guarda plan.md y progress.md. Detecta una corrida interrumpida: por ejemplo, la IA se cortó entre la página y la publicación.
  • La fase 0 lo lee primero. Si existe, te muestra el objetivo, la última fase completa y la próxima, y espera: reanudar, reiniciar (lo archiva) o abortar.
  • Al terminar bien, la carpeta se mueve a .session/.archive/.
Entre corridas

El comentario qa-guide-snapshot

  • Vive arriba de todo en el archivo de la página generada y queda commiteado.
  • Detecta drift del código: el stack cambió entre dos corridas completas.
  • La fase 2 lo lee. Sobrevive al archivado de la sesión: es la señal para la próxima invocación.
05 · fase 1

Discovery: todo se detecta, nada se adivina

El mismo generador corre contra proyectos muy distintos: uno con Supabase Auth y Redoc, otro con un login JWT propio y Swagger UI. Una ruta escrita a mano sale mal en la mayoría.

La IA detecta

Framework y versión, kit de UI, iconos, tema claro/oscuro, idioma, modelo de auth (todos los que expone), endpoint de login y forma del token, UI de docs y ruta del spec OpenAPI.

Motor de base y rol de QA, archivos de config MCP por agente, cómo se activa el .env, repos mono o poly, rama por defecto y de dónde sale el SHA del deploy.

Nunca hace

Leer .env ni archivos de credenciales. Del .env.example enumera nombres de variables, nunca valores.

Instalar nada, levantar el dev server ni correr la suite: eso es la fase 8.

Sale

Un párrafo corto que alimenta el snapshot, el objeto qaConfig de la página y el diff de idempotencia.

Lo que no se detectó queda como hueco explícito (<detected: none>), y la página dice "pregúntale a tu lead". Nunca un valor inventado.

En la misma fase: qué tan testeable es el producto?

Puntúa tres capas. La página se construye igual con cualquier puntaje; lo que cambia es la bandera y la recomendación que te llevas.

Capa Testeable cuando… Si falta
UI Los flujos críticos (login como mínimo) tienen selectores estables, data-testid o rol. Bandera y recomendación de una convención de selectores.
API Hay un camino programático a un token para Authorization: Bearer, con expiración, y un contrato descubrible. Bandera alta. Recomienda un login normal con contraseña más un endpoint que emita un token con expiración.
DB Existe un rol de QA de solo lectura para inspeccionar sin la app en el medio. Bandera. Si solo hay un superusuario, la corrida se detiene (ver seguridad).
Recomienda, no construye. El endpoint de token, los data-testid o el rol de QA son trabajo de /project-bootstrap o /sprint-development. Y un login sin contraseña no es deficiente por sí solo: si además hay un emisor de tokens personales, la API cuenta como testeable.
06 · fase 2

Idempotencia: re-correrla nunca reescribe de cero lo que no cambió

Si /qa ya existe, la IA lee el snapshot, repite el discovery y compara campo por campo. Te muestra el diff antes de tocar nada.

/* qa-guide-snapshot
   skill-version=…  stack=…  ui-kit=…  auth-method=…  docs-route=…  openapi-spec=…
   db=…  repos-shape=…  mcp-config-files=…  page-features=…
   language=…  publisher=…  credentials-source=…  default-branch=…
   build-sha-source=…  testability=…  generated=…  content-hash=…
*/

forma del comentario, con los valores omitidos · la lista canónica de campos vive en references/idempotency-snapshot.md

Resultado del diff Qué pasa
No-op Solo cambió la fecha o una versión menor. Reporta "está al día" y sale.
Parche quirúrgico Cambió un campo que afecta código (stack, auth, base, idioma…). Se regeneran solo las secciones que ese campo maneja; el resto queda byte a byte igual.
Solo re-publicar Cambió el destino de las credenciales; la página no se toca.
Mejora de página La página es de una versión más plana (sin resaltado, sin tarjetas de request). Te la ofrece; nunca la aplica sola.
Re-scaffold completo Salto mayor en skill-version o tres o más campos de código movidos a la vez. Solo con tu OK, y guarda una copia de la página anterior.
Tus ediciones a mano

Se respetan

  • Lo que esté entre qa-guide:user-region:start y :end sobrevive a cada parche.
  • Si un parche cae encima de una región tuya, la IA te muestra el conflicto antes de escribir.
Sin snapshot

Pregunta antes de pisar

  • Una /qa sin comentario (o con uno ilegible) se trata como hecha a mano: "la tomo y la regenero con snapshot?"
  • El content-hash se escribe en dos pasadas: un placeholder al generar la página y el hash real después de publicar.
07 · fase 3

Tus decisiones, en un solo mensaje

Las preguntas llegan juntas, cada una con su default y su costo. Puedes contestar "todo por defecto". Lo que ya dijiste en tu pedido inicial queda fijado y no se vuelve a preguntar.

Pregunta Default Lo que hay que saber
Q1 · destino de credenciales Epic de Jira El cuerpo es portable: cambiar de destino después es barato.
Q2 · rol de base para testers Rol qa_* de solo lectura Las escrituras pasan por la API. Un superusuario se rechaza siempre.
Q3 · ruta de la página /qa Salvo que choque con la arquitectura de rutas del host.
Q4 · redirect de una ruta vieja Sí, si hay una página hermana Redirect del lado del servidor; la ruta vieja sigue viva un ciclo de release. Sin hermana, se saltea.
Q5 · idioma del texto visible El del host Sigue la señal de idioma de la app. Identificadores y data-testid quedan en inglés.
Q6 · resaltado de código Pre-respondidas por la detección Reusa el del host; si no hay, Shiki del lado del servidor.
Q7 · driver de UI para agentes playwright-cli si su skill está; el MCP de Playwright como alternativa.
Q8 · visor de requests Tarjetas estilo Postman; bloques curl si el kit no puede.
Gate con las respuestas se escribe .session/testability-guide/plan.md; cuando lo aceptas pasa de draft a approved y recién ahí empieza la fase 4. En un parche quirúrgico, solo vuelven las preguntas cuyo valor cambió.
08 · fase 4

La página: secciones §1 a §7, un objeto de configuración

Layout propio con índice fijo y hero, no una lista de acordeones. Todo valor que la página muestra sale de qaConfig, el puente entre la detección y el render.

§1 · Credenciales, arriba de todo

Lo primero que ve un tester: un botón que abre el destino de las credenciales en otra pestaña. Sin destino detectado, un hueco y ningún botón.

§2 · Arquitectura y repos

Frontend → API → base con el stack detectado, la capa MCP debajo, y los repos oficiales (uno si es monorepo, dos si es polyrepo).

§3 · La trifuerza y el .env

UI + API + DB, y cómo se cargan las variables: el agente abre sin ellas, cada MCP lee su .env al arrancar y un comando que necesita un valor corre con bunx varlock run. Si una no carga, el MCP devuelve 401/403 y hay que salir, corregir y volver a entrar.

§4 · Base de datos, dos caminos

El MCP de base o una URI para la extensión SQL del editor, con el mismo rol de solo lectura. El MCP sale del bloque stack: de .agents/project.yaml: DBHub por defecto, y una app Supabase suma además la pestaña del MCP de Supabase, también de solo lectura. Roles, columnas revocadas o la prueba de RLS, solo si el proyecto los tiene.

§5 · API, dos caminos

Las requests de auth reales del proyecto, el MCP de OpenAPI o el de Postman, y el link a la UI de docs detectada. El MCP de OpenAPI solo lista endpoints y lee sus esquemas: las requests con auth corren con curl y el token personal de cada tester. Sin camino a un token, lo dice: nunca inventa un endpoint.

§6 · UI con Playwright

Un fixture que puentea UI y API según la forma del auth detectada, y el recetario de playwright-cli para exploración con agentes.

§7 · Referencia rápida

Usuarios demo, tabla de endpoints sacada del spec y los errores más comunes.

Se adapta al host

Usa lo que la app ya tiene

  • Kit de UI, iconos y mecanismo de tema claro/oscuro del host. Ningún sistema paralelo.
  • Ruta idiomática del framework (App Router, Pages, Remix, Astro, SvelteKit, Nuxt, Vite con React Router). Otro framework: se detiene y te pregunta.
  • Un data-testid en cada elemento interactivo, uno por nodo.
Dependencias

Una sola excepción

  • No agrega dependencias. Falta un componente: lo crea local, en el estilo del host.
  • La excepción es un resaltador de sintaxis que corre en el servidor (Shiki o el que el host ya use): cero JavaScript en el cliente. Y se saltea si el host prohíbe dependencias nuevas.
09 · el sello de build

Qué deploy estoy mirando? La página lo dice

Bajo el subtítulo, la página muestra el SHA corto del commit desplegado, con link al commit cuando hay un repo detectado. Un hallazgo queda atado a un commit, y "ya está mi fix?" se contesta en la misma página.

Cómo lo lee

En runtime, en el servidor, desde la variable de plataforma cuyo nombre anotó la detección en qaConfig.build. En Vercel es VERCEL_GIT_COMMIT_SHA.

Lo que nunca hace

Escribir el SHA en el código de /qa: quedaría viejo en el próximo deploy.

Mostrar otras variables de plataforma al lado (mensaje del commit, autor, secretos).

Sin SHA

En local, o en un deploy sin metadata de git, el mismo nodo muestra una línea visible: build local, sin SHA de despliegue.

El nodo qa-build-sha siempre está, con el SHA completo en data-sha (vacío en el fallback), para que la automatización lo lea.

Un redeploy nunca es drift. El snapshot guarda solo el nombre de la variable (build-sha-source), y el content-hash cubre el cuerpo de credenciales, que no lleva el SHA. Cuando el cambio llega a un entorno desplegado, la verificación compara data-sha con el commit que ese entorno debería correr y confirma que existe un deploy para él. Un data-sha vacío ahí significa que falta la fuente: se arregla la fuente, nunca se escribe el valor a mano.
10 · fases 5 y 6

Credenciales: se escribe una vez, se publica donde elijas

El cuerpo markdown de references/credentials-content-template.md es la única fuente de verdad. Cada destino es un adaptador fino que cambia el envoltorio, nunca el contenido.

Qué lleva

Directo al punto

  • Quién es la audiencia y el recuadro de "qué vive aquí y qué vive en /qa".
  • Tabla de entornos, desde environments de .agents/project.yaml.
  • Auth en la UI: cada tester se crea su usuario (default con alta self-service o magic link) o una tabla de cuentas demo compartidas, cuando no hay alta propia.
  • Auth en la DB: la URI cruda para un editor SQL y los campos separados que lee el MCP. No son intercambiables.
  • Auth en la API: un bloque .env con la URL base y la URL del spec, sin ranura para el token; cada tester genera el suyo y lo usa por nombre con curl.
  • Cómo activar los MCPs, seguridad y un pie que apunta a /qa.
Qué nunca lleva

Un secreto escrito por la IA

  • Todo valor sensible sale como el literal <see secrets store>. Lo completa una persona dentro del destino, donde queda la auditoría.
  • El cuerpo no se escribe en ningún archivo del repo del host.
  • Ni siquiera al pegarlo a mano: un chat se puede capturar o loguear.
Destino (Q1) Herramienta Detalle
Epic de Jira (default) /acli Markdown → ADF con el conversor de la skill acli; cada snippet sale con botón de copiar. Las tablas se arman a mano y se verifican leyendo el Epic de vuelta.
Página de Confluence /acli o el MCP de Atlassian Restricción de página al grupo de QA.
Página de Notion MCP de Notion si está Compartida solo con personas puntuales.
Otra herramienta con MCP o CLI El MCP o la CLI detectados Por ejemplo un gestor de secretos o una wiki interna.
Pegado a mano Ninguna Te entrega el cuerpo y los pasos; tú le devuelves la URL final. Avisa si la URL parece pública.
Si no hay herramienta

Cae a pegado a mano

  • Destino elegido pero sin MCP o CLI disponible: el cuerpo nunca se pierde. Te dice qué instalar o dónde pegar.
Si la herramienta falla el auth

Se detiene

  • Un 401/403 no dispara el fallback: esconde el problema real. Te nombra la variable de .env y te pide reiniciar la sesión del agente, porque el MCP lee el entorno al arrancar.
Después de la primera publicación, el artefacto es de una persona. El lead completa los valores reales dentro del destino. Por eso una re-corrida primero lee el cuerpo actual: si está curado a mano, no lo pisa. Te ofrece dejarlo intacto con un comentario que apunte a la /qa refrescada (recomendado), un merge guiado, o sobrescribir aceptando perder lo curado. Dejarlo intacto es un resultado exitoso.
11 · fase 7

Auditoría de seguridad, antes de que salga nada

Corre antes de cualquier llamada de publicación y aplica a todos los adaptadores: ninguno puede saltearla. Si un punto no se cumple, no se publica.

Nunca una credencial de superusuario o dueño del esquema. Si es la única que hay, se detiene y te entrega el SQL para crear un rol qa_* de solo lectura. Aunque insistas, no la escribe en el artefacto.
Nunca secretos que firman sesiones (NEXTAUTH_SECRET, claves JWT, secretos OAuth de servidor). Si aparecen con valor en .env.example, frena y recomienda rotarlos.
Nunca credenciales de escritura de producción. Solo el rol de lectura; las escrituras van por la API.
Nunca re-publica algo que ya se filtró en el historial de git sin rotarlo antes.
En la página: ni credenciales, ni hostnames privados, ni analytics o scripts de terceros. Las cuentas demo de alcance intencionalmente público pueden mostrar su contraseña; las de cada tester, nunca. Ante la duda, solo emails.
En el destino: acceso cerrado con el permiso nativo (vista restringida del Epic, restricción de página, compartir con personas puntuales).

al final de cada corrida queda un rastro de auditoría: destino, URL del artefacto, ruta, si se rechazó un superusuario, si hace falta rotar y las banderas de testeabilidad

12 · fases 8 y 9

Verificar en orden, y que el trabajo entre por un PR

"Terminado" quiere decir que pasó cada chequeo de references/verification-checklist.md. Si uno falla, se arregla y se vuelve a empezar desde el primero.

Tipos, build y lint

Con los scripts que declare el package.json del host, nunca uno supuesto. Las reglas de lint no se apagan: se corrige la página.

Smoke en el navegador

Con /playwright-cli contra el dev server: carga, título, sello de build, el botón abre el destino en otra pestaña, los bloques de código, el redirect si lo hubo, y una captura para el PR.

El destino se ve bien

Esto lo confirma una persona: snippets con botón de copiar, acceso cerrado y el link de vuelta a /qa.

El diff no tiene secretos

Ni contraseñas, ni tokens, ni hostnames privados, ni un SHA literal dentro de app/qa/.

Snapshot completo y autochequeo

El placeholder del hash ya se reemplazó por el real. Y las preguntas de cierre: leyó el código antes de escribir?, las credenciales arriba de todo?, el PR contra la rama por defecto detectada?

Commit + PR

Se delegan a /git-flow-master con el nombre de rama, los mensajes de commit y el título del PR. La skill nunca hace push, ni abre el PR, ni toca ramas por su cuenta.

La política de push

Si algo puede ir directo a una rama protegida no lo decide esta skill: lo resuelve /git-flow-master con git_strategy.policy.direct_push_to_protected de .agents/project.yaml.

Al terminar

La sesión se archiva en .session/.archive/. El snapshot queda en la página: es la señal para la próxima corrida.

13 · qué lee y qué deja

Los archivos dueños de cada dato

El orden de lectura para una IA que arranca en frío. Corta antes cuando la corrida es chica, por ejemplo un no-op del snapshot.

Archivo Para qué
.agents/project.yaml Identidad del proyecto, URLs de entornos, repos, clave de Jira.
.mcp.json Qué servidores MCP hay: decide qué destinos de publicación están al alcance.
La página /qa existente Su snapshot, para el chequeo de drift.
El contrato del destino Depende de Q1: el adaptador en references/publishers/.
.env.example Los nombres de las variables que el artefacto referencia. Nunca los valores.
Deja en el repo

Vía un PR

  • La página en la ruta idiomática del framework, con su snapshot arriba.
  • El redirect de la ruta vieja, si elegiste uno.
Deja afuera del repo

Donde corresponde

  • El artefacto de credenciales, en el destino elegido.
  • El estado de la corrida en .session/testability-guide/, que se archiva al terminar.
14 · rieles de seguridad

Lo que la skill nunca hace

Los antipatrones completos viven en SKILL.md y viajan en el registro compacto que reciben los subagentes (.agents/skills/REGISTRY.md).

No escribe valores de credenciales ni en la página ni en el cuerpo del artefacto: referencia variables por nombre.
No se saltea la detección de drift ni regenera de cero cuando alcanza un parche puntual.
No cierra /qa en producción por reflejo: solo cuando una página operativa filtraría; una plataforma de práctica la deja abierta.
No usa datos reales: nada de PII ni datos de producción. Solo usuarios demo y fixtures saneados.
No duplica el cuerpo de credenciales entre destinos: una fuente, adaptadores finos.
No asume que nada cambió sin volver a leer el snapshot y compararlo con el stack actual.
No escribe el SHA del deploy en el código: se lee en runtime.
No sigue sin la herramienta que necesita: si falta la documentación de librerías o la búsqueda web en el paso que la requiere, se detiene y te dice cuál falta, sin un sustituto silencioso.
15 · qué le dices a la IA

Invocarla en las tres terminales

Esta skill no tiene modos con nombre: la misma invocación crea la página la primera vez y la actualiza las siguientes. Nombras la skill y dices qué quieres, en español o en inglés.

Claude Code

/testability-guide create the QA guide page

La barra carga la skill; el resto de la frase adelanta respuestas.

OpenCode

carga la skill testability-guide: guía de testeabilidad

Sin barra: nombras la skill en la frase.

Codex

carga la skill testability-guide: update /qa page

Mismo patrón que OpenCode, CLI o Desktop.

Lo que digas en el pedido ya cuenta como respuesta. "Publica las credenciales como Epic de Jira, página en /qa, texto en español" fija Q1, Q3 y Q5: la IA te confirma lo fijado y solo pregunta lo que falta.
16 · alrededor de esta skill

A quién le pasa la posta

Antes · base técnica

/project-bootstrap

Deja la app montada; esta skill corre después. También es la dueña de los arreglos de testeabilidad de infraestructura, como un endpoint de token. Deck: Project bootstrap.

Después · bugs de la página

/sprint-development

Un bug que QA encuentra en la propia página se vuelve una historia normal. También recibe los arreglos de testeabilidad a nivel feature.

Después · mapa de features

/project-context features

Registra /qa como página operativa interna, que no necesita cobertura en el PRD.

Después · docs

Seguimiento de docs

Suma la página y la ubicación del artefacto a las rutas clave de .agents/instructions/agent-project.md, para que otras skills sepan que existen.

Durante · git y Jira

/git-flow-master · /acli

Uno lleva el commit y el PR; el otro publica el Epic de credenciales cuando ese es el destino.

Para leer más: .agents/skills/testability-guide/SKILL.md y su carpeta references/: una referencia por fase, más un adaptador por destino en references/publishers/.