Agentic QA · Categoría de skills

<aspect>-context

Las context skills: skills que cambian lo que el agente sabe sobre un aspecto del producto o del método, nunca lo que hace después. Llegan sin que nadie las pida y se leen por partes.

Frontmatter: metadata.kind: context Lectura: bun run context:map Lista viva: REGISTRY.md
Este deck explica la categoría entera, no una skill: por qué existen, cómo están armadas, cómo se genera y se mantiene el mapa que llevan adentro, quién las entrega y cómo un proyecto crea las suyas. Pulsá → para avanzar, S para modo presentador, O para overview, F para pantalla completa.

El principio · 2 de 17

Un script trae datos; una IA sintetiza conocimiento

PREGUNTA 1 Lo trae un script desde una fuente externa (Jira, OpenAPI, CI)? sí .context/ · [SYNC] caché que reconstruye el script context:hydrate · api:sync no PREGUNTA 2 Este repo es la fuente de verdad? (un ADR, un plan de automatización) sí .context/ · [COMMIT] versionado junto al código ADR, test-specs/ no PREGUNTA 3 · LO DEMÁS La IA lo sintetiza desde código, DB y contratos, o una persona escribe juicio Una context skill la síntesis, como su mapa HTML el juicio, en Rules y gotchas.md Una caché es barata de reconstruir y sale igual en dos máquinas. Una síntesis no: dos sesiones la escriben distinto y rehacerla cuesta miles de tokens.

La línea divisoria

.context/ guarda lo que un script trae de una fuente de verdad, más lo poco que este repo es dueño. Lo que una IA sintetiza vive en una skill.

Por qué una skill

Ese conocimiento es autoral (lo escribe una IA, pero lo escribe) y tiene que llegar sin que nadie lo pida. Una skill se carga sola por su description; un archivo suelto en .context/ espera a que alguien lo abra.

Este es el test de las tres preguntas de skill-scaffold.md §3. La caché de Jira (.context/PBI/) se reconstruye con context:hydrate y no se versiona; un ADR es del repo y sí se versiona. Lo que queda afuera de ambas, la síntesis del sistema bajo prueba y el juicio para leerla, es el territorio de las context skills.

El principio · 3 de 17

Hechos en el mapa, juicio en las reglas

La pregunta

Dos sesiones competentes lo escribirían distinto? Sí: es juicio, va como regla fechada en ## Rules o en references/gotchas.md. No: es un hecho, va al mapa (o a la caché) y nunca al SKILL.md.

Ejemplo de juicio

"Las órdenes se borran en forma lógica: un conteo sin deleted_at IS NULL está mal." El mapa describe la tabla; la regla enseña a leerla.

Cada regla, medida

fecha · regla · measured: cómo. Sin medición no hay regla: la idea va a Engram.

Cita, nunca copia

Una context skill que repite un hecho de .context/ es una segunda fuente de verdad y no pasa review. Nombra el path o el comando, y el lector va a buscarlo.

El mapa es la única copia

El mapa HTML no duplica nada: es la única copia de esa síntesis. Los markdown viejos son entrada del generador.

La lint lo vigila

STALE-PATH es estricta acá: todo path de .context/ citado tiene que existir. Solo .context/PBI/ queda exento.

La mitad "cita" la controla la lint; la mitad "no copia" es una regla de review. Por eso el mapa nace antes que la skill que lo cita: una context skill sobre la nada se volvería la fuente por accidente.

Anatomía · 4 de 17

Cómo está armada una context skill

--- name: <aspect>-context description: "Trigger: <aspecto>, <palabras del dominio>..." license: MIT compatibility: [claude-code, codex, opencode] metadata: kind: context writes: [references/] # solo si lleva un mapa requires_capabilities: [diagrams] --- .agents/skills/<aspect>-context/ SKILL.md references/gotchas.md references/<map>.html # si lleva un mapa references/refresh.md # si lleva un mapa

Contrato: agentic-qa-core/references/skill-scaffold.md §1, §2 y §4. KIND-SUFFIX exige el sufijo -context para el kind context, y al revés.

Secciones obligatorias del cuerpo

What this skill knowsun solo aspecto
Sources of truthlo que cita, con su rol
Rulesjuicio, cada regla fechada
Not herequé pertenece a otra parte

