Ir al contenido

Referencia del harness

Todas las piezas del harness, catalogadas. Para el razonamiento detrás de la estructura, empieza por el harness de IA; para el orden de los acontecimientos, mira el ciclo de vida.

Cada familia abre declarando dos cosas que aplican a todas sus entradas:

  • su capadeterminista (la ejecuta el harness), contextual (la carga el harness) o de criterio (la aplica el modelo);
  • si viaja, es decir, si catalyst new la deja en tu proyecto. Viaja todo salvo las instalaciones de plugins.

Los cinco momentos declarados en .claude/settings.json.

Se dispara una vez al arrancar la sesión. Dos entradas, separadas por su matcher.

MatcherOrdenComandoTimeout
startup1generate-skills-index.ts30 s
startup2daily-tip.sh5 s
startup3catalyst-dev-mode.sh5 s
startup4check-required-plugins.ts15 s
startup|clear5limpieza de .claude/.cache/5 s

No puede bloquear.

Se dispara una vez por fichero de instrucciones cargado, con un load_reason: session_start, nested_traversal, path_glob_match, include o compact.

ComandoTimeoutNotas
instructions-loaded-log.ts10 ssolo notifica; su salida y su código de salida se ignoran

No puede bloquear ni inyectar contexto.

Se dispara en cada prompt enviado.

ComandoTimeoutNotas
inject-prompt-context.ts15 stodo lo que escriba en la salida estándar se inyecta por delante del prompt

Puede bloquear.

Se dispara antes de ejecutarse una herramienta que casa con el matcher.

MatcherComandoTimeoutAutoridad
Writearchitecture-checkpoint.ts15 saviso — bloquea una vez por ruta y se aparta
Write|Edit|MultiEditharness-rules-content-guard.ts15 sbloqueo

Se dispara después de completarse una herramienta que casa con el matcher.

MatcherComandoTimeoutAutoridad
Write|Edit|MultiEditformat-with-prettier.ts30 sinformativo
Write|Edit|MultiEditlint-barrels.ts30 sbloquea con una regla, informa con la otra

Siete hooks, todos en .claude/hooks/, todos deterministas, todos viajan. Cada uno degrada a no hacer nada cuando falla por su cuenta, así que ningún fallo suyo puede degradar una sesión.

HookPunto de disparoAutoridadQué hace
generate-skills-index.tsSessionStartinformativoreescribe el bloque [Project Skills Index] dentro de cada CLAUDE.md y regenera .claude/skills-triggers-index.json, ambos a partir de lo que hay en disco
check-required-plugins.tsSessionStartinformativocomprueba que los plugins requeridos estén instalados y habilitados, leyendo el estado combinado en tiempo de ejecución y no los ficheros de configuración
instructions-loaded-log.tsInstructionsLoadedningunaañade una línea por fichero de instrucciones cargado a .claude/.cache/instructions-loaded.log
inject-prompt-context.tsUserPromptSubmitinformativoinyecta hasta 3 business rules, hasta 3 harness rules y hasta 3 punteros a skills que casen con el prompt — el cuerpo de cada regla topa en 4000 caracteres, las tres con presupuestos separados; los punteros a skills solo llevan ruta y términos casados, nunca el cuerpo de la skill
architecture-checkpoint.tsPreToolUse (Write)avisosaca a la superficie la clasificación de la ruta, la skill de estructura que la gobierna y las reglas aplicables al crear un fichero arquitectónico nuevo
harness-rules-content-guard.tsPreToolUsebloqueobloquea una escritura cuyo contenido casa con el patrón de detección de una regla activa dentro de las rutas que esa regla gobierna
lint-barrels.tsPostToolUsemixtalinta los imports de barrels del fichero recién escrito; una regla bloquea, la otra informa

harness-rules-content-guard solo ve las herramientas de edición del asistente y solo el texto entrante. Contenido escrito a través de un comando de shell, o una violación ya existente que se traslada a una ruta gobernada, pasan sin ser vistos. La comprobación exhaustiva sobre el árbol de trabajo es la red de seguridad.

Nueve ficheros en .claude/rules/, todos contextuales, todos viajan. Cada uno declara globs paths: en su frontmatter y se carga al leerse un fichero que case — con un load_reason de path_glob_match.

Dos familias:

Las rules de ámbito enrutan a las convenciones de un workspace entero.

