# Títulos e infografías editables en Auroflow

Guarda títulos, logos, rótulos y gráficas como una pista separada de las tomas.
Un cambio de texto o color crea otra revisión y otro MP4 desde el vídeo y audio
base, sin generar fuentes ni otra voz. Disponible en
[Gráficos y rótulos](https://auroflow.club/app#motion), REST y
[MCP público](https://api.auroflow.club/v1/mcp), con la credencial propia de la
cuenta verificada. La pista sigue editable; el MP4 es opaco, sin exportación
alfa ni proyecto universal de edición.

## Empezar con poco contexto

Para unir una narración Vids propia ya terminada con estas capas, usar
`audio.source.kind:"narration"` y su ID `tts-` observado. La fuente se
verifica por cuenta y SHA, igual que el vídeo base. El audio explícito
sustituye al audio del fondo. `audio.tracks` permite combinar hasta ocho
pistas propias de música, voz y sonido nativo, con posición, recorte, volumen,
fundidos y silencio. Incluir explícitamente el sonido de la toma si se quiere
conservarlo en esa mezcla. La [skill de montaje](https://auroflow.club/skills/auroflow-editing/SKILL.md)
describe edición y recuperación por revisiones. El nuevo
`auroflow_plan_finishing` prepara el recorrido sin guardar ni renderizar:
ver [contrato común de acabado](production-finishing.md). La consulta
`auroflow_capabilities {area:"production"}` distingue los motores gráficos de la
disponibilidad viva de los proveedores.

Elegir un propósito y un sistema gráfico por pieza. Consultar
`auroflow_capabilities {area:"graphics_styles"}` y `auroflow_capabilities {area:"motion"}`; leer fuentes propias
con `auroflow_list {kind:"sources"}` sólo cuando se vaya a usarlas. El puente stdio
admite `AUROFLOW_MCP_TOOLSET=graphics` para anunciar el recorrido gráfico.
La vista completa sigue disponible; el filtro no cambia permisos ni coste.

Para elegir una estructura según la situación, usar `auroflow_graphics_templates`
(`POST /v1/graphics/templates`). Primero pedir una lista compacta, por ejemplo
MCP `{"request":{"situation":"news","limit":3}}`; después sólo el detalle
`{"request":{"template_id":"news-brief","engine":"remotion","aspect":"16:9"}}`.
REST recibe el objeto interior sin `request`. El catálogo distingue noticia,
documental, producto, social, datos, cine, presentador y explicación. La plantilla
elige funciones y tiempos; el estilo visual se decide aparte.

Estas ocho recetas son adaptaciones originales de datos inspiradas en ejemplos
públicos de RenderComp, Alejandro Brito y Observable Plot. Cada una devuelve su
procedencia/licencia, versión y SHA. No se ha instalado código ni recursos de
esas colecciones. Leer [selección y procedencia](https://auroflow.club/skills/auroflow-graphics-layers/references/community-templates.md)
o el [catálogo completo](https://auroflow.club/graphics-templates.json) sólo si
hace falta. En un detalle, `template.composition_template` y sus `bindings`
siguen sin ser enviables: resolver los placeholders con textos literales, datos
y medios propios, luego revisar y guardar mediante el recorrido existente.
La selección no vincula medios, verifica cifras, llama a modelos ni renderiza.

El cliente Python ofrece `graphics_templates(request)`, `graphics_styles()`, `suggest_graphics(request)` y
`review_graphics(request)`, y los comandos `graphics-styles`,
`suggest-graphics archivo.json`, `review-graphics archivo.json`,
`graphics-templates archivo.json`. Estas cuatro
operaciones no guardan pistas ni inician renders. REST recibe el objeto de
petición interior; MCP lo envuelve en `request`.

La [skill compacta](https://auroflow.club/skills/auroflow-graphics-layers/SKILL.md)
ruta a referencias de [plantillas por situación](https://auroflow.club/skills/auroflow-graphics-layers/references/community-templates.md), [dirección editorial](https://auroflow.club/skills/auroflow-graphics-layers/references/art-direction.md),
[crear y editar una pista](https://auroflow.club/skills/auroflow-graphics-layers/references/edit-track.md)
y [recetas tipadas](https://auroflow.club/skills/auroflow-graphics-layers/references/design-recipes.json).
Elegir una receta, sin cargar todas las revisiones, el guion completo o imágenes
base64 para cambiar un título. Las recetas tienen placeholders no enviables:
resolver IDs propios, revisiones y textos antes de validar o guardar.

## Propósito, jerarquía y estilo

Añadir información cuando identifique a alguien, sitúe una escena, explique un
dato o presente el mensaje/CTA solicitado. Cero capas es una opción válida.
No añadir transcripciones ni subtítulos automáticos. Conservar los mensajes
literales; no inventar cargos, cifras, fuentes o garantías para llenar un diseño.

| Pieza | Sistema sugerido | Decisión principal |
| --- | --- | --- |
| Documental | editorial / explainer | Lugar, fecha, identidad o explicación que aporten contexto verificable. |
| Noticias | news | Titular y atribución claros; ticker sólo con información adicional y tiempo para leerlo. |
| Social | social / minimal | Gancho y cierre breves, dejando libres rostro, manos y producto. |
| Producto | product | Un beneficio respaldado, logo propio y llamada a la acción solicitada. |
| Cine | cinematic | Título de capítulo o lugar sólo cuando orienta, con planos limpios entre apariciones. |
| Explicación | explainer | Una idea por pantalla y jerarquía estable entre pasos. |
| Datos | data | Comparación honesta, unidad y procedencia visibles. |

El catálogo contiene `minimal`, `editorial`, `news`, `cinematic`, `product`,
`explainer`, `data` y `social`. Fijar paleta, acento, alineación, ritmo y motor
para toda la pieza. Son presets de campos soportados; no seleccionan una fuente
subida, CSS o código libre. El tamaño tipográfico se ajusta en el renderer
instalado; el caller controla cajas, copy y tiempos. No hay un campo público
`font_size` ni promesa de tipografía idéntica entre plataformas.

El estilo de las tomas se prepara aparte con
la [dirección visual](https://auroflow.club/skills/auroflow-film-production/references/visual-direction.md) de la skill de producción.
Una capa no debe pedir al generador de vídeo que vuelva a pintar el mismo título.
Así una corrección editorial conserva las fuentes y la voz.

## Sugerir una composición sin generar

`auroflow_suggest_graphics` (`POST /v1/graphics/suggest`) recibe `request` en MCP;
REST recibe el objeto interior. Ejemplo de dirección, sin guardado ni render:

```json
{
  "request": {
    "kind": "ad",
    "aspect": "9:16",
    "duration_seconds": 15,
    "requested_texts": ["De una URL a tu vídeo", "Crea tu cuenta"],
    "style": "social",
    "engine": "hyperframes",
    "platform": "tiktok",
    "style_prompt": "accent: #2F8FFF"
  }
}
```

Los textos son copy de ejemplo, no aprobación del usuario. `kind` admite
`ad|documentary|film|news|general`; el director utiliza su propio
`production_type:"spot"`. `platform` admite `generic|tiktok|instagram|youtube`
y sólo orienta el diseño; no declara formatos ni duraciones oficiales.
`style_prompt`≤1500 conserva el literal y materializa únicamente directivas
anunciadas, como `color`, `accent`, `style` y `animation`. Los fragmentos
negados, desconocidos o conflictivos quedan en `unresolved_directives`, sin
aplicación silenciosa. No es comprensión general de lenguaje natural.

La respuesta propone huecos, plantillas, jerarquía y estimaciones de lectura.
`ready_layers` significa campos propuestos completos, no verificación de datos,
activos, runtime o legibilidad real. Un hueco de logo necesita un upload propio;
una gráfica necesita título, etiquetas, valores y evidencia del caller.
`has_verified_data:true` declara una decisión del caller: no verifica nada.

Elegir `engine` explícito. Las sugerencias conservan Remotion como motor
predeterminado; una composición que omite engine conserva HyperFrames. Con
`engine:"hyperframes"`, las plantillas omiten `animation`; si el brief la pide,
se informa como no aplicada. Remotion admite `fade`, `slide_up`, `slide_left`,
`spring_pop`, `typewriter`, con0.1–3s y duración no mayor que la ventana de la
capa; typewriter sólo para text/lower_third/ticker. No mezclar esos campos ni
cambiar de motor automáticamente si falta runtime o licencia.

Los cinco presets anteriores sin opciones nuevas conservan su respuesta
histórica. Para la dirección nueva enviar engine/platform o usar un preset
nuevo. Esas opciones pertenecen a suggest/review, no a la composición guardada.

## Revisar diseño antes de guardar

`auroflow_review_graphics` (`POST /v1/graphics/review`) recibe
`request:{composition,platform?}`. `composition` es la misma estructura tipada
de create: sin ID de render, con IDs `layer-…` y el entero `cost_max:0` dentro.
No necesita abrir medios, consultar fuentes o arrancar un modelo.

La revisión comprueba el contrato y devuelve errores de normalización, métricas
estimadas de texto/tiempo/caja, posibles solapamientos, zona editorial y entradas
pendientes del autor, como unidad o procedencia de datos. `estimated_only:true`
y `human_approval:false` permanecen explícitos. No corrige ni parafrasea copy,
no lee fotogramas, no escucha audio, no verifica propiedad/fuentes/hechos ni
certifica contraste o legibilidad. Un resultado válido no sustituye el plan
que verifica runtime y hashes de medios.

En MCP, suggest/review exponen sus campos directamente en `response`, sin un
objeto `response.review`. Crear/leer/parchear devuelve `response.track`;
el plan devuelve sus campos en `response` junto a un resumen `track`.
Comprobar `isError` y el HTTP interno antes de usar cualquiera de ellos.

Las zonas por plataforma son **estimaciones editoriales, no reglas oficiales**.
En TikTok/Instagram verticales reservar lateral derecho y parte inferior;
en YouTube horizontal revisar controles inferiores, y en vertical la interfaz
correspondiente. La zona genérica deja margen visible. Comprobar la interfaz
y modalidad real de publicación: una caja dentro de zona todavía puede tapar
una cara o un producto que el helper no ve.

Dejar alrededor de3–4s para un titular corto es sólo un punto de partida
editorial; aumentar el tiempo para etiquetas, cifras, título+subtítulo o gráficas.
La entrada/salida consume parte de la ventana. Un texto admitido por el schema
puede no caber o no leerse bien. Si no cabe, cambiar caja/tiempo/distribución o
resolver una edición autorizada, sin truncar un literal en silencio.

Como objetivo de contraste usar4.5:1 para texto normal y3:1 para texto grande,
siguiendo [W3C](https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html).
Es un objetivo conservador sobre el fondo real; no una certificación WCAG del MP4.

## Gráficas que expliquen datos

| Tipo | Relación adecuada | Límites que debe revisar el autor |
| --- | --- | --- |
| bar | Comparar categorías con la misma unidad. | Periodo y denominador comparables; escala que incluye cero. |
| line | Evolución ordenada de una magnitud. | El renderer separa muestras uniformemente: usar intervalos iguales o declarar el límite temporal. |
| donut | Partes excluyentes de un total. | Sin negativos, suma positiva y denominador explicado; el centro muestra el total, no un porcentaje inventado. |

Seguir el mensaje único, unidades y procedencia de la
[guía de Government Analysis Function](https://analysisfunction.civilservice.gov.uk/policy-store/data-visualisation-charts/).
Guardar la referencia detallada, periodo, población y definición en el brief.
La capa chart admite title/chart_type/labels/values; no admite campos nuevos
`verified_source`, `unit`, `source_url`, `axis_min` ni ejes configurables.
Mostrar unidad en título/etiquetas y procedencia breve en otra capa text.
Los datos sintéticos deben llevar **Datos ilustrativos** visible.

Máximo1–8 pares, etiquetas≤40caracteres y valores finitos entre−1e9 y1e9;
la misma cantidad de labels y values. Es un límite técnico, no una recomendación
de usar ocho categorías en móvil. No se soportan doble eje, escalas logarítmicas
ni barras de error. Mantener datos y unidades entre revisiones; una animación
no demuestra una tendencia. Revisar el estado final de la gráfica, no atribuir
valor factual a un frame intermedio de crecimiento de barras/contadores.

## Guardar, corregir y exportar

1. Persistir `gfx-…` nuevo e intención; llamar a `auroflow_create_graphics_track`
   con `request:{id,name?,composition}`. Cada capa tiene un ID estable. Overlay
   necesita un job/sequence propio completado como background; standalone no.
2. `auroflow_plan_graphics_track {id,revision}` comprueba la revisión y fija
   hashes propios. Exigir `render_ready`, `assets_verified` y coste0, además
   de runtime/licencia del motor elegido. Un plan no renderiza.
3. Persistir `motion-…` y llamar una vez a `auroflow_render_graphics_track_zero`
   con `{id,revision,motion_id,cost_max:0}`. Guardar track/job devueltos y consultar
   ese motion_id con `auroflow_get`. Una revisión tiene un binding.
4. Para otro titular, leer la pista compacta, enviar sólo el parche con la
   revisión observada, revisar la nueva revisión, planificarla y exportarla.
   Conservar los IDs de las capas y comparar los pins de base/audio.

Ejemplo no enviable hasta resolver el ID, la capa existente y la revisión:

```json
{
  "id": "<OBSERVED_GFX_ID>",
  "request": {
    "expected_revision": "<OBSERVED_REVISION>",
    "patches": [
      {"op":"set","layer_id":"layer-title","changes":{"text":"Nuevo titular aprobado"}}
    ]
  }
}
```

Es argumento de `auroflow_patch_graphics_track`. Cambia sólo una capa; no
reenvía vídeo/audio ni el resto de la composición. También admite add/remove/move;
no cambiar el tipo con set. Un replay exacto del parche se reconcilia con su
revisión guardada. Un parche diferente con revisión antigua produce conflicto:
releer y combinar, sin pisar una edición concurrente. Ante incertidumbre de
render leer el mismo track/binding/motion_id; no inventar otro ID ni reenviar.

### Si la cola rechaza la admisión

El servicio guarda el binding de render antes de admitir el job Motion. Una
respuesta de cola llena puede dejar ese binding sin un trabajo aceptado. Para
retomar la exportación autorizada, aplicar estas cinco comprobaciones:

1. Conservar el rechazo explícito `429 motion_queue_limit`, con
   `stage:"admission"`, `recoverable:true`, `uncertain:false` y
   `automatic_retry:false`. Un timeout o un404 aislado no prueban no admisión.
2. Leer el mismo track, revisión y `render.motion_id`; deben coincidir con la
   intención guardada. Comprobar que GET de ese motion_id devuelve404. Si el
   job existe, continuar consultándolo; no presentar otro render.
3. Leer `auroflow_list {kind:"motion_queue"}` (`GET /v1/motion/queue`) y los límites vivos
   de `auroflow_capabilities {area:"motion"}.queue_limits`; esperar hueco con lecturas
   acotadas. No asumir un límite permanente ni elevar la prioridad del caller.
4. Revalidar el plan de esa revisión, pins/hashes, motor y coste0. Sólo con
   capacidad y la misma intención autorizada, presentar una vez la petición
   idéntica con el mismo track/revision/motion_id/cost_max0, sin crear recursos.
5. Conservar la respuesta y leer el mismo job. Otro rechazo o una respuesta
   incierta exige reconciliación; no un bucle de POST ni un ID nuevo.

La excepción corresponde a una admisión conocida como rechazada. No cambia la
regla de los envíos inciertos ni activa reintentos automáticos.

Motor, aspecto, duración y vídeo base permanecen fijos en una pista.
El audio se edita por revisión; cada ID de pista sonora conserva su fuente
inmutable y cambiarla requiere otro ID. El primer plan fija fuentes y logos por SHA; un
logo nuevo posterior requiere otra pista. Un logo ya fijado se puede quitar
y reintroducir. Omitir audio alternativo conserva el original en overlay;
añadirlo lo sustituye con una grabación propia, no crea otra voz ni repite
una muestra corta. La recodificación no implica identidad byte a byte de PCM.

Con cero capas visuales y sin audio explícito se guarda una versión limpia:
entregar la base original. Si hay audio explícito, `layers:[]` permite montar
sólo sonido. Editar no genera ni encola. Exportar utiliza la cola Motion
continua y la prioridad autenticada, con coste entero0, sin generación Flow.
La infraestructura propia tiene coste operativo. Revisar todos los segundos
con audio del MP4 final; separar validación técnica, criterio editorial y
aprobación humana. `completed` no garantiza diseño, acento o voz aprobados.

## REST y lecturas compactas

| Ruta autenticada | Operación |
| --- | --- |
| `GET /v1/graphics/styles` | Presets y directivas, sin modelo |
| `POST /v1/graphics/suggest` | Huecos y plantillas, sin persistencia |
| `POST /v1/graphics/review` | Estimación tipada sin I/O ni aprobación |
| `GET /v1/graphics/tracks` | Resúmenes propios |
| `POST /v1/graphics/tracks` | Crear pista |
| `GET /v1/graphics/tracks/{id}` | Lectura compacta por defecto |
| `GET /v1/graphics/tracks/{id}?revision=N&compact=0` | Composición completa o versión histórica |
| `POST /v1/graphics/tracks/{id}` | Parche con expected_revision |
| `POST /v1/graphics/tracks/{id}/plan` | Validar revisión y fijar fuentes |
| `POST /v1/graphics/tracks/{id}/render` | Encolar esa revisión a coste0 |

Una lectura compacta incluye IDs/textos y hasta tres revisiones recientes.
`compact:false` pide composición completa e historial limitado; usarlo sólo
si hace falta. La URL de edición es `/app#motion/track/gfx-ID`, sustituyendo el
ID observado. Límites:1–60s,16:9/9:16,24fps,12capas,100documentos por cuenta,
100revisiones por documento. No se aplica automáticamente una pista a una
película de más de60s. No enviar HTML, React, scripts, rutas o URLs de medios;
los recursos se referencian por IDs propios. Contrato exacto en
[OpenAPI](https://api.auroflow.club/openapi.json) y
[bundle de la skill](https://auroflow.club/skills/auroflow-graphics-layers/bundle.zip).