Alcance de escritura

metadata.writes solo existe en una context skill y solo puede nombrar su propio references/. Lo controla CONTEXT-WRITES, que además exige refresh.md y prohíbe cualquier tag de escritura en Jira.

gotchas.md sigue el género medido: columnas # · Gotcha · Symptom · Fix · Measured · Verified against, y una sección "No longer true" adonde se mueven las filas que dejan de valer, sin borrarlas. requires_capabilities declara lo que la skill necesita al usarla: diagrams para redibujar una figura, db o api-schema según el aspecto.

La categoría · 5 de 17

Tres familias, un mismo kind

Con mapa · entregadas por upstream

Llegan como placeholders y cada una guarda un mapa HTML del sistema bajo prueba. La lista es CONTEXT_MAP_SKILLS en cli/lib/context-maps.ts, con el generador de cada mapa.

El índice del método

iql-context: la metodología IQL de este repo. Sin mapa y sin escritura propia. Upstream la sincroniza y cada proyecto la adapta por dos costuras (slide 14).

Del proyecto

Cualquier otro <aspect>-context (un billing-context, un auth-context) es del proyecto por construcción. Upstream nunca lo entrega, nunca lo pisa, nunca lo borra.

Ejemplo con mapaQué sabeQuién genera su mapa
business-data-contextentidades, estados, triggers, jobs, integracionesproject-context modo data
business-api-contextgrupos de endpoints, auth, semántica de erroresproject-context modo api
business-domain-contextel negocio y el significado de cada términoproject-discovery Phase 1

La tabla muestra ejemplos. La lista completa y vigente: CONTEXT_MAP_SKILLS para las que llevan mapa y .agents/skills/REGISTRY.md para todas las skills.

El deck no enumera la categoría a propósito: la lista cambia con la vida del repo y su dueño es el código. Cada entrada de CONTEXT_MAP_SKILLS declara el slug, el archivo del mapa, el generador tal como lo corre un usuario y la lista de markdown viejos que ese mapa reemplaza.

El mapa · 6 de 17

La vida de un mapa: se crea una vez, se edita por secciones

Entrega

Placeholder

bun sync deja la carpeta
si falta

→

CREATE

El generador lo escribe

todas las secciones, una vez
markdown viejo como entrada

→

Uso

Se lee por el lector

context:map <slug>
--section <id>

Cuando la realidad lo contradice

Una sección

La skill propone

evidencia · antes / después
se aplica con aprobación

Varias secciones

El generador en UPDATE

chequeo de staleness
diff por sección · aprobación

Una figura

Se redibuja sola esa

un <figure>, nada más

Lo que no pasa nunca

Regenerar

El mapa entero

ningún camino lo hace

Borrar

Los markdown viejos

quedan como entrada

Renombrar

El id de una sección

es el ancla de edición

Ese es el ahorro de tokens: el id de cada sección convierte una actualización en una edición sobre un bloque. Procedimiento completo en agentic-qa-core/references/business-context-maps.md §4 a §6.

El mapa · 7 de 17

Un HTML con un contrato que el lector entiende

<!-- generated by project-context mode data; edited in place by business-data-context refresh; do not hand-edit --> ... <section id="order-lifecycle" data-sources="src/orders/, db:orders" data-updated="AAAA-MM-DD"> <h2>Ciclo de vida de una orden</h2> <p>...</p> <figure data-diagram="state" data-for="order-lifecycle"> <svg>...</svg><figcaption>...</figcaption> </figure> </section> ... <section id="discovery-gaps">...</section>

Sin generar, la línea 1 dice <!-- placeholder: ... -->. El lector, el updater y el doctor solo miran esa línea.

Secciones planas

Una por unidad de hecho (una entidad, un flujo, un journey, un término, un NFR), nunca anidadas. El id no cambia después del CREATE. data-sources dice de dónde salió: paths del repo, db:, openapi:, route:.

El texto manda

Ningún hecho vive solo dentro de un diagrama. Las figuras las dibuja diagram-design (capability diagrams); si falta, se frena.

Última sección

discovery-gaps: "no pude verificar X" vale más que una respuesta inventada.

El head lleva solo estilos inline, sin scripts externos, para que el archivo abra desde file://. Un mapa generado puede tener conteos (filas por tabla, endpoints por grupo): es un artefacto generado, exento de la Regla #17 como todo archivo generado.

