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

CampoPatrónEjemplo
idex_<categoría>_<kebab-name>ex_breath_hipopresivo-apnea
slug<categoría>-<kebab-name>breath-hipopresivo-apnea

Reglas:

  • kebab-name es 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

CampoPatrónEjemplo
idses_rcl_p<fase>_d<día NN>ses_rcl_p1_d01, ses_rcl_p4_d21

Reglas:

  • Día siempre con 2 dígitos (d01, no d1).
  • 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 Legacy
  • mod_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íaCuándo usar
breathRespiración consciente, hipopresivos, apneas
activationActivación de suelo pélvico, calentamiento neuromuscular
magicRespiración del Fuego (ejercicios marca de la casa)
postureTrabajo de alineación, postura, columna
toningTonificación muscular
relaxationRelajación, child pose, cierre
hypertrophyTrabajo de fuerza con sobrecarga (más en F4)
techniqueBonuses / 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.

RolPosición típica
warmupInicio — activación, respiración inicial
mainBloque principal — tonificación, funcional, mágico
cool_downCierre — estiramientos, relajación, hipopresivos finales

4. Materiales

IDs de materiales

mat_<kebab-name>. Lista esperada para Ritual Core (extender si aparecen más):

  • mat_esterilla
  • mat_bloque-yoga
  • mat_pelota-pilates
  • mat_goma-elastica
  • mat_silla
  • mat_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

  1. Catálogo compartido. Un ejercicio existe una sola vez; las sesiones lo referencian.
  2. Idempotencia. Re-correr el seed nunca duplica ni rompe. Toda inserción es upsert.
  3. No hardcodear texto en TSX. Todo va por t("key") con clave ES + EN paritarias.
  4. No usar vocabulario prohibido (ver tfc-brand-vocab-lint): “transformación”, “journey”, “antes/después”, “paciente”, etc.
  5. No subir nada a R2 hasta haber revisado el draft. Renombrar después de R2 = re-upload.
  6. FKs de auto-referencia (prepExerciseId, alternativeExerciseId) se llenan al cierre de fase, no por ejercicio.