Planos · agentic-dev-boilerplate
00 · context skills

El mapa del negocio llega solo, no se busca.

Qué entidades tiene el producto, qué puede hacer cada rol desde cada pantalla, qué cambia cada ruta: eso no lo saca ningún script de una fuente. Lo escribe una IA leyendo el código, el esquema y el contrato del API. Por eso cada mapa del negocio vive adentro de una skill de contexto, como un HTML que un humano abre en el navegador y que la IA lee por sección con bun run context:map. Este deck explica qué es un mapa, cómo se lee y cómo se mantiene honesto.

para quien desarrolla y quien mantiene conocimiento, no un workflow escribe solo en su references/
Generar

Un modo de project-context

data, features o api leen las fuentes y escriben el mapa.

→
Guardar

Un HTML en la skill

references/<map>.html, una sección por hecho.

→
Leer

El lector

bun run context:map saca el SVG y deja el texto, por sección.

→
Usar

La IA, o tú

Un briefing inyecta el comando; un humano usa --open y lo ve en el navegador.

→
Corregir

Una sección por vez

Lo que contradice al mapa se propone con evidencia y se aplica con tu sí.

01 · por qué un mapa es una skill

Una síntesis no es un caché

.context/ guarda lo que un SCRIPT trae de una fuente de verdad y lo que este repo mismo es fuente de verdad. Un mapa del negocio no es ninguna de las dos cosas: dos sesiones lo escribirían distinto y rehacerlo cuesta miles de tokens. Es conocimiento escrito, y el conocimiento que tiene que llegar sin que nadie lo pida es una skill.

La pregunta, para cada pieza de conocimiento Si la respuesta es sí, va a Se recupera con
Un script la trae de una fuente externa? (Jira, el spec OpenAPI, el esquema) .context/ como caché [SYNC], o tipos generados bun run context:hydrate, bun run api:sync
Este repo es la fuente de verdad? (ADR, PRD, SRS, glosario, plan de diseño) .context/ como [COMMIT] git checkout
Si no: la IA la sintetiza del código, la base y los contratos Una skill de contexto: el mapa generado adentro, el juicio en sus reglas Regenerar cuesta caro: se corrige por sección
Hecho

Va al mapa

  • Dos sesiones competentes lo escribirían igual: una entidad, una ruta, una acción CRUD. Nunca se copia al SKILL.md.
Juicio

Va a las reglas de la skill

  • Dos sesiones lo escribirían distinto: "los perfiles tienen borrado lógico; un conteo sin deleted_at IS NULL está mal". Va a ## Rules o a references/gotchas.md, con fecha y cómo se midió.
Un solo archivo, sin gemelo. El humano y la IA leen el mismo HTML. No hay copia en markdown ni otra bajo docs/: el gemelo es siempre el que se desactualiza. Para ver el otro lado, el caché de Jira, está el deck el caché del PBI.
02 · los mapas que trae el boilerplate

Un aspecto por skill, un generador por mapa

La lista única de skills con mapa es CONTEXT_MAP_SKILLS en cli/lib/context-maps.ts: cada entrada nombra su mapa, su generador y el markdown viejo que reemplaza. La tabla de abajo es lo que trae el boilerplate; para saber qué hay en tu repo, lee esa constante.

Skill Qué sabe Generador Ante un conflicto gana
business-data-context Entidades y relaciones, RLS, migraciones, máquinas de estado, procesos automáticos, integraciones project-context modo data La base viva de Supabase (capability db)
business-feature-context Catálogo de features, matriz CRUD, inventario de UI, flujos entre features project-context modo features El árbol del frontend; la app corriendo, para el comportamiento
business-api-context Modelo de auth, grupos de rutas, superficie OpenAPI, recorridos entre rutas project-context modo api El spec para la forma; los handlers y el API corriendo, para el comportamiento
Se cargan por su descripciónUna tarea que escribe una migración trae la de datos; una que toca un handler, la de API; una que toca una pantalla, la de features. Nadie tiene que decir "mapa".
No hay mapa de dominio ni de infraestructuraEl vocabulario vive en .context/business/domain-glossary.md, escrito a mano. PRD y SRS siguen bajo .context/.
Cada una cita a las otrasEl mapa de features nombra los datos y las rutas detrás de cada feature, y no los repite: los cita a su skill.
03 · anatomía de un mapa

El contrato que escribe el generador y parsea el lector

