<!-- Tai Chi — https://tai-chi.app/es/method -->

# 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/method` se toman del documento inglés por posición, de
> modo que `/method#42-joints` y `/es/method#42-joints` son 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 `localStorage` en 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.

1. **Primitivo** — `--ch-moon-400`, `--ch-night-950`. Valores de marca en bruto.
   Nunca referenciados por un componente.
2. **Semántico** — `--primary`, `--phase-form`, `--glass-blur`. Portadores de
   significado, conmutables por tema. Esta es la capa que intercambian claro y
   oscuro.
3. **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.

1. **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.
2. **Cuerpo** — un relleno de tinte translúcido (`--glass-tint` /
   `--glass-fill`).
3. **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.
4. **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`.** Donde `backdrop-filter` no 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-label` real; el anillo del temporizador es
  `aria-hidden` con una región viva `sr-only` de 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-current` en 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 `md` la 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: hidden` en `html` y `body`, y `min-width: 0` en 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
  `clamp` basado en `vw` desbordaba 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.

1. 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.
2. Se compara solo por la subetiqueta principal: `es-419`, `es-MX` y `es` se
   resuelven todos a español. Toda variante china se resuelve a simplificado:
   publicar `zh-Hant` sin una traducción real al tradicional sería peor que
   mostrar simplificado.
3. 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.** `prescribe` y `select` son puros y
  ciegos al idioma, así que devuelven `Note = { 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 y
  `translate` lo 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-joints` resuelve 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í que `install.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 `form` por defecto para el objetivo `joints` y 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:

1. **La altura de la posición** — la variable dominante con diferencia.
2. **El recorrido articular.**
3. **El tiempo a una pierna** — el principal motor tanto del efecto de
   entrenamiento como del riesgo de caída.
4. **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.
- `seated` o `supported` → `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`, y `playableInEmbed: 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

1. Duración real en `seconds`. Nunca el número del título.
2. `chairFriendly` es 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.
3. **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.
4. 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 para `seated`; «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/*` y `lib/progress/*` son puros: sin React, sin DOM, sin
  `Date.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.ts` solo 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. `PracticeScreen` sostiene la fecha
  seleccionada y el formato elegido, y todo lo demás se deriva.
- **Ambos reproductores comparten un mismo runtime.** `useSessionRuntime` posee
  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:

1. **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.
2. **Reloj de pared, no conteo de ticks.** El tiempo transcurrido es
   `committed + (now − startedAt)`, recalculado en cada tick. Acumular `+250 ms`
   por 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.
3. **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`, `week` y `progress/stats` son 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/library` y
  similares, y `<html lang>` es correcto en el primer byte. No hay corrección al
  montar ni destello de inglés.
- ~~**El `<title>` de la página y las meta descripciones son solo en inglés.**~~
  **Corregido**: salen del diccionario, como todo lo demá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 y `llms.txt`.
  `src/lib/i18n/coverage.ts` sigue 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`, `/install` | los cinco | sí, con `hreflang` recíproco |
  | `/progress` | — | nunca, en ningún idioma |

  **No se emite ninguna anotación `hreflang` para 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]` en `coverage.ts` es una línea, y eso hace `noindex` a 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 `/install` son 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 `/zh` es
  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](https://www.cochranelibrary.com/cdsr/doi/10.1002/14651858.CD012424.pub2/full)
- [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](https://pmc.ncbi.nlm.nih.gov/articles/PMC6233748/)
- [Wang C. et al. *Comparative Effectiveness of Tai Chi Versus Physical Therapy for Knee Osteoarthritis: A Randomized Trial.* Annals of Internal Medicine, 2016](https://www.acpjournals.org/doi/10.7326/M15-2143)
- [WHO Guidelines on Physical Activity and Sedentary Behaviour, 2020 — Recommendations](https://www.ncbi.nlm.nih.gov/books/NBK566046/)
- [Tai Ji Quan: Moving for Better Balance](https://www.betterbalance.net/)
