# Estado por rama (GENERALISTA)

> Qué está fusionado en la implementación de referencia, qué ficheros comparte cada rama y qué tiene que recoger la especificación pública.

URL: https://torculo.joseluissaorin.com/referencia/estado · Revisado: 2026-10-16 · English: https://torculo.joseluissaorin.com/en/reference.md

Fuente: manim-saorín · GENERALISTA.md (generada al construir la web).


Tórculo tiene que ser plenamente generalista: que un modelo pequeño o una
persona escriban un `.mesa` fácilmente; que dibujos, marionetas y personajes
sean estándar; y que el collage en movimiento (foto, recorte, clip) salga
solo. Varias ramas trabajan a la vez. Este fichero es donde se avisan: **qué
toca cada una, qué ficheros comparte con las demás y qué tiene que recoger
la especificación pública** (`~/Developer/torculo/spec`).

Regla: si cambias cómo se escribe una línea del pliego, apúntalo aquí (rama,
línea nueva, sección del SPEC). El agente de estándar lo pasa a la
especificación normativa, a la conformidad, a `llms.txt` y a la web.

## Estado por rama

| rama | qué | estado | SPEC interno | parte del estándar |
|---|---|---|---|---|
| `estandar` | la lengua que enseña: errores con porqué y arreglo, `mesa explica`, `chuleta`, `bestiario`, `nuevo`, capa de la casa; prueba del modelo pequeño (`ERGONOMIA.md`) | **fusionada** (2026-10-15) | `SPEC-MESA-2.md` §3.16 | Parte 1 (lengua), anexo de diagnósticos |
| `vida` | la ficha anima por esqueleto, vida por defecto, actuar la voz, verbos de la vida, objetos vivos | **fusionada** | §3.15 | Parte 1 (verbos), Parte 3 (piezas) |
| `piezas` | estándar de pieza (estática, partes, marioneta, personaje con ficha), paquete `estudio`, `mesa pieza nueva/comprueba/hoja`, `mesa bestiario`, collage (foto/recorte/clip) y marioneta de foto | **fusionada** (2026-10-15) | `SPEC-PIEZAS.md` | Parte 3 (piezas) y perfil collage |
| `futbol` | la acción física (estudio/futbol.py: carrera, esprint, chut, estirada…), la jugada del motor (gx/jugada.py: balón, red, suelo que corre, grada), `X chuta a «Y»` y los eventos del balón; el contrato del esqueleto en la librería de personajes | **fusionada** (2026-10-15) | `SPEC-MESA-2.md` §3.20 | Parte 1 (líneas de ficha y eventos), Parte 3 (piezas) |
| `metraje` | metraje real: ingesta, montaje por palabras, revelado, híbrido, intercambio, planilla, `mesa entrevista` | **fusionada** (2026-10-15) | `SPEC-METRAJE.md` | perfil «metraje» (Parte 1: líneas nuevas; órdenes nuevas) |
| `generos` | géneros como perfiles (16), lienzo nativo 9:16, piezas de oficio (ecuación, fuentes SPDF, rótulo, dato…), gráficos desde datos, serie y variantes, localización, accesibilidad, revisión con notas, tráiler, derivados, canal | **fusionada** (2026-10-15) | `SPEC-MESA-2.md` §3.19 | perfil por género (Parte 1: líneas y órdenes nuevas) |
| `tresde` | escenario 3D, Blender por capas, 3D ligero, personaje 3D con vida, intercambio glTF/USD, GPU alquilada, lo generativo congelado | **fusionada** (2026-10-15) | `SPEC-MESA-2.md` §3.17 | perfil 3D (nuevo), perfil collage (sintetizado) |

## Notas de `piezas` para la lengua (para no pisarse)

- **`formato/gramatica.py`** (tres trozos pequeños, marcados con
  comentario): `PIEZAS ruta` y `MARIONETA nombre · de la foto x.jpg · …` en
  el preámbulo (junto a `PYTHON`); los modificadores tras `·` de
  `foto:|recorte:|prensada:` y de `clip…:` (los parsea `aspecto.collage_de`);
  y, tras `linea_de_ficha`, `aspecto.accion_declarada`: `QUIEN acción` para
  un nombre del REPARTO (o sus alias) o de una MARIONETA, con cualquier
  acción que la pieza declare (el vocabulario lo cierra la pieza; los verbos
  de movimiento y `mira`, `está`, `pasa`… no entran).
