Taller de Diseño de Path
Diálogo guiado interactivo para diseñar un Path: una super-estructura ABOVE the cmi5-course layer. Un path referencia cursos existentes por id/slug, los agrupa en milestones ordenados, y carga metadata de credential (OpenBadge 3.0) + presentation.
Invariante central — un path es puramente aditivo: NO toca ningún
course.json. Los AUs cmi5, masteryScore, moveOn y xAPI IRIs de cada curso quedan
intactos. El path vive en su propia capa de identidad:
- path activity IRI =
path:<slug> - milestone activity IRI =
path:<slug>/milestone:<ordinal> - credential = OpenBadge 3.0 (seeded desde
credential.*), NO un AU.
Produce path.json (fuente de verdad) + path-overview.md (frontmatter para
humanos + ingestion dojo-academy).
Regla de idioma
Todo el contenido generado en español. Términos técnicos en formato "español (English)" la primera vez ("Hito (Milestone)", "Credencial (Credential)"). Después solo español. Nombres propios de frameworks mantienen su idioma (cmi5, xAPI, OpenBadge, Dojo Score).
Directorio de salida
content/paths/{slug-del-path}/ — contiene path.json, path-overview.md,
eventualmente CHANGELOG.md (en revise).
Estilo de preguntas
Una pregunta a la vez. Opción múltiple cuando sea posible. Esperar respuesta antes de avanzar.
Puerta obligatoria
NO generar ningún artefacto hasta que cada paso esté completo Y aprobado por el usuario. Si el usuario pide saltar un paso, advertir el riesgo (milestone sin cursos, credential sin earning criteria, ordinal gaps) antes de proceder.
Paso 0 — Detectar Modo Revise (Optional)
Si $ARGUMENTS no está vacío:
- Buscar
content/paths/{$ARGUMENTS}/path-overview.md(opath.json). - Si existe: sugerir
"Ya existe un path
{$ARGUMENTS}. Para iterar bumpeá versión + changelog. Si querés crear uno nuevo, dame un slug distinto." ABORT. - Si no existe: continuar al Paso 1 con el slug pre-poblado.
Paso 1 — Identidad del Path
Preguntar (una a la vez):
- "¿Cuál es el slug del path? (
^[a-z0-9-]+$, estable una vez publicado — se vuelve la xAPI IRIpath:<slug>)." - "Título del path:"
- "Descripción en 1-2 frases — ¿qué transforma este path en el alumno?"
- "Idioma (es / en):"
- "Level agregado del path (beginner / intermediate / advanced):"
- "Faculty dueño (ej. 'Dojo Academy'):"
- "Emblem — emoji/glyph para la credential cuando no hay imagen:"
Asignar meta.id = path:<slug> (IMMUTABLE) y meta.version = 0.1.0 inicial.
meta.status default draft.
PUERTA DE APROBACIÓN: confirmar identidad antes de continuar.
Paso 2 — Pick de Cursos Miembros
Explicar:
"Un path NO crea cursos — referencia cursos que ya existen, por slug o por
course:<slug>id. No vamos a tocar ningúncourse.json."
Preguntar:
- "Listame los cursos miembros de este path, en orden de enseñanza. Cada uno por
slug (ej.
flutter-fundamentals) o por id (course:flutter-fundamentals)."
Si el repo consumidor tiene content/courses/, verificar que cada slug resuelva
a un directorio existente. Si alguno falta, advertir:
"El curso
{slug}no existe todavía encontent/courses/. Podés crearlo con/new-course {slug}antes de publicar el path, o dejarlo referenciado como placeholder (el path queda endraft)."
NO crear ni modificar ningún curso.
PUERTA DE APROBACIÓN: confirmar la lista de cursos miembros.
Paso 3 — Agrupar en Milestones
Explicar:
"Los milestones son fases nombradas y ordenadas que agrupan los cursos. Cada milestone tiene su propia identidad xAPI (
path:<slug>/milestone:<ordinal>) pero NO es un AU cmi5 — es agrupación + presentación."
Para cada milestone (uno a la vez), preguntar:
a. "Título del milestone:" b. "Descripción (opcional) — qué desbloquea esta fase:" c. "¿Qué cursos (de la lista del Paso 2) entran en este milestone, en orden?"
Asignar ordinal 1-based incremental y id:
- forma corta
milestone:<slug-corto>, o - forma calificada
path:<slug>/milestone:<ordinal>(= la xAPI IRI). IMMUTABLE.
Validación:
- Cada curso del Paso 2 debe caer en exactamente un milestone (warn si un curso queda huérfano o duplicado).
ordinaldebe ser contiguo desde 1 (warn si hay gaps).- Ningún milestone vacío (cada uno ≥ 1 curso).
PUERTA DE APROBACIÓN: confirmar el mapa de milestones.
Paso 4 — Credential (OpenBadge 3.0)
Explicar:
"La credential es la metadata OpenBadge 3.0 del path. NO es un AU cmi5 nuevo — es el achievement que el alumno gana al completar el path. Estos tres campos seedean el template OpenBadge."
Preguntar (una a la vez):
- "Cert name — nombre de la credencial (ej. 'Agentic AI Engineer'):"
- "Skills demonstrated — 3-6 skills nivel-path que el alumno demuestra (distintas de los tags por-curso):"
- "Earning criteria — cómo se gana la credencial (bullet list verificable):"
Validación:
cert_namepresente sistatusserápublished(warn si vacío).- Al menos 1 earning criterion (warn si vacío).
PUERTA DE APROBACIÓN: confirmar la credential.
Paso 5 — Presentation
Preguntar:
- "Tech pills — 3-4 tecnologías más reconocibles que enseña el path (para la path card):"
- "Reward points — Dojo Score reward al completar (int ≥ 0):"
- "Credential badge URL (opcional — overridea el emblem si está):"
- "Banner image URL (opcional):"
PUERTA DE APROBACIÓN: confirmar presentation.
Paso 6 — Generar JSON + MD + Validar
Construir el objeto
path.jsonsiguiendo${CLAUDE_PLUGIN_ROOT}/assets/schemas/path.schema.json.El objeto resultante es el base draft (Layer 1 + Layer 2) — cmi5/xAPI-safe (capa de identidad path aditiva, contrato de curso intacto), voice-neutral.
Aplicar overlays (Base + Overlay protocol). Antes de tocar disco, leer
${CLAUDE_PLUGIN_ROOT}/assets/runtime/overlay-protocol.mdy ejecutar el procedimiento completo (Discovery + Invocation + Layer 1 validator) sobre el base draft:command="new-path"cwd= directorio donde se invocó/new-pathbaseDraft= objetopath.jsoncontext.locale=path.meta.language(es|en)
Layer 1 invariants (
meta.id=path:<slug>,milestones[].id, semver, identidad OpenBadge de la credential) se revalidan después de cada overlay. Si un overlay los muta: ABORT con error apuntando alSKILL.mdofensor. NO se escribe nada.Crear directorio
content/paths/{slug}/.Escribir
path.json(el draft final post-overlays).Generar
path-overview.mdcon frontmatter YAML que matchea el contrato dojo-academyschemas/path.schema.yml:--- slug: { meta.slug } title: { meta.title } description: { meta.description } status: { meta.status } level: { meta.level } emblem: { meta.emblem } faculty: { meta.faculty } cert_name: { credential.cert_name } skills_demonstrated: { credential.skills_demonstrated } earning_criteria: { credential.earning_criteria } tech_pills: { presentation.tech_pills } reward_points: { presentation.reward_points } credential_badge_url: { presentation.credential_badge_url } banner_image_url: { presentation.banner_image_url } milestones: - title: { ... } description: { ... } courses: [ ... ] ---El cuerpo del MD resume el path para humanos (milestones + cursos en orden). NO incluir
meta.id/meta.versionen el frontmatter del MD — esos son campos de identidad cmi5 que solo viven enpath.json(el YAML de dojo-academy los omite por contrato).Validar
path.jsonconajvsi está disponible:ajv validate -s ${CLAUDE_PLUGIN_ROOT}/assets/schemas/path.schema.json -d content/paths/{slug}/path.json --spec=draft2020 -c ajv-formatsSi falla: report al usuario, NO marcar como done.
Presentar resumen:
"Path generado en
content/paths/{slug}/:- {N} milestones, {M} cursos referenciados (sin modificar)
- Credential: {credential.cert_name} (OpenBadge 3.0)
- Level: {meta.level} · Reward: {presentation.reward_points} pts
- xAPI identity:
path:{slug}+ milestonespath:{slug}/milestone:<n>
✅ JSON válido contra path.schema.json ✅ IDs estables asignados (meta.id, milestones[].id) ✅ Contrato cmi5 por-curso INTACTO (ningún course.json tocado) {Si overlays aplicados: bullet list de SKILL.md path que corrieron + warnings}
Próximos pasos sugeridos:
/new-track {category}— ver el catálogo + prerequisite graph/new-course {slug}— crear un curso miembro faltante"
PUERTA DE APROBACIÓN: confirmar output con el usuario antes de cerrar el flow.
Recursos
Esquemas
${CLAUDE_PLUGIN_ROOT}/assets/schemas/path.schema.json— contrato de authoring del path${CLAUDE_PLUGIN_ROOT}/assets/schemas/course.schema.json— contrato cmi5 por-curso (NO se modifica)${CLAUDE_PLUGIN_ROOT}/assets/schemas/overlay-protocol.schema.json— contratoOverlayInput/OverlayOutputpara el Paso 2 (Base + Overlay)
Runtime
${CLAUDE_PLUGIN_ROOT}/assets/runtime/overlay-protocol.md— discovery + invocation + Layer 1 invariant validator
Principios clave
- Aditivo, no destructivo — un path NUNCA modifica un
course.json. - IDs son forever —
meta.id(path:<slug>) ymilestones[].idson inmutables. - Identidad xAPI propia —
path:<slug>+path:<slug>/milestone:<n>, sin colisión con IRIs de curso. - Credential = OpenBadge 3.0 —
credential.*seedea el achievement template, NO un AU cmi5. - Consistencia con dojo-academy — el frontmatter del MD matchea
schemas/path.schema.yml;path.jsonagrega solo los campos de identidad cmi5. - Datos antes que visualización —
path.jsones fuente de verdad, el MD es derivado. - No fabricar — si un curso miembro no existe, marcarlo placeholder y mantener
draft, no inventar.