Convenciones de contenido
Reglas fijas para nombrar ejercicios, sesiones y assets durante el pipeline Zenler → MVP. Si dudas, vuelve a este doc. Si una convención no cubre un caso, decidir aquí primero antes de seedear.
1. IDs y slugs
Ejercicio
| Campo | Patrón | Ejemplo |
|---|---|---|
id | ex_<categoría>_<kebab-name> | ex_breath_hipopresivo-apnea |
slug | <categoría>-<kebab-name> | breath-hipopresivo-apnea |
Reglas:
kebab-namees descriptivo y corto (2–4 palabras max).- Solo
[a-z0-9-]. Sin tildes, sin ñ, sin espacios, sin mayúsculas. - Un mismo ejercicio aparece una sola vez en la librería aunque se use en varias sesiones (catálogo compartido).
- Si dos variantes son distintas en ejecución (ej. con bloque vs. sin bloque), son ejercicios distintos:
ex_toning_palma-palma,ex_toning_palma-palma-con-bloque.
Sesión
| Campo | Patrón | Ejemplo |
|---|---|---|
id | ses_rcl_p<fase>_d<día NN> | ses_rcl_p1_d01, ses_rcl_p4_d21 |
Reglas:
- Día siempre con 2 dígitos (
d01, nod1). - Fase de 1 a 4.
rcl= Ritual Core Legacy (distingue del catálogo futuro con modalidades).
Producto y modalidad legacy
pm_rcl_standard— Producto Modular Ritual Core Legacymod_standard— Modalidad única (no visible en UI, single-track)
2. Categorías de ejercicio
Enum cerrado. Si un ejercicio no encaja, discutir antes de inventar categoría nueva.
| Categoría | Cuándo usar |
|---|---|
breath | Respiración consciente, hipopresivos, apneas |
activation | Activación de suelo pélvico, calentamiento neuromuscular |
magic | Respiración del Fuego (ejercicios marca de la casa) |
posture | Trabajo de alineación, postura, columna |
toning | Tonificación muscular |
relaxation | Relajación, child pose, cierre |
hypertrophy | Trabajo de fuerza con sobrecarga (más en F4) |
technique | Bonuses / técnicas auxiliares (vendaje, masaje tao). NO se asignan a sesiones — viven solo en librería. |
3. Roles de asignación a sesión
Cada session_exercise lleva un rol. El rol es propiedad de la asignación, no del ejercicio. El mismo ejercicio puede ser warmup en una sesión y main en otra.
| Rol | Posición típica |
|---|---|
warmup | Inicio — activación, respiración inicial |
main | Bloque principal — tonificación, funcional, mágico |
cool_down | Cierre — estiramientos, relajación, hipopresivos finales |
4. Materiales
IDs de materiales
mat_<kebab-name>. Lista esperada para Ritual Core (extender si aparecen más):
mat_esterillamat_bloque-yogamat_pelota-pilatesmat_goma-elasticamat_sillamat_pared(no es objeto pero se documenta — la sesión requiere acceso a pared)
Relación
exercise_materials(M2M) — qué materiales requiere el ejercicio.- Si un material aparece solo en una variante del ejercicio, es ejercicio distinto (ver §1).
5. Assets en R2
Estructura del bucket:
thefittclub-media-dev/ (local + preview)
thefittclub-media-public/ (prod)
exercises/<id>.mp4
thumbnails/<id>.jpg
Reglas:
- Mismo
<id>que el ejercicio (sin sufijos de fase ni sesión). - MP4 H.264, audio AAC. Resolución original de Zenler (no re-escalar arriba).
- Thumbnail JPG 640px ancho, calidad 85.
6. Paths de trabajo en el vault
Durante el procesado, los assets pesados viven en el vault dentro de Assets/ (gitignored):
99_Archivo/Backups_TheFittClub/01_Ritual_Core/Fase_<N>_*/
Videos/ ← raw .mp4 re-descargados de Zenler
Assets/
Transcripts/ ← <video>.whisper.json + <video>.txt + <video>.srt
Timestamps/ ← <video>.timestamps.md (anotados a mano)
Clips/ ← <id>.mp4 troceados
Thumbnails/ ← <id>_1.jpg ... _5.jpg + <id>.jpg elegido
Drafts/ ← <id>.draft.ts (output sesión Claude)
Solo Notas_Obsidian/, Estructura/, Materiales/ se commitean. Todo Videos/ y Assets/ está gitignored.
7. Frontmatter de docs de sesión
Cuando crees 20_Metodologia/10_Rituales/Ritual_Core/Fase_<N>/Sesion_<NN>_<slug>.md:
---
title: "F<N> - Sesión <NN> - <Tipo>"
phase: <N>
day: <NN>
session_id: ses_rcl_p<N>_d<NN>
session_type: <tonificacion|funcionalidad|magico>
materials: [mat_esterilla, mat_bloque-yoga]
videos: [CORE_F1_cT1_627021, CORE_F1_Estiramientos_1_629792]
updated: 2026-MM-DD
---Un solo doc por sesión (NO uno por ejercicio).
8. Prompt template para sesión Claude interactiva (V4 del loop)
Cuando abras una sesión Claude para metadata de un ejercicio, arranca pegando este contexto (mantiene consistencia entre rondas):
Voy a procesar UN ejercicio del catálogo Ritual Core Legacy de TheFittClub.
Convenciones (de 100_Desarrollo/Convenciones_Contenido.md):
- Categorías permitidas: breath, activation, magic, posture, toning, relaxation, hypertrophy, technique
- ID: ex_<categoría>_<kebab-name>
- Slug: <categoría>-<kebab-name>
- Voz: cercana, técnica sin jerga vacía, en la voz peninsular de Gala (vosotras/compañeras). Sin "transformación", "journey", "antes/después", "paciente".
- Texto bilingüe: ES (canónico) + EN (traducción fluida, no literal)
Datos del ejercicio:
- Categoría: <categoria>
- ID propuesto: <id>
- Transcripción del clip:
"""
<paste de la transcripción filtrada por timestamps>
"""
Devolveme un objeto TypeScript con esta forma exacta:
{
id: "<id>",
slug: "<slug>",
videoKey: "exercises/<id>.mp4",
thumbnailKey: "thumbnails/<id>.jpg",
category: "<categoria>",
perSide: <true|false>,
materials: ["<mat_*>", ...],
tips: [], // dejar vacío, se rellena en pase 2
translations: {
es: {
title: "<3-6 palabras>",
description: "<2-3 frases describiendo qué se hace>",
tips: "<1-2 consejos prácticos>",
warning: "<contraindicación o aviso de seguridad, o '' si no aplica>"
},
en: {
title: "...",
description: "...",
tips: "...",
warning: "..."
}
}
}
NO inventes contenido que no esté en la transcripción. Si la transcripción no da info para algún campo, ponelo vacío.
9. Reglas de oro
- Catálogo compartido. Un ejercicio existe una sola vez; las sesiones lo referencian.
- Idempotencia. Re-correr el seed nunca duplica ni rompe. Toda inserción es upsert.
- No hardcodear texto en TSX. Todo va por
t("key")con clave ES + EN paritarias. - No usar vocabulario prohibido (ver
tfc-brand-vocab-lint): “transformación”, “journey”, “antes/después”, “paciente”, etc. - No subir nada a R2 hasta haber revisado el draft. Renombrar después de R2 = re-upload.
- FKs de auto-referencia (
prepExerciseId,alternativeExerciseId) se llenan al cierre de fase, no por ejercicio.