- **`formato/aspecto.py`**: solo añadido al final (`collage_de`,
  `marioneta_de_linea`, `accion_declarada`).
- **`formato/herramientas.py`** (lint): los nombres de las piezas de
  `.toml`, carpetas, MARIONETA y las asignadas con `marioneta(…)`,
  `personaje(…)`… cuentan como bestiario.
- **`formato/cli.py`**: `mesa pieza …` y `mesa bestiario` se despachan al
  principio de `main` (relanzan `manim_saorin.estudio.cli` en el Python de
  ManimGX).
- La rama `estandar` también trajo un `mesa bestiario` (en `ensena.py`, lee
  el bestiario de un pliego). Al fusionar `piezas`, `mesa bestiario` queda
  uno solo (ver el registro de fusiones).

## Para las ramas en curso (metraje, generos, tresde)

Lo que el estándar necesita de cada una, en pocas líneas aquí:

1. Las **líneas nuevas del pliego** (forma exacta, con un ejemplo).
2. Las **órdenes nuevas** de `mesa` (`mesa xxx …`).
3. Qué **perfil** de conformidad toca (núcleo, cine, sonido, collage, 3D…).
4. Si `mesa lee` las conoce: la rama `estandar` hizo que lo que no es orden
   y parece orden sea **error** («¿quisiste decir…?»). Una línea nueva que el
   lint no conozca saldrá como error; hay que darla de alta en
   `formato/ensena.py` (vocabulario) además de en la gramática.

## Notas de `metraje` (metraje real; worktree `manim-saorin-wt/metraje`)

Paquete nuevo `manim_saorin/metraje/` (ingesta, índice, montaje por texto,
revelado, intercambio, planilla). Lo que toca de lo común, para no pisarse:

- **`formato/aspecto.py`**: `FORMATOS` gana `9:16`, `1:1` y `4:5`; `FORMATO`
  admite el reencuadre tras `·`: `sigue a quien habla | sigue al sujeto |
  sigue a NOMBRE | centrado`. Si `generos` también añade el vertical, nos
  quedamos con una sola tabla (avisad aquí).
- **`formato/gramatica.py`**: un gancho en el preámbulo (`METRAJE`,
  `REVELADO`, `RECORTA`, `LIMPIA`, `ESTABILIZA`) y otro en el clip
  (`plano ≈ «…»`, `recurso ≈ «…»`, `toma: «…»`, `plano: fichero de A a B`,
  `sobre la mano de X:` / `sobre «objeto»:` como prefijos de seguimiento),
  los dos delegan en `metraje/lengua.py`. REPARTO admite la voz `filmada`.
- **`formato/cli.py`**: `mesa ingesta|busca|monta|exporta|importa|planilla`
  se despachan al principio de `main` a `metraje/cli.py`; `mesa toca` de un
  pliego con `METRAJE` va al montador de metraje.
- **`formato/ensena.py`**: alta de las órdenes nuevas en el vocabulario.
- Torculo: `sentido/sentido/metraje.py` y `sentido metraje indexa|busca`.
- SPEC propio: `SPEC-METRAJE.md` (como `SPEC-PIEZAS.md`); perfil «metraje».
- Para el estándar: líneas nuevas `METRAJE`, `REVELADO`, `RECORTA`, `LIMPIA`,
  `ESTABILIZA`, `SUBTÍTULOS` (preámbulo), `toma: «…»`, `plano ≈ «…»`,
  `recurso ≈ «…» | lo que dice`, `plano: f de A a B`, prefijos `sobre la
  mano de X:` y `sobre «objeto»:`; voz `filmada` en REPARTO; FORMATO 9:16 ·
  1:1 · 4:5 con reencuadre. Órdenes: `mesa ingesta|casa|busca|monta|exporta|
  importa|planilla|entrevista`. `mesa lee` y `mesa explica` ya las conocen.
- Para `generos`: el plano híbrido rueda hoy en 16:9 porque el lienzo
  vertical de Tórculo es vuestro; en cuanto esté, `metraje/hibrido.py`
  solo tiene que dejar de forzar 1920×1080.
- Arreglo común hecho por el camino (ya estaba también en master): sin
  `clips/fichas.json` no hay cita de película en un clip.

## Numeración de `SPEC-MESA-2.md` (para no chocar)