Lectura · 8 de 17

La IA nunca abre el HTML: lo lee por context:map

ComandoPara qué
bun run context:map <slug>el mapa entero como texto
bun run context:map <slug> --section <id>una sección, cuando el trabajo toca una entidad, un journey o un término
bun run context:map <slug> --listel índice: id · fecha · fuentes, para un chequeo de staleness
## Ciclo de vida de una orden <!-- id: order-lifecycle · updated: AAAA-MM-DD · sources: src/orders/, db:orders --> Una orden nace en draft y ... [figure: state - Estados de la orden]

Así imprime una sección (ejemplo ilustrativo).

Placeholder no es "sistema vacío"

Imprime un aviso con su generador y sale con código 0: se trata como "no hay mapa".

Por qué un lector

El SVG inline es casi todos los bytes y ningún hecho. scripts/context-map.ts quita SVG, estilos, scripts y el head, y reduce cada figura a una línea. La IA paga solo el texto.

Un hecho se cita con su id de sección y su fecha data-updated. Una sección más vieja que el código que describe es una hipótesis a verificar (con la DB, con el contrato), no una respuesta.

Mantenimiento · 9 de 17

Sigue vigente esta sección? La responde data-sources

Señal declaradaVencida cuando
src/orders/hay commits en ese path desde data-updated (git log --since=<fecha> -- <path>)
openapi:<tag>el contrato cambió desde la fecha (salida de bun run api:sync, o el git log del spec)
db:<tabla>una migración posterior, o la DB muestra una columna o constraint que la sección no describe
route:<path>el archivo de la ruta o de la página cambió
sin fuentesse reporta como unknown, nunca como vigente en silencio

Dos caminos, nunca mezclados

Una sección contradicha por algo que vio una sesión: la skill propone la edición. Varias vencidas, o una entidad que el mapa no tiene: el generador en UPDATE regenera solo esas y muestra el diff por sección.

Señales propias del aspecto

Cada skill con mapa agrega las suyas en su references/refresh.md, que es del proyecto. Por ejemplo, la de datos suma cron:<job> y webhook:<event>.

La lista genérica de señales vive en business-context-maps.md §5, que es doctrina sincronizada. refresh.md tiene solo lo específico del aspecto y es del proyecto.

Mantenimiento · 10 de 17

La skill propone; aplica solo con un sí

1

Ubicar

--list, después
--section <id>

→

2

Evidencia

medida: query, request,
archivo en un commit

→

3

Proponer

al usuario, o al conductor
si es un worker

→

4

Aplicar con OK

releer, editar un bloque,
actualizar data-updated

→

5

Verificar

--section <id> imprime
el texto nuevo

business-data-context · proposed edit to section <id> (updated <date>) evidence: <what was observed, how, where> before: <the sentence or row as the map has it> after: <the replacement> figure: <unchanged | redraw: why> apply? (yes / no)

El mensaje, tal como lo define references/refresh.md.

El silencio no aprueba

Solo un sí aplica la edición. Sin evidencia no hay propuesta. Un subagente de una sola vuelta pone la propuesta en su reporte en lugar de aplicarla.

Dónde escribe

Solo bajo su propio references/. Nunca Jira, nunca .context/, nunca otra skill, nunca código del producto. Y nunca corre una etapa del proceso.

Paso 4 en detalle: releer la sección porque otra sesión pudo editarla, editar ese único bloque section, poner data-updated con la fecha de la edición, sumar a data-sources cualquier señal nueva y redibujar la figura solo si cambiaron sus hechos. Una regla de juicio (no un hecho) sigue el mismo camino de aprobación hacia gotchas.md o Rules.

Carga · 11 de 17

Solo llega la del aspecto que se toca

En la conversación principal

Se dispara por su description, aunque nadie diga "mapa": una pregunta sobre un status code raro trae a la de API.

En un subagente

El Skill Resolver inyecta solo las context skills cuyo aspecto toca el despacho, nunca todas, y para un mapa inyecta el comando (context:map <slug> --section <id>), nunca el path del HTML. Sin aspecto nombrado, ninguna.