Un HTML autocontenido que abre desde file://, con secciones planas. El id de cada sección es el ancla de edición: se fija en el CREATE y no cambia nunca más.

<!-- línea 1 de un mapa generado -->
<!-- generated by project-context mode data; edited in place by business-data-context refresh; do not hand-edit -->
<!-- o, si todavía no se generó -->
<!-- placeholder: run project-context mode data to generate this map -->

<section id="orders-lifecycle"
         data-sources="src/app/api/orders/, db:orders, migration:<file>"
         data-updated="YYYY-MM-DD">
  <h2>...</h2>  <p> <ul> <table> <code>  <!-- HTML semántico simple -->
  <figure data-diagram="state" data-for="orders-lifecycle"><svg>…</svg><figcaption>…</figcaption></figure>
</section>
...
<section id="discovery-gaps">  <!-- siempre la última -->

La línea 1 decide todo

El lector, el updater y el doctor leen SOLO esa línea para saber si el mapa está generado o es un placeholder. El generador que nombra sale tal cual de la entrada de CONTEXT_MAP_SKILLS.

Una sección por unidad de hecho

Una entidad, un flujo, una feature, un grupo de rutas. Nunca anidadas, cada una abre con su <h2>. data-sources lista las señales de las que salió (el chequeo de frescura las lee); data-updated, la fecha.

Ningún hecho vive solo en una figura

Todo lo que muestra un diagrama también está en el texto. Una figura de resumen arriba, y una por sección solo donde un dibujo explica el mecanismo.

discovery-gaps, al final

Lo que no se pudo verificar. "No pude verificar X" le gana a una respuesta inventada. Una sección migrada de un mapa markdown viejo lleva data-migrated-from una vez, hasta que se regenera.

Un mapa generado puede tener conteos. Tablas por esquema, rutas por grupo: es un artefacto generado y queda exento de la Critical Rule #17, como cualquier archivo generado.
04 · cómo se lee

La IA nunca lee el HTML crudo

El SVG inline es casi todo el peso de un mapa y ninguno de sus hechos. El lector, scripts/context-map.ts, saca el SVG, el <style> y el <head>, e imprime cada sección como texto con su id, su fecha y sus fuentes.

Necesitas Comando
El mapa entero, como texto bun run context:map <slug>
Una sección (una dispatch que toca una entidad o un grupo de rutas) bun run context:map <slug> --section <id>
El índice, para un chequeo de frescura (id · fecha · fuentes) bun run context:map <slug> --list
El mapa dibujado, para un humano bun run context:map <slug> --open
En un briefing

Se inyecta el comando, no la ruta

  • El Skill Resolver (regla 5 de skill-resolver.md) inyecta solo las skills de contexto cuyo ASPECTO toca la dispatch, como bun run context:map <slug> --section <id> de las secciones que toca. Nunca todas: un subagente que toca un aspecto paga por uno.
  • Una dispatch que no nombra ningún aspecto no recibe ninguna. Ante la duda, nombralo en el Goal.
Placeholder

Es "no hay mapa", no un sistema vacío

  • El lector avisa por stderr qué generador correr y sale con 0. Nunca se planifica una migración como si el esquema estuviera vacío: se le pasa al humano el modo que lo genera.
  • Sale con 1 ante una skill desconocida, un mapa que falta o un id de sección que no existe, y en ese caso lista los ids conocidos.
Citar con fecha. Un hecho del mapa se cita con su id de sección y su data-updated. Una sección más vieja que la migración que describe es una hipótesis para chequear contra la base, no una respuesta.
05 · crear y actualizar

Ningún camino regenera un mapa entero

Generar es trabajo de project-context: sus modos, sus gates y el orden de refresh-all los explica su propio deck. Aquí va lo que le pasa al mapa. El id de sección es lo que vuelve mecánico el ahorro: una edición sobre un bloque <section>.

Estado del mapa Qué corre Qué escribe
Ausente o placeholder CREATE del modo: todas las secciones desde las fuentes. Si existe el markdown viejo que reemplaza (la lista legacy de su entrada), se lee como entrada y se cita en data-migrated-from El archivo entero, una sola vez
Generado UPDATE del modo: chequeo de frescura, regenera SOLO las secciones viejas, muestra un diff por sección y ESPERA tu aprobación Las secciones aprobadas
Cambiaron los hechos de una sección con figura Se redibuja esa figura Un <figure>
La IA hace

Lee cada fuente que pide el modo. Lo que no verificó va a discovery-gaps, no al cuerpo.