Ocupadas en master: §3.13 (cámara, profundidad, tiempo), §3.14 (proyecto
portable), **§3.15 (la vida)**, **§3.16 (la lengua que enseña)**. La rama
`tresde` llama a su sección «§3.16» en `manim_saorin/tresde/__init__.py`:
al fusionar será **§3.17** (o la siguiente libre). Quien abra sección nueva,
que la reserve aquí antes: §3.17 tresde · §3.18 metraje (o `SPEC-METRAJE.md`)
· §3.19 géneros.

## El estándar público recoge lo provisional

`~/Developer/torculo/spec/SPEC.md` tiene un anexo **informativo** («Profiles
in development») con lo que estas notas dicen de metraje, géneros y 3D. Pasa
a normativo cuando la rama se fusiona y tiene casos de conformidad. Si
cambiáis una línea del pliego, cambiadla aquí y el anexo se pone al día.

## Web del estándar (`~/Developer/torculo/site`), para quien la lleve

La lleva otro agente a la vez (portada con el corto, OBRAS). Lo que deja el de
estándar y ergonomía, solo en `site/public/obras/collage/` (material privado):
`cine.mp4`, `gilliam.mp4`, `recortes.mp4` (los ejemplos del collage, rodados
con el clip de fondo ya arreglado), `haiku-charlot-y-la-bailarina.mp4` y su
`.mesa` (el sketch que escribió Haiku a la primera, para enseñar que un modelo
pequeño escribe pliegos), y un fotograma `x.cartel.jpg` de cada uno para el
`poster` del vídeo. Visto en local a 1440 px (15-10, 14:05): la portada aún no
es el cartel en movimiento; el titular RADIOINTERMISIÓN de la sección del
corto se mete debajo del párrafo de la derecha; los vídeos del collage no
tienen `poster` (salen negros hasta pulsar).


- 2026-10-15 · `vida` → master (SPEC §3.15).
- 2026-10-15 · `estandar` → master. Conflicto en `SPEC-MESA-2.md`: las dos
  ramas usaban §3.15; la vida se queda en §3.15 y la lengua que enseña pasa
  a §3.16.
- 2026-10-15 · `piezas` → master. Conflictos en `formato/aspecto.py` y
  `gx/ficha.py` (piezas y vida añadían cosas distintas en el mismo sitio: se
  quedan las dos). `mesa bestiario x.mesa` es el de la lengua (lista piezas y
  acciones); `mesa bestiario carpeta|x.py|x.toml`, el del estudio.
  Nuevos errores de `mesa lee` que toda rama debe conocer: la acción que la
  pieza no declara, la pieza que actúa sin REPARTO, `al decir «X»` cuando la
  voz del beat no dice X, el color del REPARTO que no existe.

## Géneros y producción (rama `generos`, worktree `~/Developer/manim-saorin-wt/generos`)

Lo nuevo vive en `manim_saorin/generos/` (perfiles, lienzo, líneas y piezas de
género, gráficos, fuentes SPDF, subtítulos de redes, ortografía, alineación,
acabado, lenguas, accesibilidad, revisión, serie, tráiler, deriva, canal,
nuevo y plantillas) y en SPEC §3.19. Lo que toca de lo común, marcado con
«GÉNERO» en un comentario:

- `formato/gramatica.py`: preámbulo `GÉNERO`, `LIENZO`, `IDIOMA`; `formato 9:16`
  en las propiedades; las líneas de clip `ecuación: rótulo: titular: fuente:
  dato: cita: llamada: paso: audiograma firma` (generos/lineas.py).
- `formato/compilador.py`: `perfiles.aplica_doc` al empezar y `perfiles.aplica`
  al acabar; el verbo `genero`; `silencio 0` ya no se vuelve 3.
- `formato/cli.py`: las órdenes de la productora se despachan al principio de
  `main` (antes que las del metraje); `lee_pliego` prensa las plantillas
  (`{campo}`, `si {campo}:`, `variante X:`).
- `formato/herramientas.py`: el lint del género, las fuentes y la ortografía
  al final de `lee`; las cifras de contenido no cuentan en el porcentaje pobre.
- `formato/sonido.py` (`--lang` del IDIOMA) y `formato/tiempos.py` (mlx-whisper
  local si no hay whisper.cpp).
