08 — El sistema de skills de Ada
Propuesta, 2026-09-11. Estado: borrador para decisión del fundador. No hay código detrás. Antecedente: el diagnóstico de la sesión de staging del 10 de septiembre (ver la bitácora de 00-PLAN y el doc 07). Ada corre congpt-5.6-luna, el harness apaga el razonamiento, el validador premia el silencio, el bench mide obediencia y no utilidad, el modelo empieza cada turno sin saber qué hay en el workspace, y hay un solo skill: un manual de 6 700 caracteres de reglas sin una sola receta de varios pasos. Este documento diseña el reemplazo de ese último punto. Los otros cuatro son prerrequisitos (§7).
Base: la guía de Anthropic para construir skills (progressive disclosure en tres niveles, descripción = qué + cuándo, problem-first, patrones de orquestación secuencial y selección de herramienta por contexto, pruebas de disparo y funcionales contra baseline), adaptada a un harness que no es Claude: Ada es OpenAI, el “system prompt” es el manual compilado, y el catálogo de herramientas es nuestro MCP.
1. Qué es un skill de Ada
Una receta de producto: cómo resolver una pregunta que alguien que vende le hace a Ada, de principio a fin, con las herramientas del MCP, incluyendo qué hacer cuando el primer paso no da nada. No es una regla de estilo (eso es el manual) ni una herramienta (eso es el MCP). En la analogía de la guía: el MCP es la cocina, el skill es la receta. Cada skill es una carpeta, igual que las que ya existen enapps/api/src/cognitive/skills/:
scripts/: lo determinista vive en el servidor como herramienta o como proyector, nunca como código que el modelo ejecuta.
Frontmatter (contrato)
descriptionlleva qué hace + cuándo dispara + cuándo no, con las frases que la gente dice en español mexicano. Es el nivel 1 de disclosure y lo único que el modelo ve de los skills que no abrió.toolses la lista blanca del turno: el cinturón se recorta a esas herramientas más las de sesión (board_read). Menos catálogo, menos tokens, menos herramienta equivocada.reasoningdecide el esfuerzo de razonamiento del turno (§7.1).cierra_condeclara la tarjeta que el turno debe producir cuando exista el doc 07; hasta entonces, la forma de la narración.
Cuerpo (plantilla fija)
references/.
2. Los tres niveles de disclosure, en el presupuesto de Ada
El manual tiene 15 000 caracteres de presupuesto. Hoy la parte fija ocupa ~6 700 y el estado compilado el resto.
Presupuesto resultante: fijo recortado (~5 300) + índice (1 400) + 2 cuerpos (5 000) + estado (~3 000) ≈ 14 700. Cabe, sin tocar el techo. El nivel 3 no entra al system prompt: llega como resultado de herramienta, con el cap que ya existe.
3. El router: cómo se dispara un skill
Dos etapas, las dos observables en el eventotool.finished para poder medirlas.
- Pre-router determinista (servidor, antes de la primera llamada al modelo). Lee el mensaje, la etapa y el tablero, igual que
criterionFromMessageya lee estado y giro. Reglas por skill: frases gatillo y frases de exclusión de ladescription, más señales de estado (hay selección →guardar-en-crmsube; hay decisión pendiente → nada nuevo). Devuelve hasta 2 candidatos con confianza. Cubre la mayoría de los turnos a costo cero. - Autoselección del modelo (con razonamiento encendido). El índice está en el manual; si el pre-router no eligió o eligió mal, el modelo llama
skill_open { name }y recibe el cuerpo como resultado de herramienta. Si abre unareference, llamaskill_reference { skill, ref }.
skills_used: [{name, version, by: 'router' | 'model'}]), que es lo que el bench necesita para medir disparo.
4. El catálogo v1 (diez recetas)
Una por pregunta real que la gente hace. Todas problem-first. Las herramientas son las del MCP actual.
Lo que sale del manual y entra a los skills:
TOOL_ROUTING entero, CRM_RULES entero, y de ERROR_HANDLING las líneas específicas de herramienta. Se queda en el manual lo universal: identidad y voz, escalera, contrato de salida, orden de intents (reordenado, §7.3), gate final.
5. Cómo se prueba cada skill
Tres pruebas, las de la guía, adaptadas al bench que ya existe (apps/api/src/luna/bench).
- Disparo. Por skill, 10 mensajes que deben dispararlo y 10 que no, escritos como habla la gente (con typos, sin nombrar el producto, casos vecinos: “cuántos” contra “búscame”). Medidor nuevo:
skill_trigger= disparó el correcto / no disparó uno ajeno. Meta de la guía: 90 %. - Funcional. Los 20 briefs actuales más 2 por skill nuevo, con
expect.skillyexpect.must_deliver(“una lista con al menos una fila, o la cobertura consultada y por qué 0”). Medidor nuevo: utilidad, un juez modelo con rúbrica de tres puntos (respondió lo que se pidió / dio salidas concretas / no inventó). Es el medidor que hoy no existe y que hubiera atrapado “tu CRM no existe”. - Baseline. Cada brief corre con skill y sin skill (el manual ya tiene el brazo “sin skill” en
luna-manual.ts:690). Se reporta delta de utilidad, herramientas por turno, costo y p50. Un skill que no mejora utilidad no se mergea.
skills_used, así que un skill que dispara y no ayuda se ve en la tabla.
6. Versionado y gobierno
metadata.versionen el frontmatter; se estampa endiagnostics.skills_usedde cada turno, como hoy se estampaMARKET_INVESTIGATION_SKILL_VERSIONen los reportes.- Los skills son código: entran por PR con su bench. No se editan desde el dashboard en v1.
- Personalización por workspace sin tocar el skill: el skill lee el playbook del equipo por
context_retrieve(ya existe el temasenales-de-compray los criterios de colección). El skill es la receta; Cerebro pone los ingredientes del cliente.
7. Prerrequisitos (los otros cuatro puntos del diagnóstico)
Sin estos, los skills son recetas para un cocinero que no puede leerlas.- Razonamiento encendido.
mastra-model.adapter.ts:323apaga el razonamiento siempre que el modelo lo permite. Cambio: el skill activo decide (metadata.reasoning), defaultbajo;mediopara análisis y cierre. Medir p50 y costo antes y después en los 20 briefs. - El workspace en el prompt. Un párrafo compilado y cacheado (TTL 60 s) en
luna-input.compiler.ts: colecciones con conteos por etapa, secuencias y su estado, buzón, saldo de contactos. ~300 caracteres. Adiós al redescubrimiento. - Intents reordenados.
responderycierreantes quelimite;limitesolo cuando un paso del skill lo declara. Hoy “el primero que aplica gana” ylimitees el primero. - Payload limpio. Las tres advertencias fijas de mercado y el
next_actionsalen del texto que ve el modelo (luna-mcp-tools.tslos quita al proyectar); vuelven como pie de tarjeta cuando exista el doc 07. - Argumentos persistidos.
tool.finishedguardaargs;board.runsdeja de estar vacío. Sin esto no hay “muéstramelos hereda filtros” ni depuración del 32 contra 13.
8. Orden de trabajo
- PR 1 (2 días): prerrequisitos 1, 2, 3, 5. Bench antes y después.
- PR 2 (3 días): el loader de skills, el router de dos etapas,
skill_open/skill_reference, el índice en el manual, y tres skills:como-va-mi-pipeline,quien-le-ha-vendido,cuantos-hay+buscar-empresas-y-proveedores(van juntos). Con sus 20 mensajes de disparo cada uno y el medidor de utilidad. - PR 3 (3 días): los otros seis skills. Payload limpio.
TOOL_ROUTINGyCRM_RULESsalen del manual. - Después: doc 07, tarjetas.
- “¿Quién le ha vendido uniformes al IMSS en los últimos dos años?” → debe cerrar con una lista de proveedores con montos anclados, o con “0 en la cobertura consultada” y los candidatos por texto marcados como candidatos.
- “Dame un análisis de mi CRM” → 40 registros, 3 etapas, las 5 más recientes, una recomendación. Nunca “no existe”.
- “¿Cuántos proveedores de bombas hidráulicas hay? … Muéstramelos” → conteo con filtros visibles, lista con los mismos filtros.
9. Decisiones que necesita el fundador
- Diez skills problem-first (por pregunta), no por familia de herramienta. Sí/no.
- Router de dos etapas (determinista + autoselección del modelo). Sí/no, o solo una de las dos.
- El medidor de utilidad con juez modelo como gate de merge para cada skill. Sí/no.
- Orden: prerrequisitos primero (PR 1), luego tres skills (PR 2). O los tres skills primero para ver el efecto antes.
10. Orquestación: “50 personas de distintas empresas para una campaña”
Una receta por pregunta no cubre esto. Es una cadena de recetas con pasos pagados, decisiones humanas en medio y minutos de duración. Lo que el flujo exige hoy, con las primitivas tal como están:
Lo que el harness no tiene y hace falta para que Ada orqueste y la UI lo refleje:
- Un Plan en el tablero.
board.plan { objetivo, pasos[{skill, status, conteo, checkpoint?}], run_id }. Sobrevive turnos y sesiones. “Sigue con la campaña” retoma donde quedó. Hoy el tablero tiene selección, guardado y pendientes; no tiene proceso. - La tarjeta de proceso en el hilo. Los pasos con su estado (pendiente, corriendo, listo, esperando tu toque), los conteos (“38 de 50 cuentas con persona elegida”), y las tarjetas de decisión existentes incrustadas en el paso que las necesita. Es el componente más importante del chat, antes que las tarjetas de resultado del doc 07. Precedente:
InvestigationLaneya pinta un trabajo largo con progreso. - Pasos en segundo plano. Un paso que excede el turno (los 50
people_search) corre como trabajo del servidor y emiterun.progress(el evento ya existe en el contrato; la rama del cliente enlunaRuntime.ts:362está vacía). El turno cierra con “lo estoy haciendo, te aviso”; el hilo se actualiza solo. - La receta orquestadora.
campanano llama herramientas: compone recetas, escribe el plan, decide qué paso sigue, y sabe parar en cada checkpoint pagado. Es el único skill que abre otros skills. - Dos topes de producto que hay que subir: borradores de secuencia de 5 a 50 contactos (o lote), y paginación en
company_search.
- PR 1 prerrequisitos (razonamiento, workspace en el prompt, intents, argumentos).
- PR 2 sistema de skills + tres recetas.
- PR 3 Plan + tarjeta de proceso + pasos en segundo plano + receta
campana, y los dos topes. Aquí Ada ya arma la campaña de 50 de punta a punta, con la UI mostrando el avance. - PR 4 las seis recetas restantes + tarjetas de resultado (doc 07), que ahora se incrustan en la tarjeta de proceso.
11. Conducta: proactiva, pregunta cuando hace falta, consciente del saldo y de sus límites
Las cuatro son requisitos del fundador. Ninguna se resuelve con una regla más en el manual: el manual ya dice “resultado primero” y “ofrece 2 o 3 salidas”, y Ada no lo hace porque el harness la castiga por hacerlo. Cada requisito va con el mecanismo que lo hace posible y con cómo se mide.
Dos cambios de harness que estas cuatro exigen y que no estaban en §7:
- El validador distingue pregunta legítima de pregunta perezosa. Hoy la regla
preguntabloquea preguntar por un dato que ya está en el libro de hechos; eso se queda. Lo que cambia: cuando el skill activo declara un requerido ausente, preguntar por él no cuenta como defecto. Sin esto, cualquier receta que pida aclarar muere en el gate. - Los tres saldos entran al estado compilado y la escalera los usa: gratis se hace, con costo se propone con número, sin saldo se propone el lote que cabe.
usagedeja de ser algo que Ada tiene que recordar llamar.