Después de escribir un mapa, revisa las ## Rules y los gotchas de esa skill contra el mapa nuevo y PROPONE cambios.

Tú decides

Qué modo corre: si no lo nombras, la IA pregunta.

Si el diff de un UPDATE se aplica.

Sale

references/<map>.html adentro de su skill, y nada más: el modo escribe solo ese archivo.

Los mapas markdown viejos de .context/business/ no se borran nunca.

Gate un mapa existente no se pisa sin tu aprobación explícita del diff por sección.
06 · está viejo?

Cada sección dice de dónde salió, y eso dice cuándo venció

El chequeo recorre --list y mira cada señal de data-sources contra su fecha. Las señales genéricas están en la doctrina; cada skill agrega las de su aspecto en su propio references/refresh.md.

Señal Vieja cuando
Una ruta del repo git log --since=<data-updated> --oneline -- <path> devuelve algún commit
db:<table>, migration:<file> Hay una migración posterior, o la base (capability db) muestra una columna, constraint, policy o trigger que la sección no describe
openapi:<x> El contrato cambió desde la fecha (salida de bun run api:sync, o el git log del spec)
route:<path> Cambió el handler o la página
Señales propias del aspecto Las declara el refresh.md de cada skill: por ejemplo cron:<job> y webhook:<event> en datos, auth:<scheme> en API, un flag o un gate de rol en features
Sin fuentes no hay frescura. Una sección que no declara fuentes se reporta como unknown, nunca como fresca en silencio.
07 · la skill se corrige a sí misma

Propone con evidencia, aplica con tu sí

Una skill de contexto no corre workflows. Lo único que hace es mantener honesto su mapa: cuando una sesión ve algo que contradice una sección (una columna que el mapa omite, un status que el mapa dice imposible, una acción CRUD que falta en la matriz), propone la edición.

# la propuesta, en un solo mensaje (references/refresh.md)
business-data-context · proposed edit to section <id> (updated <date>)
evidence: <what was observed, how, where: query / request / file@commit / session label>
before: <the sentence or row as the map has it>
after:  <the replacement>
figure: <unchanged | redraw: why>
apply? (yes / no)
Se verifica antes de proponerDatos, contra la base; features, contra la app corriendo o el archivo de ruta; API, contra el handler, los tipos OpenAPI o un request real.
Un id no se renombraUna entidad, feature o grupo renombrado es una sección nueva, más una línea en discovery-gaps durante un refresh.
Un juicio sigue el mismo caminoUna regla nueva para LEER el mapa va a ## Rules o a los gotchas, fechada y medida, con la misma aprobación.
08 · alcance de escritura

Escribe en su references/ y en ningún otro lado

La skill lo declara en su frontmatter con metadata.writes: [references/], y un lint lo hace cumplir. Nada de Jira, nada de .context/, ninguna otra skill, ni migraciones ni código del producto.

Solo una skill de kind context declara metadata.writes. En cualquier otro kind, el lint lo marca como error.
Cada destino está adentro de su propio references/. Un destino afuera es error.
Trae references/refresh.md, el procedimiento que corre su camino de escritura. Sin él, error.
Ningún tag de tracker en el cuerpo ni en refresh.md: edita su mapa, nunca un tracker.
Quién lo controla: la regla CONTEXT-WRITES de scripts/lint-skills.ts, que corre con bun run skills:check. En el mismo lint, STALE-PATH es estricto dentro de una skill de contexto: cada ruta de .context/ que cita tiene que existir (solo el caché .context/PBI/ queda exento). Cita, nunca copia.
09 · las figuras

La capability diagrams es una skill, no un MCP

Las figuras las dibuja la skill diagram-design, que instala cli/install.ts a nivel proyecto; una instalación de usuario o un plugin del harness también sirve. Es la única capability que se resuelve por la presencia de una skill y no por el sufijo de una herramienta.

Antes de dibujar

Se puede cargar diagram-design?

  • Si no: STOP en el punto de uso, nombrando la línea de instalación. Nunca un mapa con SVG dibujado a mano o ASCII en su lugar.
El estilo

Es asunto de diagram-design

  • Un marcador .diagram-design en la raíz (profile: <slug>) elige un perfil guardado si el proyecto quiere uno. Dos máquinas pueden dibujar distinto: lo que importa está en el texto.