- `composicion.py` y `gx/verbos.py`: las cotas de la hoja salen de
  `generos/lienzo.py` (en 16:9 idénticas: regresión de paradoja, mismos
  fotogramas que master); en vertical, la columna.
- `gx/correr.py` (el lienzo nativo, la pausa del género, el acabado),
  `gx/escena.py` (subtítulos palabra y karaoke, corte limpio en géneros
  rápidos), `gx/materias.py` (sin bandas en un lienzo nativo),
  `gx/subtitulos.py`, `mesa.py` (la página en la proporción del lienzo),
  `visualizaciones.py` (`ver: … desde datos.csv`), `interprete.py` (verbo genero).
- Para `metraje`: el lienzo vertical ya está (`generos/lienzo.prepara`):
  `metraje/hibrido.py` puede dejar de forzar 1920×1080.
- Para `tresde`: el 3D matemático (`ver: superficie`) y los mapas de noticia
  quedan para vosotros; el perfil `didáctico` los usará en cuanto existan.

## tresde (rama `tresde`, worktree ~/Developer/manim-saorin-wt/tresde) — 3D, Blender, lo generativo
- Ficheros nuevos: formato/tresde.py, tresde/ (escenario, camara, malla, rodaje, blender/, ligero, sintesis, remoto), gx/tresde.py.
- Enganches de pocas líneas en: formato/gramatica.py (líneas de escena 3D), formato/compilador.py (beat["tresde"], beat["plano_3d"]),
  gx/rodaje_camara.py (instala y al abrir beat), gx/operador.py (necesita_3d, `_f_mundo`, `sube`, llamada a tresde al final de `_tic`),
  gx/ficha.py (`vista_camara` suma a la vista), gx/correr.py (las tres pasadas), formato/cli.py (`mesa sintetiza`, `mesa tresde`, lee_pliego).
- Caché de capas de Blender: ~/Library/Caches/manim-saorin/tresde/<hash>. Blender va con nice 15 y 4 hilos dentro del turno de `pesado`.
- Corto de prueba: ~/Movies/tresde-corto (lee la ficha del vecino de radiointermision sin tocarla).
- Líneas nuevas (escena): `ESCENARIO 3D · …`, `DECORADO …`, `PERSONAJE 3D NOMBRE · …`, `LUZ principal|de relleno|de contraluz|práctica de «X» · …`,
  `HORA …`, `NIEBLA …`. Líneas de clip: `imagen sintetizada ≈ «…»`, `clip sintetizado [de fondo|mudo] ≈ «…»` (se resuelven con el lock).
- Órdenes nuevas: `mesa sintetiza p.mesa [--proveedor simulado|local|treg] [--de-pago] [--creditos]`, `mesa tresde mundo|exporta|remoto p.mesa`.
- `mesa lee` las conoce (la gramática las consume; dentro de un clip son error; sin congelar, error).

## emulsion (rama `emulsion`, worktree ~/Developer/manim-saorin-wt/emulsion) — la película física de Tórculo
- Lo grande vive fuera de aquí: `~/Developer/torculo/emulsion` (torculo_emulsion: catálogo, modelo, ficha, .cube, DCTL, página WebGPU),
  `canon/peliculas/` (50 stocks digitalizados de sus hojas técnicas), `materias/shaders/emulsion.wgsl` y `materia revela`; en el fork,
  `grafo.rs` (pasada de clase `grafo`) y `m.Pelicula` (worktree ~/Developer/torculo/wt/manimgx-emulsion, rama `emulsion` de manimgx).
- Fichero nuevo aquí: formato/pelicula.py (la línea `PELÍCULA …` y su vocabulario cerrado).
- Enganches de pocas líneas, marcados «LA PELÍCULA»: formato/gramatica.py (preámbulo, antes del metraje), formato/compilador.py
  (`guion["pelicula"]`), gx/enganches.py (`bobina()`: con PELÍCULA el baño es `[Papel(), Pelicula(…)]`), gx/correr.py (el aviso),
  metraje/lengua.py (`REVELADO … · desde X` para cualquier log con fórmula publicada), metraje/monta.py (`L["pelicula"]`),
  metraje/revela.py (entrada de cada medio: gelatina generada de cualquier log; con PELÍCULA, negativo en ACEScct y revelado por la emulsión).
- No cambia nada de lo que había si el pliego no dice PELÍCULA (la bobina y `REVELADO … · desde i-log` siguen igual).
