Tai Chi — Metodología
La única fuente de verdad de este proyecto. Marca, sistema de diseño, base de evidencia, lógica de prescripción, política de contenidos y alcance de seguridad viven todos aquí. Si el código y este documento no coinciden, uno de los dos es un fallo: di cuál en la PR.
Estado: documento vivo · Última revisión sustancial: 2026-08-02
Traducción del documento inglés
docs/METHODOLOGY.md, sección por sección y en el mismo orden. Esa correspondencia es estructural: los identificadores de los encabezados en/es/methodse toman del documento inglés por posición, de modo que/method#42-jointsy/es/method#42-jointsson la misma sección. Esta traducción no ha pasado por una revisión nativa; véase §11.
1. Qué es esto, y qué se niega a ser
Tai Chi es un acompañante de tai chi gratuito, público y sin registro. Lo abres, sabe qué día es, y te da una sesión moldeada por lo estable que estás sobre los pies, cuánto tiempo tienes y qué quieres entrenar.
Es:
- Un planificador y temporizador envuelto alrededor de la enseñanza de otras personas.
- Un motor de rotación cuya tarea principal es asegurarse de que mañana no se sienta como hoy.
- Un intermediario honesto: cada vídeo está atribuido, enlazado de vuelta y listado al completo en la página de la biblioteca.
Deliberadamente no es:
- Un profesor. No corrige tu postura, no puede verte y nunca afirmará que un movimiento es «correcto».
- Un producto sanitario ni una intervención clínica. Resume evidencia publicada para explicar por qué las sesiones tienen esta forma; no diagnostica, no trata y no personaliza en función de una enfermedad.
- Un producto con cuentas. Sin registro, sin correo, sin perfil en el servidor,
sin analítica. Todo vive en
localStorageen un solo dispositivo.
1.1 Por qué no hay registro
El practicante objetivo es desproporcionadamente mayor de 65 años. Cada muro de registro es un abandono, y una herramienta de bienestar que le pide a alguien de 78 años que verifique un correo es una herramienta que abre una sola vez. Los costes de esta decisión son reales y los aceptamos abiertamente en la interfaz: no hay sincronización entre dispositivos, y borrar los datos del sitio borra la racha.
2. Marca
2.1 El nombre
Tai Chi (太極, tài jí) nombra la práctica misma en lugar de un estado de ánimo alrededor de ella. Se eligió frente a las alternativas porque:
- Dice exactamente para qué sirve la app, con las palabras que la gente ya usa cuando la busca.
- Es concreto. «Flow», «Balance», «Serenity» son adjetivos disfrazados de productos.
- No lleva ninguna afirmación implícita. La app programa la enseñanza de otras personas; un nombre de marca inventado insinuaría un método propio, y no lo hay.
2.2 La voz
Llana, tranquila y ligeramente seca. Frases cortas. Nunca jadeante, nunca mística, nunca un entrenador gritando ánimos.
| Escribimos | No escribimos |
|---|---|
| «Aquí no hay nada que conseguir. Solo estar de pie.» | «¡Abraza tu quietud interior!» |
| «La molestia está bien; el dolor agudo no.» | «Escucha a tu cuerpo 🙏» |
| «El descanso es entrenamiento, no un hueco en él.» | «¡No rompas tu racha!» |
| «Este no se reproduce aquí.» | «¡Vaya! Algo ha salido mal.» |
La culpa no se usa nunca como motivador. No existe el estado «te has saltado 3 días», y una racha rota se informa sin comentarios.
2.3 El símbolo
Dos arcos entrelazados —uno que sube, otro que baja, compartiendo un centro— que trazan el camino que hacen las manos en «manos de nube». Lleva el intercambio yin/yang sobre el que se construye la práctica sin usar el taijitu, que está visualmente agotado y se lee como un logotipo de 1997. Grosor de trazo único, retícula de 24 unidades, legible a tamaño de favicon.
2.4 Color — noche profunda y luz de luna
La app es oscura por defecto, y lo oscuro es el estado diseñado, no una concesión. El tai chi se practica al amanecer, en una habitación con poca luz, a menudo antes de encender nada. Una página blanca y brillante a las seis de la mañana es hostil. El modo claro existe y está completo, pero es la misma marca al mediodía, no otra distinta.
La pantalla es un cielo nocturno con una sola fuente de luz dentro. Todo se sigue de ahí: la luna está fija arriba a la derecha, los bordes especulares de los paneles de cristal suponen luz desde arriba y desde la derecha, y ninguna superficie emite color propio: recogen la luz de la luna.
Todo es oklch, de modo que las rampas de luminosidad son perceptualmente
uniformes y las capas translúcidas se mezclan de forma previsible.
| Rampa | Papel | Por qué este tono |
|---|---|---|
| Noche | Fondo y estructura | Negro azulado, nunca gris neutro. Ese ligero azul es lo que hace que el acento se lea como luz y no como pintura |
| Luz de luna | Primario. La única fuente de luz, y el acento | Azul pálido desaturado. Se usa en el control de reproducción, el anillo del temporizador y el estado activo — y casi en nada más |
| Celadón | El color de la práctica: qigong, calentamiento, suave | Un jade tan contenido que se lee como porcelana vidriada bajo la luna, no como «verde bienestar» |
| Luz de lámpara | Hoy, rachas, esfuerzo moderado | El único tono cálido en uso normal. Racionado con dureza, para que signifique algo |
| Brasa | Intensidad vigorosa, acciones destructivas | El único tono caliente. Aparece quizá en dos superficies de toda la app |
El color nunca es la única señal. Cada distintivo de fase acompaña el color
con una etiqueta y un icono; los puntos de intensidad llevan un equivalente
textual sr-only.
2.5 Tipografía
Dos familias, elegidas por el tema y no por la moda.
- Cormorant (display) — una old-style caligráfica con modulación de trazo parecida a la del pincel. Lleva la cualidad de la pintura a tinta de la práctica sin recurrir a una tipografía «oriental» de pastiche, que sería a la vez fea y algo insultante. Solo en tamaños de display: es demasiado fina para componer texto corrido, y nunca lo hacemos.
- Inter (todo lo funcional) — interfaz, controles y, sobre todo, el temporizador. Altura de x grande, neutra, y cifras tabulares de verdad.
Las cifras tabulares se fuerzan en el temporizador y en cada valor que cambia en su sitio, para que los dígitos no salten al intercambiarse.
3. Sistema de diseño
3.1 Niveles de tokens
Tres niveles, una sola dirección de dependencia. Los componentes consumen solo el nivel 3.
- Primitivo —
--ch-moon-400,--ch-night-950. Valores de marca en bruto. Nunca referenciados por un componente. - Semántico —
--primary,--phase-form,--glass-blur. Portadores de significado, conmutables por tema. Esta es la capa que intercambian claro y oscuro. - Componente — utilidades de Tailwind generadas en
@theme inline(bg-phase-form,text-timer,rounded-3xl).
Un color nuevo que va directo a un componente es un comentario de revisión, no un parche.
3.2 Cristal líquido, especificado
Un panel son cuatro señales apiladas. Si falta cualquiera de ellas, parece un rectángulo translúcido, no cristal.
- Refracción —
backdrop-filter: blur() saturate() brightness(). La saturación es lo que lo vende; el desenfoque solo se lee como plástico esmerilado. En la versión oscura los paneles están ahumados en vez de esmerilados: el relleno baja a ~6 % y el trabajo lo hace la subida de brillo. - Cuerpo — un relleno de tinte translúcido (
--glass-tint/--glass-fill). - Bordes — una línea fina y brillante arriba (
inset 0 1px 0) y una línea de contacto oscura abajo. Esto es lo que sugiere grosor. - Especular — un barrido de brillo diagonal mediante
::before, más un grano de ruido al 3,5 % mediante::after. El grano existe para derrotar el aspecto plastificado de los rellenos desenfocados grandes.
Se exponen como @utility glass, glass-faint, glass-strong,
glass-specular, glass-grain, glass-press, y se consumen a través de una
única primitiva <Glass> con tres ejes: depth, tone, radius.
Regla: nunca improvises un backdrop-blur en un componente. Usa <Glass>, o
añade una variante.
Dos cosas hacen que esto sea sostenible y no decorativo:
- El cielo nocturno. El cristal solo se lee como cristal si hay algo detrás
que merezca refractarse. Una luna fija más dos campos de suelo lentos y fríos
están detrás de todo en
-z-10. CSS puro, sin canvas, sin rAF. Una capa de atenuación encima garantiza el contraste del texto caiga donde caiga un campo: el cielo es decoración, y el texto nunca debe depender de él. - El respaldo
@supports. Dondebackdrop-filterno está soportado o está desactivado, los rellenos saltan al 88–98 % de opacidad. El contraste del texto nunca depende de que el desenfoque funcione.
3.3 Movimiento
| Regla | Motivo |
|---|---|
| Solo dos curvas de aceleración, ambas propias | --ease-glass para el material, --ease-settle para las llegadas. Más de dos se lee como incoherencia. |
| Nada entra animado desde el lateral | El movimiento periférico tira del ojo y rompe una postura de pie. Las indicaciones aparecen con fundido. |
| Los bucles ambientales duran 28–44 s | Lo bastante lentos como para pasar inadvertidos; más rápido se convierte en un metrónomo contra el que luchas. |
prefers-reduced-motion elimina la deriva | …pero conserva las transiciones de opacidad y color, porque esas llevan el estado de la sesión. |
3.4 Compromisos de accesibilidad
- Objetivos táctiles: mínimo 44 px, 48 px para el transporte, 64 px para reproducir.
- Cada control tiene un
aria-labelreal; el anillo del temporizador esaria-hiddencon una región vivasr-onlyde grano grueso, para que no se anuncie cada segundo. role="radiogroup"en las opciones de configuración, para que funcionen las flechas y los anuncios de posición.- Enlace de salto, anillo de foco visible,
aria-currenten la navegación y en el bloque activo. - Sin
maximumScale. Esta app está dirigida a personas mayores de 65 años; el zoom no es opcional. - Subtítulos activados por defecto en el reproductor: buena parte de la biblioteca es silenciosa, con acento o en mandarín, y quien mira está al otro lado de la habitación.
3.5 Arquitectura responsive
La primera versión se rompía por debajo de ~400 px, lo cual es inaceptable para una app cuyos usuarios lo más probable es que la abran en un móvil apoyado contra una lámpara. Las reglas ahora:
- La navegación se mueve, no se encoge. Por debajo de
mdla cabecera lleva solo el símbolo de marca y dos controles; los cuatro destinos de navegación pasan a una barra de pestañas inferior de cristal, fija, consciente del área segura, con iconos y etiquetas. Las barras solo con iconos son ilegibles para el grupo de edad para el que está construido esto. overflow-x: hiddenenhtmlybody, ymin-width: 0en cada elemento. Nada es nunca más ancho que el viewport; si algo lo es, es un fallo, pero un fallo que no debe convertirse en una página que se desplaza lateralmente.- La tira semanal tiene que caber en siete celdas a 330 px. La etiqueta de
texto desaparece por debajo de
sm; la inicial del día, la fecha y el punto de color sobreviven. Las celdas se mantienen ≥44 px de alto pase lo que pase: es el control más pulsado de la app. - Áreas seguras en todas partes:
env(safe-area-inset-*)en la cabecera, la barra de pestañas y el panel de configuración. - El temporizador se dimensiona contra su anillo, no contra el viewport. Un
clampbasado envwdesbordaba el anillo en pantallas anchas. font-size: max(16px, 1em)en los controles, para que iOS nunca haga zoom sobre la página.
3.6 Internacionalización
El idioma se detecta del navegador automáticamente en la primera visita y después se recuerda.
- Se lee
navigator.languages—la lista de preferencias ordenada del propio usuario— y se toma la primera entrada soportada. Alguien cuya lista sea[ca, es, en]recibe español, no inglés. - Se compara solo por la subetiqueta principal:
es-419,es-MXyesse resuelven todos a español. Toda variante china se resuelve a simplificado: publicarzh-Hantsin una traducción real al tradicional sería peor que mostrar simplificado. - Una elección explícita en el panel de configuración anula la detección y se
escribe en
localStorage. «Seguir mi navegador» borra esa anulación.
Idiomas publicados: inglés, español, francés, alemán y chino simplificado.
Dos decisiones arquitectónicas hacen que esto funcione en vez de funcionar a medias:
- El motor emite claves, nunca prosa.
prescribeyselectson puros y ciegos al idioma, así que devuelvenNote = { key, values }y la interfaz lo resuelve. La justificación, las precauciones y las notas de bloque están por tanto traducidas, no solo el marco. Cuando un valor es él mismo un término traducible («pediste suave»), el motor lo emite tras un centinela NUL ytranslatelo resuelve un nivel más adentro. - El inglés es la fuente de verdad y también el tipo. Cada uno de los demás
idiomas está tipado como
Record<keyof typeof en, string>, así que una clave que falte es un error de compilación. Una clave que falte en tiempo de ejecución cae a inglés en lugar de mostrar la clave en bruto.
Todas las familias de rutas están traducidas: el marco, las páginas de clase,
los trece ensayos /for/*, el tutorial de instalación y este documento.
src/lib/i18n/coverage.ts sigue siendo la fuente de verdad sobre cuáles de
ellas pueden indexarse en cada idioma, y retirar una afirmación es una línea
por familia.
Dos categorías están deliberadamente sin traducir, y una está deliberadamente traducida de una manera poco habitual:
- Sin traducir: los nombres de los rangos (nombres propios, como los grados kyū y dan) y los títulos de los vídeos y los nombres de los canales (la atribución debe coincidir con la fuente).
- Sin traducir: los anclajes de los encabezados de la metodología.
/method#42-jointsresuelve en todos los idiomas, porque los identificadores del documento renderizado se toman del archivo inglés por posición y no de convertir en slug los encabezados traducidos. Un anclaje es un identificador, y los identificadores no se traducen. El coste es que una traducción no puede añadir, quitar ni reordenar secciones; la prueba lo impone. - Traducido por el fabricante, no por nosotros: los rótulos de menú de
/install. iOS, Chrome, Firefox y Samsung Internet localizan sus propios menús, así queinstall.label.*lleva el texto propio de cada fabricante en cada idioma. Cuando un fabricante no traduce un rótulo, dejar la cadena en inglés es el valor correcto: el único lugar de los diccionarios donde eso es cierto.
3A. Progresión
El progreso se mide en días en que apareciste, nunca en minutos y nunca en intensidad. Una sesión sentada de cinco minutos en un mal día cuenta exactamente lo mismo que una forma de cuarenta y cinco minutos en uno bueno.
Esto no es un ablandamiento. Premiar el volumen empujaría precisamente a las personas para las que está construida esta app —mayores, más rígidas, menos seguras— hacia hacer demasiado, que es la principal forma en que una intervención de ejercicio causa daño.
Rangos (derivados de los días completados, nunca almacenados):
| Rango | Días | Rango | Días | |||
|---|---|---|---|---|---|---|
| Mente de principiante | 初心 | 0 | Grulla blanca | 白鶴 | 60 | |
| Primera luz | 初光 | 1 | Río largo | 長江 | 100 | |
| Agua quieta | 靜水 | 5 | Roca madre | 磐石 | 180 | |
| Bambú verde | 青竹 | 15 | Pino viejo | 古松 | 365 | |
| Nube en marcha | 行雲 | 30 |
Los hitos se ganan y nunca se pierden. Uno de ellos —Has vuelto— es explícitamente para el regreso tras quince días fuera, porque eso es más difícil que una racha y ningún registro de hábitos lo premia.
Antipatrones que esta pantalla rechaza:
- Ningún estado de «has roto tu racha», y nada de rojo en ninguna parte.
- Que hoy todavía no hayas practicado no rompe la racha. El día no ha terminado.
- Ninguna comparación con otras personas. Aquí no hay nadie más.
- Todo se deriva del registro en cada render. Guardar una racha al lado del historial que la produce es como todo registro de hábitos acaba mostrando un número que sus propios datos contradicen.
4. La base de evidencia
Cada afirmación de abajo lleva su fuente y su estado de verificación:
✅ verificado significa que las cifras se comprobaron contra la fuente durante
la redacción; ⚠️ sin verificar significa que se enuncia a partir de
conocimiento general y debería confirmarse antes de usarse en cualquier
afirmación pública de marketing.
4.1 Caídas
- El tai chi reduce la tasa de caídas alrededor de un 19 % en personas
mayores que viven en la comunidad (RaR 0,81; IC 95 % 0,67–0,99; 2655
participantes en 7 estudios; evidencia de certeza baja). Sherrington et al.,
Cochrane Database of Systematic Reviews, 2019. ✅ verificado
- La misma revisión puntúa más alto el ejercicio de equilibrio y funcional: 24 % de reducción, evidencia de certeza alta (RaR 0,76; IC 95 % 0,70–0,81; 39 estudios). El tai chi es bueno, no el mejor, y la certeza es menor.
- En una población de alto riesgo, un protocolo terapéutico de tai ji quan redujo las caídas un 58 % frente a estiramientos y un 31 % frente a ejercicio multimodal (IRR 0,42; IC 95 % 0,31–0,56 frente a estiramientos). Li et al., JAMA Internal Medicine, 2018, 670 adultos de 70 años o más con antecedentes de caídas o movilidad limitada. ✅ verificado
Lo que tomamos de esto: el trabajo de equilibrio es el bloque de mayor valor
para los practicantes mayores, así que el objetivo balance prácticamente
duplica esa fase, y el encuadre de prevención de caídas es honesto en lugar de
exagerado.
4.2 Articulaciones
- En la artrosis de rodilla, el tai chi produjo mejoras WOMAC comparables a las de la fisioterapia estándar a las 12 semanas (tai chi 167 puntos, IC 95 % 145–190; fisioterapia 143 puntos, IC 95 % 119–167; diferencia entre grupos no significativa). Wang et al., Annals of Internal Medicine, 2016, n = 204. ✅ verificado
- El Tai Chi for Arthritis del Dr. Paul Lam (estilo Sun, posición alta, sin
flexión profunda de rodilla) es el protocolo más difundido en este ámbito y es
el contenido de
formpor defecto para el objetivojointsy la franja de 75+. ⚠️ sin verificar (popularidad del programa, no una afirmación de eficacia)
4.3 Dosis
- Directrices de la OMS de 2020, adultos de 65+: 150–300 min semanales de actividad aeróbica de intensidad moderada, fortalecimiento muscular ≥2 días/semana, y actividad multicomponente variada que enfatice el equilibrio funcional y la fuerza, a intensidad moderada o mayor, ≥3 días/semana. ✅ verificado
Lo que tomamos de esto: el plan por defecto es de 5 días/semana, y el periodizador semanal garantiza que el énfasis en equilibrio aparezca en varios días no consecutivos. A quien seleccione menos de 3 días no se le avisa —dar la lata va contra la marca—, pero el plan sigue distribuyendo el énfasis en lugar de repetir una sola cualidad.
4.4 Intensidad
- El tai chi general se clasifica convencionalmente como de intensidad ligera a moderada, alrededor de 3,0 MET (Compendium of Physical Activities). ⚠️ sin verificar — tratado solo como regla de diseño, nunca mostrado a los usuarios como número.
La intensidad en tai chi no es velocidad. Se modula mediante:
- La altura de la posición — la variable dominante con diferencia.
- El recorrido articular.
- El tiempo a una pierna — el principal motor tanto del efecto de entrenamiento como del riesgo de caída.
- La continuidad — cuánta parte de la sesión es movimiento ininterrumpido.
Por eso la interfaz dice «En tai chi esto es altura de posición y tiempo a una pierna, no velocidad» justo debajo del control de intensidad.
4.5 Respiración
- Los bloques guiados marcan un ritmo de aproximadamente 5,5 respiraciones por minuto (un ciclo de 11 segundos), dentro del rango de frecuencia de resonancia asociado a los efectos a corto plazo más claros sobre la variabilidad de la frecuencia cardiaca y la sensibilidad barorrefleja. ⚠️ sin verificar — se presenta como una sugerencia; nada en la app exige seguirlo.
4.6 Hábito
- La palanca más fuerte sobre la adherencia que realmente podemos accionar es hacer que la siguiente sesión sea visible y ya decidida. De ahí que la tira semanal esté anclada por encima de todo, y que los días de descanso se dibujen en lugar de omitirse. ⚠️ sin verificar como tamaño de efecto concreto; tratado como principio de producto.
4.7 Lo que la evidencia no respalda
Dicho claramente para que nadie construya sobre arena:
- No se ha demostrado que el tai chi sea superior a un entrenamiento de equilibrio convencional bien diseñado para las caídas.
- La certeza de la evidencia específicamente sobre tai chi es en general baja a moderada; los ensayos son pequeños, el cegamiento es imposible y los comparadores de control de atención son inconsistentes.
- Nada de lo que hay aquí respalda afirmaciones sobre inmunidad, «energía», función de los órganos o reversión de enfermedades. La app nunca las hace, incluido el texto sobre qigong, donde a veces sí lo hacen los títulos de los vídeos. Reproducimos los títulos literalmente como atribución: eso no es respaldo.
5. El modelo de prescripción
src/lib/engine/prescribe.ts — entra un perfil, sale un plano. Aquí no se
selecciona ningún contenido, lo que hace que la forma de la sesión sea
testeable sin tocar la biblioteca de vídeos.
5.1 El arco de cinco fases
Toda sesión, a cualquier duración, sigue el mismo arco. La familiaridad es el objetivo: el ritual no debería cambiar solo porque cambie el contenido.
| Fase | 中文 | Propósito | Parte base |
|---|---|---|---|
| Centrarse | 無極 | Llegar. Asentar la respiración, encontrar la alineación vertical. | 8 % |
| Calentamiento | 熱身 | Movilizar tobillos, caderas, columna y hombros dentro del recorrido sin dolor. | 17 % |
| Qigong | 氣功 | Movimiento repetible ligado a la respiración. Construye coordinación. | 27 % |
| Forma | 套路 | Coreografía continua. El núcleo cognitivo y postural. | 30 % |
| Equilibrio | 平衡 | Transferencia de peso deliberada, paso controlado, posición estrecha. | 13 % |
| Cierre | 收功 | Bajar revoluciones. Ralentizar la respiración, volver a la habitación. | 5 % |
Centrarse y cerrar están siempre presentes y siempre los narra la app, no un vídeo. Tres razones: nadie publica un buen enfriamiento de dos minutos; una apertura y un cierre fijos son la señal de hábito más fuerte disponible; y significa que una sesión sigue funcionando cuando se retira un vídeo o se cae la conexión.
5.2 Reponderación por objetivo
El objetivo multiplica las partes base y luego todo se renormaliza, de modo que un objetivo puede enfatizar una fase pero nunca eliminarla por aritmética.
| Objetivo | Énfasis |
|---|---|
| equilibrio | equilibrio ×2,0; calentamiento ×1,1; forma/qigong ×0,85 |
| articulaciones | calentamiento ×1,55; qigong ×1,2; forma ×0,8 |
| calma | centrarse ×2,2; cierre ×2,0; qigong ×1,2; forma ×0,7 |
| fuerza | equilibrio ×1,45; forma ×1,15; centrarse ×0,7 |
| resistencia | forma ×1,3; qigong ×1,2; centrarse ×0,5 |
| cognición | forma ×1,55; equilibrio ×1,1; qigong ×0,8 |
5.3 Suelos de fase y eliminación
Cada fase tiene un mínimo por debajo del cual no merece la pena hacerla: te pasarías el bloque entero encontrando la posición inicial del vídeo.
center 90s · warmup 120s · qigong 180s · form 240s · balance 120s · close 90s
La asignación itera: calcular partes → encontrar fases infradotadas → eliminar la
eliminable de menor peso → recalcular. Iterar importa, porque eliminar una fase
puede subir otra por encima de su suelo. center y close están protegidas y no
se eliminan nunca; al menos una de qigong / form / balance debe sobrevivir.
Las duraciones finales se redondean a 15 s, con el residuo empujado al bloque
mayor.
Por eso una sesión de 10 minutos tiene cuatro bloques y una de 45 minutos tiene seis, sin ninguna plantilla codificada por duración.
5.4 Techos de seguridad
La movilidad es la barrera dura. La edad es blanda. Una persona estable de 80 años pesa más que una inestable de 55, y la interfaz pregunta primero por la movilidad para señalar que es una cuestión de seguridad y no demográfica.
mobility ceiling: seated → gentle supported → gentle steady → vigorous
age ceiling: <50 → vigorous 50–64 → vigorous
65–74 → moderate 75+ → gentle
effective = min(requested, mobility ceiling, age ceiling)
Una excepción: estabilidad sobre los pies y práctica asentada sube el techo de edad un escalón. La capacidad demostrada gana a un año de nacimiento. El techo de movilidad no se levanta nunca.
Cuando la intensidad pedida queda limitada, la app lo dice, y dice qué restricción mandó: «El apoyo al estar de pie es el factor limitante, no la edad».
Consecuencias estructurales adicionales:
seated→ la fase de equilibrio se elimina por completo (no hay equivalente sentado honesto de sostenerse a una pierna) y su tiempo va al qigong, donde el control del tronco y el traspaso de peso sí se pueden entrenar sentado.seatedosupported→requireChairFriendly, que es un filtro duro sobre el contenido, no una preferencia.new→ calentamiento ×1,25; forma ×0,85; y se prefieren los profesores que enseñan paso a paso.established→ forma ×1,2; calentamiento ×0,85.
5.5 Formato corto
La misma sesión, cortada de otra manera. prescribe() toma un formato —"full"
o "shorts"— y el practicante alterna entre ambos en la pantalla de práctica.
Todo lo que importa es compartido: el mismo perfil, los mismos minutos, el mismo
arco de cinco fases en el mismo orden, y el mismo techo de seguridad,
calculado por el mismo código. Una sesión corta no es una sesión más ligera.
Lo que cambia:
- Las fases se cortan en tarjetas. Objetivo 75 s, nunca por debajo de 45 s ni por encima de 105 s, como máximo 26 tarjetas. Ambos extremos están acotados: solo con un límite inferior, una fase de 110 segundos pasaba como una sola tarjeta, que es un bloque de sesión completa disfrazado de tarjeta.
- Los suelos de fase bajan a aproximadamente una tarjeta cada uno
(
center 45 · warmup 45 · qigong 60 · form 60 · balance 45 · close 45) y el grano de asignación pasa de 15 s a 5 s. Una sesión corta de 15 minutos puede, por tanto, contener las cinco fases donde el formato completo habría eliminado dos: el arco queda más completo, no menos. - El contenido tiene que caber en una tarjeta. El selector limita la duración candidata a 5 minutos, relajándola a 10 y no más; un curso sentado de 42 minutos mostrado durante 75 segundos no es una clase, es un fragmento de una.
- Aproximadamente una de cada tres tarjetas es guiada en lugar de filmada,
además del centrarse y el cierre, que siempre lo son. Para esto están los 29
bloques
micro: un fundamento con nombre en cada uno, con su chino y su pinyin en la tarjeta.
Por qué existe el formato: la sesión completa da por supuesto que has decidido practicar. El formato corto da por supuesto que no, y te pide un minuto. La literatura sobre dosis (§4.3) trata de semanas acumuladas de práctica y no de la duración de una sesión, así que una sesión de quince minutos tomada como doce tarjetas no es una versión comprometida de nada.
Lo que deliberadamente no toma prestado de los feeds a los que se parece: termina, nada se recorta para llenar el encuadre, y es el reloj —no el vídeo— quien decide cuándo se acaba una tarjeta.
6. El motor antirrepetición
src/lib/engine/select.ts. Esta es la parte de la que vive o muere el producto
entero: no puede sentirse como lo mismo todos los días.
Un puntuador ingenuo de «mejor coincidencia» falla de inmediato: la mejor coincidencia es determinista, así que el día 2 es idéntico al día 1. Por eso aquí la novedad no es un criterio de desempate. Es el mayor término individual de la puntuación.
6.1 Puntuación
score = 0.42 · novelty # days since last served / 21, capped at 1
+ 0.30 · durationFit # how well the runtime covers the block
+ 0.20 · fit # focus, intensity, level, teaching style
+ 0.08 · jitter # seeded random — what "Shuffle" perturbs
× 0.55 if the channel appeared in either of the last two sessions
× 0.85 if the style appeared in the last session
Las tarjetas del formato corto reponderan los mismos términos en lugar de usar
otro puntuador: novelty 0.32 · durationFit 0.46 · fit 0.17 · jitter 0.05. El
ajuste de duración domina porque una tarjeta dura 75 segundos y la penalización
por una clase que se acaba a mitad de tarjeta es severa.
El idioma se aplica después de la elección, no dentro de la puntuación. Quince clases no tienen palabras; el resto están narradas, casi todas en inglés. El orden es idéntico para todos los idiomas, y solo entonces —dentro de la ventana de barajado de la que ya estaba eligiendo— un espectador no anglófono recibe la primera clase comprensible si la que salió no lo era. Ponderar la puntuación por idioma reordena en cambio la lista entera por idioma, y el índice de rotación del día direcciona entonces una clase distinta en cada ordenación, de modo que a un espectador español podría entregársele la clase en inglés que una sin palabras acababa de desplazar en su propia lista. La promesa «nunca menos clases sin palabras de las que recibe un espectador anglófono» es ahora cierta por construcción.
6.2 Reglas duras, y el orden en que se relajan
| Regla | |
|---|---|
| DURA | Ningún vídeo dos veces en una misma sesión |
| DURA | Ningún canal dos veces en una misma sesión — el mayor causante de «esto se parece todo» |
| DURA | Ningún vídeo visto dentro de cooldownDays |
| BLANDA | Penalización de canal a lo largo de las dos últimas sesiones |
| BLANDA | Penalización de estilo a lo largo de la última sesión |
cooldownDays = clamp(floor(eligiblePoolSize × 0.6), 1, 14). Escala con lo que
la fase puede alcanzar realmente: una fase con 15 vídeos elegibles obtiene un
enfriamiento de 9 días, una con 3 obtiene 1 día. Una constante fija o mataría de
hambre a las fases estrechas o apenas rotaría las anchas.
Si una fase fuese a quedarse vacía, las restricciones se relajan en un orden
definido —(1) coincidencia de nivel de experiencia, (2) el enfriamiento, (3)
franja de intensidad y variedad de canal, (4) sin repeticiones dentro de la
sesión— y el techo de seguridad no se relaja en ningún nivel. El nivel 4
existe solo para el formato corto, que pide hasta 26 cosas distintas donde la
sesión completa pide seis; incluso ahí, la misma clase nunca se sirve en dos
tarjetas consecutivas, que es la única repetición que alguien notaría realmente.
El límite de duración de tarjeta se relaja en el nivel 3 y no en el 4, así que el
selector repetirá una clase corta antes que servir una de 40 minutos como una
tarjeta de 75 segundos. Qué reglas se relajaron se informa de vuelta en
session.rationale y se le muestra al usuario, porque ignorar en silencio tus
propias restricciones es como se pudre un recomendador.
6.3 El ajuste de duración es asimétrico, a propósito
Un vídeo más largo que su bloque no es problema: practicas los primeros N minutos y el temporizador te pasa al siguiente, exactamente como una clase. Un vídeo más corto que su bloque te deja de pie en silencio, que es un fallo mucho peor. Así que:
r = budget / runtime
r > 1 → max(0, 1 − (r−1) × 1.25) # too short: punished hard
r ≤ 1 → r ^ 0.45 # long is acceptable, not preferred
6.4 Determinismo
La sesión que te dieron no debe rebarajarse en silencio si recargas a mitad de
práctica. Cada extracción aleatoria viene de un PRNG mulberry32 sembrado por
hash(date, profileKey, variant). variant es lo único que cambia la sesión
de un día, y lo incrementa exactamente un control: «Otra sesión».
6.5 Por qué la biblioteca está construida como está
El motor solo puede rotar a través de lo que existe. Por eso la biblioteca lleva deliberadamente los mismos conjuntos canónicos enseñados por profesores distintos: siete grabaciones de Ba Duan Jin, seis de Shibashi, ocho de la forma Yang de 24. Ese es el truco: el contenido sigue siendo familiar (estás aprendiendo una forma, no cincuenta), mientras que la voz, el tempo y el ángulo de cámara rotan. Práctica familiar, sesión fresca.
Objetivo editorial: ≥5 canales distintos por celda (fase × intensidad).
7. Periodización semanal
src/lib/engine/week.ts. Una semana de sesiones idénticas es la forma más rápida
de dejarlo, y además es mal entrenamiento.
- Un día largo — el objetivo propio del practicante, duración ×1,5, colocado en su último día seleccionado de la semana (normalmente el fin de semana, normalmente el único día con tiempo). Esta es la sesión en la que una forma se aprende de verdad. Requiere ≥3 días de práctica.
- Un día fácil — un escalón menos de intensidad, objetivo cambiado a
stress, colocado a mitad de semana. Recuperación, no un hueco. Requiere ≥4 días de práctica. - Todo lo demás alterna entre el objetivo elegido y su complementario, de modo que ninguna cualidad se entrena en días consecutivos.
balance ↔ strength strength → joints joints → stress
stress → balance cardio → balance cognition → joints
- Los días de descanso se dibujan, no se ocultan. Un jueves vacío es una decisión que tomó el plan. Al seleccionarlo se ofrece «Practicar de todos modos», que construye a intensidad reducida en lugar de negarse.
Las semanas empiezan en lunes: así habla la gente de «esta semana», y así el día largo natural queda al final en vez de en medio.
8. Política de contenidos
8.1 Verificación
Cada entrada de src/lib/content/videos.ts se comprobó por máquina antes de
publicarse:
https://www.youtube.com/oembed?url=…→ existe, es pública, título real, canal real.- la página de reproducción →
lengthSeconds, yplayableInEmbed: true.
Vuelve a ejecutarlo con bun run verify:library.
Los títulos mienten constantemente. «10 min» se posa habitualmente sobre un
vídeo de 14 minutos. El campo seconds es siempre el número propio de YouTube,
porque el temporizador presupuesta contra él.
De 52 candidatos, se publicaron 51; uno (ILFcKMnMkPQ) informó
playableInEmbed: false y se descartó en lugar de publicarse como un marco
muerto.
8.2 Reglas editoriales para añadir una entrada
- Duración real en
seconds. Nunca el número del título. chairFriendlyes una afirmación de seguridad, no una etiqueta de comodidad. Solo es cierta si el vídeo es sentado, o lo bastante lento y de posición lo bastante estrecha como para hacerlo agarrándose al respaldo de una silla.- Nunca etiquetes un vídeo en más de tres fases. El sobreetiquetado es como una biblioteca de 50 empieza a sentirse como una de 6.
- Apunta a ≥5 canales distintos por celda (fase × intensidad).
8.3 Atribución y uso legítimo
Nada se aloja, se vuelve a subir, se descarga ni se despoja. Los vídeos se
incrustan mediante el propio reproductor de YouTube (host youtube-nocookie) con
los controles nativos habilitados, los nombres de canal mostrados en todas las
superficies y un enlace «Ver en YouTube» en cada tarjeta de la biblioteca. La
biblioteca completa es pública en /library.
Si un creador pide ser retirado, se retira la entrada. Sin negociación y sin «pero el motor la necesita».
8.4 Fallo elegante
Los vídeos se borran y los permisos de incrustación cambian. Cuando el reproductor da error, el escenario degrada a una tarjeta con el póster, una explicación y un enlace externo — y el temporizador sigue corriendo. Un iframe en blanco no es aceptable nunca.
9. Alcance de seguridad
Lo que la app hace:
- Pregunta por la estabilidad de pie antes que por nada más.
- Impone un techo duro de intensidad que ninguna vía de relajación puede anular.
- Muestra las precauciones sobre el reproductor, en cada sesión, no una sola vez al empezar.
- Precauciones universales: para si hay dolor agudo, dolor en el pecho, mareo o falta de aire que no remite; nunca fuerces la rodilla más allá de la punta del pie; la rodilla sigue la línea del pie.
- Precauciones condicionales: silla al alcance para
supported; silla firme, sin ruedas, pies planos paraseated; «sube la altura de tu posición antes de acortar la sesión» para moderada y superiores.
Lo que explícitamente no hace, y no debe empezar a hacer sin un profesional clínico implicado:
- Cribar contraindicaciones (cirugía reciente, eventos cardiacos agudos, trastornos vestibulares, hipertensión no controlada).
- Personalizar en función de un diagnóstico concreto.
- Afirmar cualquier resultado terapéutico para una persona.
10. Arquitectura
src/
app/ routes: / · /progress · /library · /method
components/
brand/ mark, wordmark, lockup
glass/ NightSky, Glass — the material layer
ui/ shadcn primitives (extended, not forked)
layout/ header, bottom tab bar, skip link, nav definition
practice/ stage, timer, transport, rail, screen,
full player + short-form feed, format switch
progress/ rank, milestones, stats
calendar/ week strip
setup/ option groups, setup sheet
library/ library browser
hooks/ timer, session runtime, chime, wake lock, hydration gate
lib/
domain/types.ts the vocabulary. Nothing decorative lives here
content/ verified video registry + app-narrated guided blocks
engine/ prescribe → select → week. Pure, locale-blind
progress/ ranks + derived stats. Pure
i18n/ detection, dictionaries (en·es·fr·de·zh), provider
store/ the only persisted state
docs/METHODOLOGY.md this file
docs/methodology/ its translations
scripts/verify-library.ts
Convenciones
lib/engine/*ylib/progress/*son puros: sin React, sin DOM, sinDate.now()implícito y sin idioma. Cada función recibe la fecha como argumento, que es lo que hace las sesiones reproducibles y testeables, y devuelve claves de diccionario en lugar de frases.- Un campo existe en
domain/types.tssolo si una regla del motor lo lee o una etiqueta lo muestra. - Archivos en kebab-case, exportaciones nombradas, importaciones directas, sin archivos barril.
- Los componentes cliente son hojas.
PracticeScreensostiene la fecha seleccionada y el formato elegido, y todo lo demás se deriva. - Ambos reproductores comparten un mismo runtime.
useSessionRuntimeposee el temporizador, la campana, el bloqueo de pantalla, el congelado del cielo nocturno y el registro, de modo que la sesión completa y el formato corto no pueden discrepar sobre cuánto practicaste — ni sobre qué pasa cuando te vas a la mitad, que es un registro parcial por encima de dos minutos y nada por debajo.
10.1 El temporizador, en concreto
Tres decisiones que merece la pena defender:
- El reloj es un único escalar. Un número —milisegundos transcurridos en toda la sesión— y el bloque actual se deriva de él contra fronteras acumuladas. Saltar, retroceder y desplazarse son todas la misma operación. Tener una cuenta atrás por bloque separada del total de la sesión es como esas dos cifras acaban divergiendo.
- Reloj de pared, no conteo de ticks. El tiempo transcurrido es
committed + (now − startedAt), recalculado en cada tick. Acumular+250 mspor intervalo pierde minutos a lo largo de una sesión de 45 minutos, porque las pestañas en segundo plano estrangulan los temporizadores con dureza. - Por tanto sobrevive al segundo plano. Un teléfono que se bloquea a mitad de sesión reanuda en el momento correcto, no en el momento en que se bloqueó.
El temporizador es además la fuente de verdad para el vídeo: pausar la sesión pausa YouTube, y que un vídeo llegue a su propio final no termina el bloque.
11. Carencias conocidas
Lista honesta. No están escondidas tras un «trabajo futuro».
-
Aún sin tests.
prescribe,select,weekyprogress/statsson puros y se escribieron para ser testeables; no se ha escrito nada. Esta es con diferencia la mayor carencia. -
Solo
localStorage. Sin sincronización, sin exportación, sin importación. Un botón de exportar/importar JSON es el arreglo significativo más barato, y además le daría a la gente una forma de llevarse un año de práctica a un teléfono nuevo. -
El idioma se aplica después del montaje, así que el primer fotograma pintado es inglés.Corregido. El idioma es un segmento de ruta: el inglés se sirve sin prefijo en/library, los otros cuatro en/es/libraryy similares, y<html lang>es correcto en el primer byte. No hay corrección al montar ni destello de inglés. -
ElCorregido: salen del diccionario, como todo lo demás.<title>de la página y las meta descripciones son solo en inglés. -
Solo tres familias de rutas están realmente traducidas.Cerrado. Todas las familias se sirven ahora en los cinco idiomas —las páginas de clase, los trece ensayos/for/*, el tutorial de instalación y este documento—, junto con sus metadatos, su JSON-LD, sus espejos en markdown yllms.txt.src/lib/i18n/coverage.tssigue siendo la fuente de verdad sobre qué puede indexarse:Familia de rutas Idiomas servidos Indexable Inicio, /library,/library/teachers, páginas de clase,/for/*,/method,/installlos cinco sí, con hreflangrecíproco/progress— nunca, en ningún idioma No se emite ninguna anotación
hreflangpara una URL que no sirva ese idioma; una inventada es peor que ninguna. Esa regla no ha cambiado: lo que ha cambiado es que ahora las URL sí sirven el idioma. -
Las traducciones no han pasado por una revisión nativa, y esa es ahora la mayor carencia de contenido. Se produjeron mecánicamente. Para el marco y las páginas de clase es una apuesta de bajo riesgo: cadenas cortas, factuales y muy limitadas por los datos que las rodean. Para los ensayos
/for/*y para este documento no lo es, y la razón es §9: este es el contenido donde equivocarse podría hacer daño a alguien, y una traducción automática de orientación sobre movimiento es exactamente el tipo de error que se lee con fluidez. El remedio está escrito en la tabla de arriba: devolver una familia a[DEFAULT_LOCALE]encoverage.tses una línea, y eso hacenoindexa las variantes, las saca del sitemap y restaura la anotación «(en inglés)» en cada enlace hacia ellas. -
Los rótulos de menú de
/installson la parte con más probabilidades de estar mal, y mal de una forma que el lector no puede sortear: tienen que ser el texto propio de cada fabricante en ese idioma, no una traducción del inglés. Compruébalos contra un dispositivo antes de dar esa página por terminada. -
El chino no se resuelve solo con
hreflang. Baidu lo ignora y pondera de otra manera las señales de dominio y alojamiento, así que posicionar/zhes un trabajo aparte y no el mismo trabajo otra vez. -
La biblioteca sentada es más estrecha que la de pie, y se inclina hacia dos canales. La regla de diversidad de canales se relaja por tanto antes para los practicantes sentados.
-
Sin modo sin conexión. Los bloques guiados funcionan sin conexión por diseño; los bloques de vídeo no.
-
Quedan dos afirmaciones
⚠️ sin verificar(§4.4 MET, §4.5 frecuencia respiratoria) que no deben usarse en textos públicos hasta comprobarse.
12. Registro de cambios
| Fecha | Cambio |
|---|---|
| 2026-08-01 | Construcción inicial. Marca, tokens de tres niveles, sistema de cristal líquido, biblioteca verificada de 51 vídeos, motor de prescripción, selector antirrepetición, periodizador semanal. |
| 2026-08-01 | Dirección visual cambiada a noche profunda y luz de luna, oscuro primero. Cormorant + Inter sustituyen a Newsreader + Geist. Pasada móvil completa: barra de pestañas inferior, áreas seguras, guardas de desbordamiento, temporizador dimensionado contra el anillo. |
| 2026-08-01 | Detección automática del idioma del navegador con en · es · fr · de · zh. Motor refactorizado para emitir claves traducibles en lugar de prosa. |
| 2026-08-01 | Progresión añadida: nueve rangos, nueve hitos, rachas — todo derivado del registro, todo medido en días y no en volumen. |
| 2026-08-02 | Formato corto. prescribe() recibe un formato; "shorts" corta cada fase en tarjetas de 45–105 s y el feed se reproduce y se desplaza solo, a pantalla completa, terminando cuando termina la sesión. Biblioteca ampliada a 287 clases (93 por debajo de tres minutos) y 41 bloques guiados, 29 de ellos fundamentos individuales con nombre, chino y pinyin. |
| 2026-08-02 | Todas las familias de rutas traducidas. Las páginas de clase, los siete ensayos /for/*, /install y este documento existen ahora en los cinco idiomas, junto con sus metadatos, JSON-LD, espejos en markdown y un llms.txt por idioma. Los anclajes de la metodología se mantienen en inglés por construcción, de modo que una cita resuelve en cualquier idioma. Los rótulos de menú de instalación llevan el texto propio de cada fabricante. Pendiente de revisión nativa — véase §11. |
| 2026-08-02 | Ambos reproductores dicen ahora qué viene después y ofrecen una forma de saltárselo: el bloque de apertura no tenía vídeo y varias personas leyeron la pantalla quieta como algo roto. La preferencia de idioma pasó de ser un multiplicador de puntuación a una preferencia posterior a la elección, corrigiendo un caso en el que un espectador no anglófono podía recibir menos clases sin palabras que uno anglófono. El respaldo de bloques guiados ya no salta el techo de intensidad. |
| 2026-08-15 | Seis páginas /for/* más, y una sección nueva en cada una de las siete originales. Las nuevas nombran una cosa en vez de describir una situación —la forma 24 de Yang, el shibashi, el Ba Duan Jin y las series clásicas, la meditación de pie, veinte minutos, cinco minutos— porque quien ya sabe qué es el Ba Duan Jin no busca «qigong para articulaciones rígidas». Tres de las seis filtran por un patrón en el título y no por un campo, documentado en topics.ts: enseñar una serie canónica no es algo que el registro guarde, y todo maestro lo dice en su título. Las trece existen en los cinco idiomas. |
Fuentes
- Sherrington C. et al. Exercise for preventing falls in older people living in the community. Cochrane Database of Systematic Reviews, 2019
- Li F. et al. Effectiveness of a Therapeutic Tai Ji Quan Intervention vs a Multimodal Exercise Intervention to Prevent Falls Among Older Adults at High Risk of Falling. JAMA Internal Medicine, 2018
- Wang C. et al. Comparative Effectiveness of Tai Chi Versus Physical Therapy for Knee Osteoarthritis: A Randomized Trial. Annals of Internal Medicine, 2016
- WHO Guidelines on Physical Activity and Sedentary Behaviour, 2020 — Recommendations
- Tai Ji Quan: Moving for Better Balance