Especificación del esquema de artefactos
Esquema canónico de frontmatter YAML y campos obligatorios para todos los tipos de artefacto del árbol de fuentes de Apothem, con plantillas por clase y reglas de validación.
Plantillas de frontmatter YAML por clase y campos obligatorios para todos los artefactos del ecosistema Apothem.
Fuente de verdad. El contrato legible por máquina y aplicado por la puerta lo forman los JSON Schemas por clase bajo
src/apothem/schemas/(agent.schema.json,command.schema.json,skill.schema.json, …). Los esquemas de skill y de comando declaranadditionalProperties: false, así que rechazan las claves desconocidas; los esquemas de agente, de output-style y de plan declaranadditionalProperties: true. Esta página yfrontmatter-schema.mdxson las dos proyecciones legibles por humanos de esos esquemas: esta página lleva las plantillas y los ejemplos desarrollados por clase, y frontmatter-schema, el índice conciso de claves obligatorias. Cuando una página discrepa de los JSON Schemas, prevalecen los esquemas.
Visión general
Todos los artefactos del árbol de fuentes de Apothem (bajo src/apothem/ y la
superficie de configuración raíz) deben incluir un bloque de frontmatter YAML
(entre delimitadores ---) con campos obligatorios y opcionales específicos de
su tipo de artefacto. Este documento define el esquema canónico de cada tipo.
Reglas universales:
- El frontmatter cumple con YAML 1.2
- Todos los valores de cadena usan comillas dobles, y una cadena vacía se escribe
"" - Orden de los campos: primero los obligatorios; los opcionales, agrupados por relevancia
- Los comentarios en el frontmatter usan
#seguido de un espacio:# comment - Los valores de ruta deben ser relativos (sin
/inicial) y usar barras diagonales (/) para la compatibilidad multiplataforma
Convención de versionado (clases de artefacto versionadas: comandos, ayudantes, skills, CLAUDE.md):
versiones semántica (MAJOR.MINOR.PATCH). Incrementa MAJOR para los cambios incompatibles de esquema o de contrato; MINOR para los cambios aditivos compatibles (nuevos campos opcionales, secciones adicionales, antipatrones adicionales); PATCH para un cambio de comportamiento que corrige una directiva existente sin romper el contrato.- Las correcciones de erratas y de enlaces, el formato y las ediciones que solo tocan comentarios o documentación dejan
versionsin cambios. Solo un cambio de comportamiento la incrementa. updatedes la fecha ISO 8601 (YYYY-MM-DD) de la edición más reciente. Debe cambiar con cada incremento deversion, y también cambia con una corrección de erratas o de enlaces que no incrementa la versión.- Los artefactos nuevos comienzan en
v0.Y.Z. La promoción avX.Y.Zindica que el contrato del artefacto es lo bastante estable como para ser un compromiso público. - Las suites de plan quedan fuera de esta convención. Una corrección de erratas en una suite de plan incrementa el número PATCH de la versión de la suite (
vX.Y.ZavX.Y.(Z+1)) y añade una fila al Historial de revisiones. La guía para desarrolladores describe la regla de las suites de plan en su sección de revisiones de suites de plan.
Esquema: reglas
Patrón de ruta: src/apothem/rules/*.md
Propósito: Mandatos de comportamiento y directivas operativas.
Campos obligatorios
---
name: "kebab-case-identifier"
description: "One-line description"
pathFilter: "**/*.py, **/*.toml"
alwaysApply: true | false
---| Campo | Tipo | Propósito | Ejemplo |
|---|---|---|---|
name | string | Identificador legible por máquina | "operational-mandates" |
description | string | Descripción de una línea para los registros | "Operational mandates CM-1–10" |
pathFilter | string | Lista de globs separados por comas que acota una regla filtrada por ruta; la cadena vacía ("") en las reglas siempre activas | "**/*.py, **/*.toml" |
alwaysApply | boolean | true para las reglas siempre activas (cargadas en todas partes); false para las reglas filtradas por ruta (cargadas cuando pathFilter coincide) | true |
Campos opcionales
Las reglas no llevan campos de frontmatter opcionales y, a diferencia de otras clases de artefacto, tampoco llevan los campos version / updated / scope / portability. Los cuatro campos obligatorios anteriores son el contrato completo de frontmatter de las reglas que aplica frontmatter_grep.
Ejemplo
---
name: "operational-mandates"
description: "Behavioral definitions for CM-1 through CM-10: violation indicators and recovery actions"
pathFilter: ""
alwaysApply: true
---
# Rule: Operational Mandates
...Esquema: comandos
Patrón de ruta: src/apothem/commands/*.md
Propósito: Definiciones de comandos de barra (/plan-execute, /freshify, etc.).
Campos obligatorios
---
name: "command-name"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "What this command does"
argument-hint: "[argument-pattern]"
disable-model-invocation: true | false
portability: "universal"
allowed-tools: "Read, Glob, Grep"
---| Campo | Tipo | Propósito | Ejemplo |
|---|---|---|---|
name | string | Nombre del comando (sin el / inicial) | "plan-execute" |
version | string | Versión semántica | "X.Y.Z" |
updated | string (ISO 8601) | Fecha de la última actualización | "2026-04-20" |
description | string | Descripción breve | "Executes a phase with quality gates" |
argument-hint | string | Patrón de uso, o "[args...]" si no hay ninguno | "[path/to/plan] [phase-id]" |
disable-model-invocation | boolean | Si es true, solo el operador inicia el comando; el modelo nunca lo invoca por su cuenta | true |
portability | string | Clasificación de portabilidad entre los adaptadores de entorno | "universal" |
allowed-tools | string | Herramientas preaprobadas mientras se ejecuta el comando: herramientas de solo lectura y, además, herramientas con efectos secundarios solo como reglas acotadas, como Bash(git log *). El comodín "*" aislado se rechaza | "Read, Glob, Grep" |
Campos opcionales
Los comandos no llevan campos de frontmatter opcionales: los ocho campos obligatorios anteriores son el contrato completo de frontmatter de los comandos que aplica command.schema.json (additionalProperties: false).
Ejemplo
---
name: "plan-execute"
version: "X.Y.Z"
updated: "2026-04-20"
description: "Executes a specific phase from a Master Plan Suite with conformity checking and quality gates"
argument-hint: "[path/to/plan-suite/] [phase-id] [--dry-run]"
disable-model-invocation: true
portability: "universal"
allowed-tools: "Read, Glob, Grep"
---
# /plan-execute — Execute a Specific Phase
...Esquema: ayudantes
Patrón de ruta:
src/apothem/agents/*.mdPropósito: Definiciones persistentes de ayudantes (también llamados trabajadores delegados) para la exploración en paralelo, la auditoría y las puertas de calidad.
Campos obligatorios
---
name: "agent-name"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "What this agent specializes in"
tools: "Tool1, Tool2, Tool3"
disallowedTools: "Write, Edit"
maxTurns: 20
effort: "high" | "medium" | "low"
---| Campo | Tipo | Propósito | Ejemplo |
|---|---|---|---|
name | string | Identificador del ayudante | "codebase-explorer" |
version | string | Versión semántica | "X.Y.Z" |
updated | string (ISO 8601) | Fecha de la última actualización | "2026-04-20" |
description | string | Descripción de la especialización | "Deep codebase exploration" |
tools | string (separado por comas) | Herramientas permitidas | "Read, Glob, Grep, Bash" |
disallowedTools | string (separado por comas) | Herramientas prohibidas | "Write, Edit, TodoWrite" |
maxTurns | integer | Número máximo de turnos de conversación (típicamente 5–20; los valores superiores a 20 requieren un comentario de justificación en línea) | 20 |
effort | enum | Alcance computacional | "high" |
Campos opcionales
permissionMode: "default" # Permission handling
memory: user | project | local # Persistent-memory scope; omit for none
pattern: "Research" | "Audit" | "Implementation" | "Quality" # Agent team pattern
portability: "universal"Ejemplo
---
name: "codebase-explorer"
version: "X.Y.Z"
updated: "2026-04-20"
description: "Deep codebase exploration — find patterns, trace dependencies, discover conventions, map architecture"
tools: "Read, Glob, Grep, Bash"
disallowedTools: "Write, Edit, TodoWrite"
maxTurns: 20
effort: "high"
permissionMode: "default"
portability: "universal"
---
You are a codebase exploration specialist...Esquema: skills
Patrón de ruta: src/apothem/skills/*/SKILL.md
Propósito: Definiciones de técnicas reutilizables con señales de detección y procedimientos de ejecución.
Campos obligatorios
---
name: "skill-name"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "What this skill teaches"
archetype: "workflow-template"
userInvocable: true | false
disable-model-invocation: true | false
allowed-tools: "Read, Glob, Grep"
---| Campo | Tipo | Propósito | Ejemplo |
|---|---|---|---|
name | string | Identificador de la skill | "plan-suite" |
version | string | Versión semántica | "X.Y.Z" |
updated | string (ISO 8601) | Fecha de la última actualización | "2026-04-20" |
description | string | Lo que proporciona la skill | "Master Plan Suite template" |
archetype | string | Clase de forma: un identificador kebab-case <class>-template | "workflow-template" |
userInvocable | boolean | Si es true, el usuario puede solicitar explícitamente esta skill | false |
disable-model-invocation | boolean | Si es true, la skill solo se alcanza mediante invocación explícita | true |
allowed-tools | string | Herramientas preaprobadas mientras se ejecuta la skill: herramientas de solo lectura y, además, herramientas con efectos secundarios solo como reglas acotadas, como Bash(git log *). El comodín "*" aislado se rechaza | "Read, Glob, Grep" |
Campos opcionales
argument-hint: "[args...]" # Usage pattern if userInvocableEjemplo
---
name: "ecosystem-audit"
version: "X.Y.Z"
updated: "2026-04-20"
description: "Comprehensive blind audit of the apothem ecosystem"
archetype: "audit-template"
userInvocable: true
disable-model-invocation: false
allowed-tools: "Read, Glob, Grep, Agent, TodoWrite"
argument-hint: "[--focus area] [--fix]"
---
## Purpose
...Esquema: hooks
Patrón de ruta: el bloque hooks de settings.json más las
implementaciones de Python bajo src/apothem/hooks/.
Propósito: Declarar validadores activados por eventos y manejadores de gestión de estado que el host invoca en puntos bien definidos del ciclo de vida.
Esquema del archivo de ajustes
La clave de nivel superior hooks asigna nombres de evento a arreglos de bloques matcher:
"hooks": {
"<EventName>": [
{
"matcher": "<pattern>",
"hooks": [
{
"type": "command",
"command": "${PYTHON_BIN}",
"args": ["${HARNESS_ROOT}/.apothem/support/hooks/dispatch.py", "<EventName>", "<message-name>"],
"timeout": <seconds>,
"statusMessage": "<short human-readable label>"
}
]
}
]
}La forma -m apothem.hooks.dispatch sirve para desarrollar desde un checkout del código fuente con PYTHONPATH=src.
| Campo | Tipo | Propósito | Ejemplo |
|---|---|---|---|
matcher | string | Patrón de nombre de herramienta (o "*" para los eventos independientes de la herramienta) | "Write" |
hooks[].type | literal "command" | El único tipo de manejador de hook admitido actualmente | "command" |
hooks[].command | string | Comando ejecutable; Apothem usa el marcador ${PYTHON_BIN}, que se resuelve en la instalación | "${PYTHON_BIN}" |
hooks[].args | arreglo de strings | Argumentos en forma exec: una ruta de script bajo ${HARNESS_ROOT}/.apothem/support/ y después sus argumentos | ["${HARNESS_ROOT}/.apothem/support/hooks/dispatch.py", "SessionStart"] |
hooks[].timeout | entero en segundos | Tiempo máximo de ejecución antes de que el host termine el hook | 30 |
hooks[].statusMessage | string | Etiqueta breve que se muestra en la interfaz del host | "Session start" |
Eventos obligatorios
La plantilla de Claude Code registra cuatro eventos: SessionStart, PreToolUse, PostToolUse y Stop. scripts/dev/validate_hooks.py comprueba en settings.json los cinco eventos de la tabla siguiente, que son un conjunto distinto, e informa de cada uno que no encuentra como un aviso, no como un fallo. PostToolUse está registrado, pero no es uno de los cinco. PreCompact y PostCompact figuran entre los cinco, pero no se registran en Claude Code (referencia de hooks), por lo que en ese caso el verificador emite un aviso por ambos.
Los valores de tiempo de espera reflejan los presupuestos canónicos de los eventos de hook: la tabla siguiente los reproduce para comodidad del lector; la fuente canónica prevalece.
| Evento | Tiempo de espera típico | Propósito |
|---|---|---|
SessionStart | 30 segundos | Leer la memoria, comprobar el estado del plan, informar de la disponibilidad |
PreToolUse | 10 segundos | Validar las escrituras según las políticas de aislamiento de contenido + el frontmatter |
PreCompact | 30 segundos | Verificar que el estado se haya externalizado antes de la compactación del contexto |
PostCompact | 30 segundos | Restaurar el estado de trabajo tras la compactación del contexto |
Stop | 60 segundos | Externalización al final de la sesión: estado de reanudación, salidas, decisiones |
dispatch.py también acepta UserPromptSubmit y Notification en su lista de
eventos permitidos, por compatibilidad futura; ninguno de los dos está conectado
en las plantillas distribuidas. Para habilitarlos, agrega un bloque matcher con
el mismo patrón en forma exec.
Capa de Python
Cada comando de hook pasa por el mismo despachador de Python:
| Archivo | Función |
|---|---|
src/apothem/hooks/dispatch.py | Enruta SessionStart a session_start_bootstrap.main() y cada uno de los demás eventos permitidos a emit_hook_context.main(). Siempre sale con 0. |
src/apothem/hooks/session_start_bootstrap.py | Script de hook de inicio de sesión: emite contexto con el resumen de la memoria y de la suite de plan. |
src/apothem/hooks/emit_hook_context.py | Emisor de hook predeterminado: escribe un sobre válido que lleva la carga útil registrada de --context-file. |
src/apothem/hooks/messages/*.md | Carga útil de contexto estática referenciada por --context-file. |
Validación
scripts/dev/validate_hooks.py aplica el contrato de los hooks:
settings.jsonse analiza como JSON y declara cada uno de los cinco eventos de la tabla; que falte un evento es un aviso, no un fallo.- Los tres scripts de Python existen y se analizan como Python válido.
- Todos los archivos de mensaje referenciados por argumentos
--context-fileexisten. - No aparece ninguna ruta absoluta de usuario codificada de forma fija (
C:\Users\..., etc.) ensrc/apothem/hooks/**.py. - Los artefactos de shell bajo
src/apothem/hooks/yscripts/se limitan a los stubs aprobados de localizador / arranque.
Esquema: CLAUDE.md
Ruta: CLAUDE.md (raíz)
Propósito: Instrucciones de Claude Code acotadas al proyecto.
Frontmatter YAML obligatorio
---
name: "CLAUDE"
version: "MAJOR.MINOR.PATCH"
updated: "YYYY-MM-DD"
description: "Project-scoped Claude Code instructions for the Apothem source repository"
scope: "project"
portability: "project-local"
---Secciones
CLAUDE.md se redacta en secciones de prosa, descritas en CLAUDE.md. Ningún validador exige una lista fija de secciones: scripts/dev/validate_ecosystem.py comprueba las claves de frontmatter anteriores.
Lista de verificación de validación
Cada artefacto debe superar estas comprobaciones:
Validación del frontmatter
- El YAML es sintácticamente válido (sin errores de análisis)
- Todos los campos obligatorios del tipo de artefacto están presentes
-
namesigue la convención kebab-case -
versiones semántica (MAJOR.MINOR.PATCH) -
updatedtiene formato de fecha ISO 8601 (YYYY-MM-DD) -
descriptiones una cadena no vacía, de una sola línea - Los campos opcionales coinciden con los valores de enumeración esperados (si aplica)
- No hay erratas en los nombres de campo (usa los nombres canónicos del esquema)
- No hay espacios en blanco sobrantes ni problemas de formato
Validación del contenido
- El contenido comienza en una línea nueva después del
---de cierre; en los archivos de la familia Markdown, la línea de encabezado SPDX canónica es el primer contenido que le sigue - No hay referencias internas del plan (cumplimiento de CM-7)
- Las referencias cruzadas se resuelven (si se listan otros artefactos)
- Los enlaces usan rutas relativas con barras diagonales
Validación de la portabilidad
- No hay rutas absolutas codificadas de forma fija (usa rutas relativas)
- No hay sintaxis específica de Windows en los artefactos de alcance universal
- Los separadores de ruta son barras diagonales
- Las variables de entorno usan un formato independiente de la plataforma (
${VAR}o nativo de la herramienta)
Notas
- La coherencia como seguridad: El frontmatter canónico permite la validación automatizada, las herramientas y la verificación entre artefactos. Las desviaciones se acumulan rápidamente.
- Declaración de portabilidad: No todos los artefactos pueden ser universales. Declara las restricciones explícitamente: es mejor documentar una salvedad que distribuir un fallo silencioso.
- Kebab-case para los nombres: Fácil de usar en URL, scripts y contextos de línea de comandos. Evita los espacios, los guiones bajos y el camelCase en los nombres.
- Higiene del incremento de versión: Cada edición que cambie el comportamiento debe incrementar
versionyupdateda la vez. Las correcciones de erratas, de enlaces y de formato dejan la versión sin cambios; las nuevas secciones opcionales o los nuevos antipatrones incrementan MINOR; la reorganización estructural o los cambios de contrato incrementan MAJOR.
Convenciones de commits
Establece el formato de los mensajes de commit, el etiquetado de versiones, la disciplina de autoría humana exclusiva y la cadencia por tarea para los artefactos git y el control de versiones.
Registros de artefactos
Enumeración completa de los artefactos del ecosistema Apothem: comandos, reglas, trabajadores delegados, hooks, skills, output-styles, disciplina de evolución de artefactos y declaraciones de clases de artefacto vacías.