RuleGobierna
scope-backend.mdbackend/src/**, backend/test/**
scope-frontend.mdfrontend/src/**, frontend/libs/**
scope-cli.mdpackages/cli/**

Las rules de ruta enrutan a la skill que cubre un tipo de fichero.

RuleGobierna
route-aurora-components.mdfrontend/src/@aurora/components/**
route-aurora-yaml.mdcliter/**/*.aurora.yaml
route-backend-test.mdbackend/**/*.spec.ts, backend/**/*.e2e-spec.ts
route-drizzle-schema.mdbackend/**/*.schema.ts, el árbol de migraciones, la configuración de Drizzle y el workflow de drift
route-eta.md**/*.eta
route-skill-md.md**/.claude/skills/*/SKILL.md, .claude/skills/REGISTRY.md

Las rules de ámbito enrutan en vez de duplicar porque un CLAUDE.md de ámbito no se re-inyecta tras una compactación, mientras que una rule se re-evalúa en cada lectura posterior que case.

Cuatro entradas en .claude/scripts/, todas deterministas, todas viajan.

ScriptCorre enQué hace
generate-skills-index.tsSessionStartregenera el índice de skills dentro de cada CLAUDE.md y el índice de disparadores en .claude/skills-triggers-index.json
daily-tip.shSessionStartimprime un consejo de daily-tips.txt
catalyst-dev-mode.shSessionStartinyecta el modo de desarrollo activo
status-line.shcontinuamenterenderiza la status line; se configura fuera del bloque hooks, así que no es un punto de disparo

Los hooks se apoyan además en código compartido bajo scripts/: el runtime de catálogo que carga y valida los índices de reglas, y el núcleo del lint de barrels. Ambos viajan con la plantilla.

Treinta y ocho skills, contextuales, todas viajan. Están por ámbito: una skill vive con el workspace al que sirve, y la rule de ámbito de ese workspace enruta hacia ella.

Por defecto una skill se activa por criterio: el modelo lee su description y decide que aplica. Siete skills del ámbito monorepo declaran además un array metadata.triggers en el frontmatter de su SKILL.md — una lista curada de keywords, deliberadamente separada de la prosa del description: una description es un párrafo pensado para persuadir al modelo, no una lista de términos con umbral de coincidencia, y derivarla de ahí haría que retocar una frase cambiara en silencio qué dispara la skill.

generate-skills-index.ts consolida todo SKILL.md, de cualquier ámbito, que declare el campo dentro de .claude/skills-triggers-index.json — un fichero en la raíz del repo, hermano de skills/, hooks/ y scripts/, nunca dentro de skills/. El índice es determinista: sin timestamp, entradas ordenadas por ruta, idéntico byte a byte entre ejecuciones para el mismo conjunto de SKILL.md en disco. Nada está fijado en el código — cualquier skill del monorepo que añada el campo entra en el índice en el siguiente SessionStart.

inject-prompt-context.ts lee ese índice y lo puntúa contra el prompt con la misma primitiva de keywords que usan los bloques de business rules y harness rules (un término de menos de 4 caracteres nunca casa), más un bonus de +50 cuando el prompt nombra la skill literalmente. Inyecta hasta 3 coincidencias como punteros — nunca el cuerpo de la skill.

Las siete skills indexadas hoy: business-rules-guard, catalyst-delegation, catalyst-langs, catalyst-query-dsl, catalyst-report-creator, catalyst-skill-creator, judgment-day.

typescript queda fuera a propósito, y lo dice en su propio SKILL.md: su disparador real es «cualquier fichero .ts/.tsx», que como vocabulario de keywords dispararía casi siempre o nunca — un disparador que no discrimina es peor que ninguno. Sigue siendo descubrible a través del [Project Skills Index] y su description.

.claude/skills/

SkillCubre
business-rules-guardel catálogo de business rules: añadir, modificar, derogar, citar por identificador
catalyst-cliconsumir el CLI: generación, reconciliación .origin, qué va en YAML y qué en código
catalyst-delegationcontratos de delegación: descubrimiento de skills, protocolo de escalado, asignación de modelo
catalyst-langsel mecanismo de idiomas: panel frente a datos, adaptadores, añadir un idioma
catalyst-query-dslel contrato del query DSL compartido por ambos stacks
catalyst-report-creatorconvertir una necesidad de reporte en el artefacto mínimo
catalyst-schemaescribir y validar los esquemas YAML de Aurora
catalyst-skill-creatorescribir una skill nueva
catalyst-update-skill-registryregenerar el registro de skills tras cualquier cambio en ellas
harness-rules-guardel catálogo de harness rules
judgment-dayrevisión adversarial doble
openspec-exploreexplorar una idea antes de comprometerse con un cambio; busca en el archivo de cambios decisiones previas sobre el tema antes de plantear opciones
openspec-proposecrear un cambio y sus artefactos
openspec-apply-changeimplementar las tareas de un cambio
openspec-archive-changecerrar un cambio y sincronizar las specs
typescriptpatrones de TypeScript estricto

backend/.claude/skills/

SkillSe dispara con
catalyst-project-structure«dónde va este fichero», los límites entre capas
catalyst-handler-composerlógica de negocio dentro de un handler, handlers compuestos de flujo de protocolo
catalyst-field-schemadecoradores de esquema y formato, query statements dentro de un handler
catalyst-nestjs-primitivesguards, interceptors, pipes, filters, decoradores, permisos
catalyst-cross-bounded-context-portsun bounded context que lee o escribe en otro
catalyst-provider-compositionelegir el provider concreto detrás de un puerto: storage, mailer, colas
catalyst-toolsconfiguración en runtime, feature flags, secretos, procedures de base de datos, migraciones declarativas
catalyst-schema-migrationsun cambio de esquema o una migración
catalyst-backend-testingescribir tests
catalyst-review-modulerevisión de coherencia de un módulo cerrado

frontend/.claude/skills/

SkillSe dispara con
catalyst-data-layerleer o mutar datos del servidor: pantallas de listado y detalle, resolvers, queries, mutations
catalyst-component-catalogcomponer una pantalla con los componentes del framework
catalyst-data-table-managementcolumnas, celdas e infraestructura de data-table
catalyst-form-composer-auditorcomponer o auditar un formulario o un detalle
layout-design-systemespaciado, jerarquía visual, densidad
transloco-i18ntraducciones, scopes, cambio de idioma
catalyst-widget-creatorwidgets de dashboard
spartanlos componentes de Spartan UI
catalyst-project-structure«dónde va este fichero»
catalyst-review-modulerevisión de coherencia de un módulo cerrado
catalyst-component-story-composerescribir stories de los componentes del framework

packages/cli/.claude/skills/

SkillSe dispara con
eta-templatingeditar una plantilla de codegen

Trece ficheros de comando en .claude/commands/, contextuales, viajan. Solo se cargan cuando los escribes tú.

ComandoPara qué sirve
/catalyst-dev-modealternar entre modo Framework y modo Solution
/create-schemaanalizar o crear un esquema YAML de Aurora
/load-skillcargar una skill por nombre, o listarlas
/review-modulerevisión profunda de coherencia de un módulo
/opsx:explorepensar una idea antes de comprometerse con ella — comprueba el archivo por decisiones previas antes de plantear opciones
/opsx:proposecrear un cambio y generar sus artefactos
/opsx:applyimplementar las tareas de un cambio
/opsx:archivecerrar un cambio completado
/business-rules:auditauditar el catálogo de business rules
/business-rules:checkvalidar contra el catálogo de business rules
/business-rules:documentdocumentar reglas implícitas en código existente
/business-rules:promotecristalizar reglas declaradas en un cambio archivado
/harness-rules:auditauditar el catálogo de harness rules

Dos de esos ficheros se llaman igual, audit.md, en directorios distintos. El índice de skills generado deduplica por nombre de fichero, así que informa de doce comandos donde hay trece ficheros; los comandos en sí son distintos y ambos funcionan.

Un agente en .claude/agents/, contextual, viaja.

AgentePara qué sirve
catalyst-schema-manageranaliza los esquemas YAML de Aurora y propone mejoras de nombres, descripciones y semántica; crea, edita y borra campos cuando se le pide

Cuatro plugins. Es la única familia que no viaja del todo. Las declaraciones sí van dentro de settings.json, así que tu editor te ofrece instalarlos al confiar en la carpeta del proyecto — pero las instalaciones son por usuario, y justo por eso check-required-plugins los verifica en cada arranque.

PluginRequeridoPor qué
engrammemoria persistente entre sesiones
superpowersskills base y disciplina de desarrollo dirigido por tests
code-reviewel gate de verificación
context7nodocumentación actualizada de librerías

engram vive en un marketplace propio, también declarado en el settings.json que recibes.

Estas no son ficheros bajo .claude/. Son instrucciones dentro de CLAUDE.md, aplicadas por el razonamiento del asistente, y viajan porque la plantilla lleva su propio CLAUDE.md.

El primer gate. Antes de clasificar nada, el asistente confirma que entiende la petición. Una petición ambigua —objetivo difuso, una restricción que falta, dos lecturas plausibles— se aclara conversando antes de empezar cualquier trabajo, y después se vuelve a triar. Una petición clara se salta el gate por completo.

Clasifica cada petición como Minor, Medium o Complex, y el tier decide si entra el flujo dirigido por specs y qué gates de calidad corren. Se vuelve a lanzar si el alcance crece a mitad de tarea; ante la duda entre dos tiers, gana el más pesado.

Para trabajo Medium y Complex, antes del primer cambio de código: se ofrece aislar el trabajo en un worktree de git con su propia rama, cerrando con un pull request. Recomendado, nunca impuesto, nunca hecho en silencio. El trabajo Minor no lo dispara.

Desarrollo dirigido por tests y revisión de código, escalados por tier: nada para Minor, una pasada de revisión para Medium, revisión adversarial doble para Complex. Una revisión de seguridad aparte se dispara con su propio criterio —si el cambio toca la superficie de seguridad— con independencia del tier.

Las reglas que gobiernan el trabajo delegado a subagentes: cómo se descubren las skills y se inyectan como rutas explícitas, cómo escala un subagente cuando necesita orientación en lugar de adivinar, y qué modelo se encarga de cada tipo de tarea.

Las instrucciones del proyecto en sí, contextuales, viajan. El fichero raíz se carga al arrancar la sesión; los de ámbito se cargan por traversal anidado al leerse un fichero bajo su directorio.

Cada uno lleva un bloque generado [Project Skills Index], reescrito en cada arranque por generate-skills-index.ts. Editar ese bloque a mano no tiene efecto: se regenera a partir del disco.

Un CLAUDE.md de ámbito no se re-inyecta tras una compactación. Esa limitación es justo lo que vienen a compensar las rules de ámbito.