Si el despacho...recibe (ejemplos)
siembra datos, escribe SQL, sigue una entidadbusiness-data-context
tests de API, endpoints, auth, status codesbusiness-api-context
tests E2E, un smoke, un flujo de usuariobusiness-e2e-context
nombra conceptos: un ATP, un caso, un ACbusiness-domain-context
stack, entornos, CI, auth en testsinfra-context
explica o aplica la metodologíaiql-context
toca el aspecto de una skill propia<aspect>-context
Protocolo: agentic-qa-core/references/skill-resolver.md, en la regla de context skills. La decisión de relevancia es del orquestador: ante la duda, el aspecto se nombra en el Goal del briefing.

Entrega · 12 de 17

Quién es dueño de qué cuando corre bun sync

QuéQué hace el updaterDueño
Una skill de CONTEXT_MAP_SKILLSentrega la carpeta entera una vez, si falta; después nunca la pisa ni la borrael proyecto, desde la entrega
Su mapa sin generar, o un markdown viejo al ladouna fila informativa, nunca bloqueante, en el reporte de cierre (la tabla por superficie, en la página local y en la terminal); bun run setup:doctor la repite como avisoel proyecto
Cualquier otro <aspect>-contextnunca lo entrega, nunca lo pisa, nunca lo borra, aunque upstream publicara uno con el mismo slugel proyecto, por construcción
iql-context (cuerpo y referencias)lo sincroniza tal cual; una edición directa sale como fila de paridadupstream
su project-overrides.mdlo entrega una vez si falta; después nunca lo pisael proyecto

Por qué así

El mapa adentro de una skill entregada es la síntesis de ese proyecto: pisarlo en un sync borraría trabajo que costó miles de tokens. La regla vive en isProjectLocalSkillPath (cli/lib/updater-core.ts) y la excepción de entrega única, en cli/lib/context-maps.ts.

Los SUT context skills (billing-context, auth-context y similares) nunca se publican upstream. Upstream solo es dueño de iql-context, del slug histórico project-context (que es un workflow, no una context skill) y de sync-ai-context, retirado y conservado para que el updater pueda quitar una copia vieja.

Crear · 13 de 17

Una context skill del proyecto: se propone, después se crea

Propone

project-discovery

al cierre: una línea por aspecto
nunca un archivo

→

Precondición

Lo que cita existe

el mapa o el path
antes que la skill

→

Crea

project-context · context-skill

siempre a través de
skill-creator

→

Gate

Validación

skills:check · skills:registry
fila en .agents/instructions/agent-project.md

Análisis antes de escribir

Leer la fuente entera, listar dónde una sesión competente la leería mal (borrado lógico, campos derivados, estados que la API y la UI nombran distinto) y pasar cada candidato por las tres preguntas.

CREATE y UPDATE

Si la carpeta no existe, la escribe después del análisis. Si existe, muestra el diff y espera. Las reglas viejas no se reescriben: se agregan nuevas con fecha, y una contradicha pasa a "No longer true".

Lo que no crea

Un pedido de data-context, api-context, glossary-context o infra-context se responde señalando la skill que ya viene, nunca con una segunda skill sobre el mismo aspecto.

Cómo se invoca

Claude Code: /project-context context-skill <aspect>. OpenCode y Codex: cargá la skill project-context, modo context-skill, y nombrá el aspecto. refresh-all nunca incluye este modo.

skill-creator es el constructor de toda skill que este repo arma: borrador, prompts de prueba en evals/evals.json y pasada sobre la description. Si no está instalado en la máquina, el modo arma la skill desde la plantilla de skill-scaffold.md §4 y lo dice en el reporte, nunca en silencio. Cuando lo que la skill cita se regenera, el modo ofrece correr su UPDATE: es el momento barato para revisar el juicio. Contrato: project-context/references/context-skill.md.

El índice del método · 14 de 17

iql-context: el método, como conocimiento

Qué sabe

Por qué el proceso QA tiene la forma que tiene: fases, etapas con nombre (nunca con número), la escalera de artefactos (de MTP a ATR), dónde se aplica cada invariante y el contrato agéntico.

Qué no hace

Nunca corre una etapa (eso es de las skills de workflow) y no sabe nada del producto bajo prueba.

Web y repo en desacuerdo

Las skills aplican la doctrina de agentic-qa-core/references/. Esta skill da las dos lecturas y no "arregla" ninguna.