# la línea que nombra el STOP (mcp-capabilities.md)
bunx skills add https://github.com/cathrynlavery/diagram-design --skill diagram-design --yes
10 · entrega y dueño

Upstream la entrega una vez; después es tuya

Toda skill <aspect>-context es local del proyecto: el updater nunca la entrega, la pisa ni la borra (isProjectLocalSkillPath en cli/lib/updater-core.ts). Las de CONTEXT_MAP_SKILLS son la única excepción, y es solo de entrega.

Llega como placeholder

bun sync entrega la carpeta de la skill cuando falta (collectContextMapBootstrap), con un mapa placeholder adentro.

Nunca más se toca desde upstream

A partir de ahí, nada del updater pisa ni borra lo que hay adentro: el mapa es la síntesis de TU producto, y sus reglas y gotchas también.

Un placeholder se avisa, no bloquea

Un mapa que falta o sigue en placeholder (con el markdown viejo al lado, si lo hay) aparece como fila informativa en el reporte final de bun sync (en la página y en la terminal), y bun run setup:doctor imprime la misma línea, con el generador a correr.

11 · tu propia skill de contexto

Para un aspecto que los mapas no cubren

billing, auth, stripe: la capa de juicio sobre un aspecto que una sesión competente leería mal. La crea project-context modo context-skill, siempre a través de skill-creator. Las fuentes guardan los hechos; la skill, las reglas para leerlos.

La IA hace

Lee completo lo que la skill va a cubrir y lista cada lugar donde se puede leer mal: borrado lógico, RLS que esconde filas a un rol, estados con nombres distintos en base, API y UI.

Pasa cada candidato por las tres preguntas de §01: solo el juicio queda como regla.

Tú decides

El aspecto y sobre qué se apoya.

En UPDATE, si el diff se aplica: las reglas se agregan con fecha, nunca se reescriben.

Sale

.agents/skills/<aspect>-context/ con metadata.kind: context, más references/gotchas.md.

Del proyecto, nunca enviada upstream.

Gate bun run skills:check verde y bun run skills:registry con el bloque nuevo en REGISTRY.md; ninguna oración repetida del mapa o del código.
Lo que cubre tiene que existir antesUn mapa, un módulo, un contrato. Una skill sobre nada termina siendo la fuente por accidente.
Datos, features y API ya tienen dueñoUn pedido de data-context se responde apuntando a business-data-context, nunca con una segunda fuente sobre el mismo aspecto.
Sin medición no hay reglaCada regla lleva fecha y cómo se midió. Lo que no se midió va a la memoria, no a la skill.
12 · qué le dices a la IA

Las skills de contexto no tienen modos: se generan, se leen y se cargan

Generar un mapa es un modo de project-context. Leerlo es un comando del repo, igual en los tres hosts. Cargar la skill pasa solo, por su descripción, o nombrándola.

Claude Code

/project-context data

Genera o actualiza el mapa de datos. Igual con features o api.

OpenCode

carga la skill project-context, modo data

Sin barra: nombras la skill y el modo en la frase.

Codex

carga la skill project-context, modo data

Mismo patrón que OpenCode, CLI o Desktop.

# leer, en cualquier host
bun run context:map business-data-context --section <id>
bun run context:map business-feature-context --list
bun run context:map business-api-context --open   # para ti, en el navegador

# una skill de contexto propia
/project-context context-skill billing        # o: carga la skill project-context, modo context-skill
13 · alrededor de los mapas

Quién los genera y quién los lee

Los mapas no son de un solo workflow: los escribe uno y los consultan varios.

Los genera · modos y gates

/project-context

Sus modos data, features y api escriben los mapas; master-plan exige el mapa de datos generado. Sus gates y su orden viven en su SKILL.md.

Los encadena · Discovery

/project-foundation

Su fase de Discovery corre los modos de mapa y verifica el mapa de datos con bun run context:map antes del plan maestro.

Los lee · por historia

/sprint-development

Para evaluar el impacto de una historia que toca varios dominios. Si un mapa sigue en placeholder, sigue sin él y lo anota en el plan.

Los lee · backlog

/product-management

Su pase de dependencias usa el grafo de entidades, la matriz CRUD y el catálogo de rutas antes de crear o editar una historia.

Para leer más: agentic-dev-core/references/business-context-maps.md (la doctrina entera), skill-scaffold.md §3 a §5 (el principio y la skill propia), el SKILL.md y el references/refresh.md de cada skill de contexto, y cli/lib/context-maps.ts.