Cómo la adapta un proyecto (dos costuras)

CosturaQué va ahí
.agents/project.yaml → qa.methodologyvalores: etapas que corre, gates strict o light, perfil de ejecución
references/project-overrides.mdprosa: una etapa corrida distinto, un artefacto renombrado, un gate colapsado, vocabulario local
El cuerpo y las demás referenciasninguna: se sincronizan tal cual

Lo que dice project-overrides.md gana sobre el índice, solo para ese proyecto.

De las context skills que vienen de upstream, iql-context es la única sin mapa y sin metadata.writes: no edita nada propio. Se carga ante preguntas del tipo "por qué creamos un ATS por historia?", "qué es una altitud?", "qué significa light mode?". Para preguntas de un solo aspecto del método carga solo la referencia de ese aspecto.

Para personas · 15 de 17

El mismo archivo, servido a una persona

UNA SOLA COPIA .agents/skills/<slug>/ references/<map>.html Una persona bun run docs carpeta "Mapas de contexto" del portal, servida en su lugar o el archivo, desde file:// La IA bun run context:map texto sin SVG, por sección con id, fecha y fuentes nunca el HTML crudo

Sin copia en docs/

bun run docs sirve cada mapa desde la carpeta de su skill, bajo la carpeta virtual mapas-de-contexto/. El portal y la IA leen el mismo archivo.

Un mapa sin generar

Aparece en el portal con la indicación "Sin generar todavía: ejecuta" seguida del generador de esa skill.

Ni gemelo en markdown

No hay versión markdown del mapa: el gemelo es siempre el que se desactualiza.

El servidor local es scripts/docs-serve.ts y lee la misma lista CONTEXT_MAP_SKILLS. Este sitio publicado no sirve los mapas: son del proyecto que los generó, y viven en su repo.

Salvaguardas · 16 de 17

Lo que una context skill nunca hace

C1Leer el mapa HTML crudo: siempre por bun run context:map.
C2Responder sobre un placeholder como si el sistema estuviera vacío.
C3Regenerar un mapa entero, o reescribir una sección que nadie contradijo.
C4Cambiar el id de una sección: una entidad renombrada es una sección nueva más una línea en discovery-gaps.
C5Copiar contenido del mapa o de .context/ dentro de su SKILL.md.
C6Escribir fuera de su propio references/: ni Jira, ni .context/, ni otra skill, ni código del producto.
C7Aplicar una edición sin un sí explícito, o proponerla sin evidencia medida.
C8Tomar una sección más vieja que el código como respuesta: es una hipótesis a verificar.
C9Publicar upstream una context skill del sistema bajo prueba.
C1, C2 y C8 protegen la calidad de lo que la IA responde; C3, C4 y C7 protegen el mapa; C5, C6 y C9 protegen la separación entre fuentes. La numeración es del deck, no de la doctrina.

Cierre · 17 de 17

Dónde leer más y quién alimenta a quién

Cómo se usan

No se invocan como un workflow: se cargan solas por su description en los tres hosts. Para pedirlas a mano, en Claude Code /<aspect>-context; en OpenCode y Codex, cargá la skill <aspect>-context. No tienen modos.

Quién escribe sus mapas

/project-discovery: el de dominio (Phase 1) y el de infraestructura (Phases 2-3).
/project-context: los de datos, API y E2E (modos data, api, e2e), y las skills nuevas (modo context-skill).

Quién las lee

Las skills de workflow y sus subagentes, cada vez que tocan el aspecto: /shift-left-testing, /sprint-testing, /test-automation, /test-framework-adaptation y el resto, según el Skill Resolver.

El canon

agentic-qa-core/references/skill-scaffold.md §3 (el principio) · business-context-maps.md (el mapa) · skill-resolver.md (quién las carga) · cli/lib/context-maps.ts (la lista) · scripts/context-map.ts (el lector) · .agents/skills/REGISTRY.md (todas las skills).

Fin del recorrido. El slide 2 resume la idea entera: lo que un script trae va a .context/, lo que una IA sintetiza vive en una skill, y la skill lo cita, lo lee por partes y lo corrige solo con evidencia y aprobación.
← → navegar · O resumen · S presentador · N notas · F pantalla