← Todas las superficies

La órbita por superficie · Audiovisual

La línea no vive dentro de la toma

Videos de marca propia con planos filmados o generados. La línea entra como texto compuesto después —cartela, zócalo, callout, super de dato, subtítulos— y como cierre de marca. Cada plano tiene su ficha y su formato nativo. Guía completa: docs/agent-composition/surfaces/audiovisual.md.

audiovisual
8 aprobadas
Token
surfaces.audiovisual

01 · audiovisual

Video de producción

«Cómo trabajamos», casos, presentaciones del equipo: un plan de planos con sus reglas y siete generadores de texto.

Formatos · efeonceGraphicLine.surfaces.audiovisual.formats
FormatoMedidasCómo se lee
16x91920 × 1080 pxPresentación, web y YouTube, con o sin sonido. Los cortes verticales y cuadrados se cubren de forma nativa por plano y llevan subtítulos quemados.

Reglas de la superficie

Recetas aprobadas y pendientes

shot-plan

Aprobadapapel plan · formato 16x9
Producción audiovisual · planos y reglas
Producción audiovisual · planos y reglas

El plan de planos: cada plano declara lugar, lente, cámara, luz, registro y vestuario; cierra con el reveal.

Token
efeonceGraphicLine.surfaces.audiovisual.recipes['shot-plan']
Tablero del canvas
audiovisual · Audiovisual
Línea de tiempo de la receta
TramoDesdeHasta
Plano general0 s3 s
Inserto3 s5 s
Plano medio5 s9 s
Cierre con el reveal9 s12,6 s
Valores del token
{
  "status": "approved",
  "role": "plan",
  "formats": [
    "16x9"
  ],
  "voice": {
    "mode": "none"
  },
  "sheetTitle": true,
  "shots": {
    "per": "segment"
  },
  "timeline": {
    "sequence": "shots",
    "segments": [
      {
        "id": "shot-01-wide",
        "fromMs": 0,
        "toMs": 3000,
        "lensMm": 35,
        "camera": "hand-held-slow-advance",
        "register": "documental"
      },
      {
        "id": "shot-02-insert",
        "fromMs": 3000,
        "toMs": 5000,
        "lensMm": 100,
        "camera": "fixed-macro"
      },
      {
        "id": "shot-03-medium",
        "fromMs": 5000,
        "toMs": 9000,
        "lensMm": 50,
        "camera": "over-the-shoulder-slow-push"
      },
      {
        "id": "shot-04-close",
        "fromMs": 9000,
        "toMs": 12600,
        "close": "reveal"
      }
    ]
  },
  "rules": [],
  "references": [
    {
      "id": "shot-plan",
      "title": "Producción audiovisual · planos y reglas",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/shot-plan.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "Audiovisual.dc.html"
    }
  ]
}

cartela

Aprobadapapel opening-title · formato 16x9
Escenas con texto · 01 cartela de apertura
Escenas con texto · 01 cartela de apertura

Cartela de apertura: pregunta con su anillo, respuesta gigante con la esfera y la órbita que mide el capítulo.

Token
efeonceGraphicLine.surfaces.audiovisual.recipes.cartela
Cuándo
0 s – 2,5 s
Tablero del canvas
audiovisual · AudiovisualTextos

Reglas de la receta

  • text-only-in-planned-reservesTexto sólo en las reservas planeadas del plano, como cartela compuesta después, nunca generada.
Valores del token
{
  "status": "approved",
  "role": "opening-title",
  "formats": [
    "16x9"
  ],
  "voice": {
    "mode": "question-answer"
  },
  "timeline": {
    "sequence": "texts",
    "window": [
      0,
      2500
    ]
  },
  "progress": {
    "sections": 3,
    "ring": {
      "cxOfWidth": 0.7395833333333334,
      "cyOfHeight": 0.48148148148148145,
      "rOfHeight": 0.35185185185185186
    },
    "arcStrokePx": 14,
    "spherePx": 22
  },
  "reserves": {
    "voice": {
      "side": "start",
      "inset": 0.078125,
      "fromTop": 0.1814814814814815
    },
    "answer": {
      "side": "start",
      "inset": 0.06666666666666667,
      "fromTop": 0.29444444444444445
    }
  },
  "type": {
    "question": {
      "px": 52
    },
    "answer": {
      "px": 400,
      "tracking": "-0.06em"
    },
    "chapterWord": {
      "px": 96
    },
    "chapterLabel": {
      "px": 34
    }
  },
  "chapter": {
    "inRing": true
  },
  "selection": {
    "target": "answer",
    "targetKind": "text",
    "anchor": "bottom-end",
    "participantKind": "role",
    "label": "Dirección de arte",
    "collaboratorScale": 1.6
  },
  "rules": [
    "text-only-in-planned-reserves"
  ],
  "references": [
    {
      "id": "cartela",
      "title": "Escenas con texto · 01 cartela de apertura",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/cartela.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "AudiovisualTextos.dc.html"
    }
  ]
}

zocalo

Aprobadapapel lower-third · formato 16x9
Escenas con texto · 02 generador de caracteres (zócalo)
Escenas con texto · 02 generador de caracteres (zócalo)

Generador de caracteres: el contexto con el anillo, el rol con la esfera y los corchetes con el cursor del rol.

Token
efeonceGraphicLine.surfaces.audiovisual.recipes.zocalo
Cuándo
2,5 s – 5 s
Tablero del canvas
audiovisual · AudiovisualTextos

Reglas de la receta

  • lower-third-enters-400msEl zócalo entra en 0,4 s.
Valores del token
{
  "status": "approved",
  "role": "lower-third",
  "formats": [
    "16x9"
  ],
  "voice": {
    "mode": "question-answer"
  },
  "timeline": {
    "sequence": "texts",
    "window": [
      2500,
      5000
    ],
    "enterMs": 400
  },
  "reserves": {
    "lowerThird": {
      "side": "bottom",
      "inset": 0.0625,
      "fromTop": 0.7407407407407407
    }
  },
  "type": {
    "question": {
      "px": 38
    },
    "answer": {
      "px": 128
    }
  },
  "selection": {
    "target": "answer",
    "targetKind": "group",
    "variant": "open-brackets",
    "padding": "compact",
    "anchor": "top-end",
    "participantKind": "role",
    "label": "Producción",
    "collaboratorScale": 1.2
  },
  "rules": [
    "lower-third-enters-400ms"
  ],
  "references": [
    {
      "id": "zocalo",
      "title": "Escenas con texto · 02 generador de caracteres (zócalo)",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/zocalo.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "AudiovisualTextos.dc.html"
    }
  ]
}

callout-selection

Aprobadapapel callout · formato 16x9
Escenas con texto · 03 callout con selección
Escenas con texto · 03 callout con selección

La selección de AXIS marca el objeto que importa y el cursor de un rol lo toma.

Token
efeonceGraphicLine.surfaces.audiovisual.recipes['callout-selection']
Cuándo
5 s – 6,5 s
Tablero del canvas
audiovisual · AudiovisualTextos
Valores del token
{
  "status": "approved",
  "role": "callout",
  "formats": [
    "16x9"
  ],
  "voice": {
    "mode": "none"
  },
  "timeline": {
    "sequence": "texts",
    "window": [
      5000,
      6500
    ]
  },
  "selection": {
    "target": "object",
    "targetKind": "object",
    "box": "from-intent",
    "anchor": "top-start",
    "participantKind": "role",
    "label": "Dirección de arte",
    "collaboratorScale": 1.6
  },
  "rules": [],
  "references": [
    {
      "id": "callout-selection",
      "title": "Escenas con texto · 03 callout con selección",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/callout-selection.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "AudiovisualTextos.dc.html"
    }
  ]
}

data-super

Aprobadapapel data-super · formato 16x9
Escenas con texto · 04 super de dato
Escenas con texto · 04 super de dato

La cifra en grande sobre la zona calma, dentro de una órbita que la mide; siempre con fuente.

Token
efeonceGraphicLine.surfaces.audiovisual.recipes['data-super']
Cuándo
6,5 s – 8 s
Tablero del canvas
audiovisual · AudiovisualTextos

Reglas de la receta

  • datum-assembles-with-arc-hitEl dato se arma con el golpe del arco.
Valores del token
{
  "status": "approved",
  "role": "data-super",
  "formats": [
    "16x9"
  ],
  "voice": {
    "mode": "none"
  },
  "timeline": {
    "sequence": "texts",
    "window": [
      6500,
      8000
    ]
  },
  "measure": {
    "ring": {
      "cxOfWidth": 0.15625,
      "cyOfHeight": 0.7037037037037037,
      "rOfHeight": 0.1388888888888889
    },
    "arcStrokePx": 9,
    "spherePx": 14
  },
  "type": {
    "value": {
      "px": 88
    },
    "caption": {
      "px": 34
    }
  },
  "rules": [
    "datum-assembles-with-arc-hit"
  ],
  "references": [
    {
      "id": "data-super",
      "title": "Escenas con texto · 04 super de dato",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/data-super.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "AudiovisualTextos.dc.html"
    }
  ]
}

split-screen

Aprobadapapel split-screen · formato 16x9
Escenas con texto · 05 pantalla dividida
Escenas con texto · 05 pantalla dividida

Dos planos en el mismo cuadro, separados por una línea de acento; la esfera cierra la última palabra.

Token
efeonceGraphicLine.surfaces.audiovisual.recipes['split-screen']
Cuándo
8 s – 9,5 s
Tablero del canvas
audiovisual · AudiovisualTextos
Valores del token
{
  "status": "approved",
  "role": "split-screen",
  "formats": [
    "16x9"
  ],
  "voice": {
    "mode": "answer-only"
  },
  "timeline": {
    "sequence": "texts",
    "window": [
      8000,
      9500
    ]
  },
  "divider": {
    "px": 6,
    "color": "teal",
    "atOfWidth": 0.4984375
  },
  "panels": {
    "count": 2,
    "form": "cropped-shots",
    "cropBy": "focus"
  },
  "type": {
    "answer": {
      "px": 90
    }
  },
  "rules": [],
  "references": [
    {
      "id": "split-screen",
      "title": "Escenas con texto · 05 pantalla dividida",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/split-screen.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "AudiovisualTextos.dc.html"
    }
  ]
}

subtitles

Aprobadapapel subtitles · formato 16x9
Escenas con texto · 06 subtítulos quemados
Escenas con texto · 06 subtítulos quemados

Subtítulos quemados: dos líneas como máximo, centrados en el tercio inferior, sin caja.

Token
efeonceGraphicLine.surfaces.audiovisual.recipes.subtitles
Cuándo
todo el video
Tablero del canvas
audiovisual · AudiovisualTextos

Reglas de la receta

  • subtitles-no-boxSubtítulos sin caja, dos líneas como máximo, centrados en el tercio inferior.
Valores del token
{
  "status": "approved",
  "role": "subtitles",
  "formats": [
    "16x9"
  ],
  "voice": {
    "mode": "none"
  },
  "timeline": {
    "sequence": "texts",
    "window": "whole"
  },
  "reserves": {
    "subtitles": {
      "side": "bottom",
      "fromTop": 0.8148148148148148,
      "align": "center"
    }
  },
  "type": {
    "subtitle": {
      "px": 46,
      "weight": 600,
      "lineHeight": 1.3,
      "family": "text",
      "maxLines": 2,
      "box": false,
      "shadow": "0 2px 6px rgba(0,0,0,.55)"
    }
  },
  "subtitles": {
    "per": "layer"
  },
  "rules": [
    "subtitles-no-box"
  ],
  "references": [
    {
      "id": "subtitles",
      "title": "Escenas con texto · 06 subtítulos quemados",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/subtitles.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "AudiovisualTextos.dc.html"
    }
  ]
}

close-reveal

Aprobadapapel close · formato 16x9
Escenas con texto · 07 cierre: firma la marca, nunca la toma
Escenas con texto · 07 cierre: firma la marca, nunca la toma

El reveal oficial del logo, con sonido: firma la marca, nunca la toma.

Token
efeonceGraphicLine.surfaces.audiovisual.recipes['close-reveal']
Cuándo
el cierre
Tablero del canvas
audiovisual · AudiovisualTextos

Reglas de la receta

  • signature-in-close-own-brand-onlyLa firma va en el cierre (sting o reveal), sólo en marca propia; nunca en piezas de clientes. La toma nunca lleva logo.
Valores del token
{
  "status": "approved",
  "role": "close",
  "formats": [
    "16x9"
  ],
  "voice": {
    "mode": "none"
  },
  "timeline": {
    "sequence": "texts",
    "window": "close"
  },
  "rules": [
    "signature-in-close-own-brand-only"
  ],
  "references": [
    {
      "id": "close-reveal",
      "title": "Escenas con texto · 07 cierre: firma la marca, nunca la toma",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/close-reveal.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "AudiovisualTextos.dc.html"
    }
  ]
}

Firma

Cómo firma

La regla general es el logo de Efeonce centrado. Cada superficie la adapta a cómo se lee.

Rechazado

Lo que el operador rechazó

Lo rechazado no es receta: no tiene id ni imagen de referencia. Queda escrito para no repetirlo.

No hay rechazos explícitos en esta superficie.

Pendientes y hallazgos a revisar

Para agentes

Intent de ejemplo

Pasa por el contrato real al construir esta página: si trae un error, el Lab no se publica. Cópialo, cambia el texto y resuélvelo.

docs/examples/surfaces/audiovisual-zocalo-intent.json

{
  "contract": "efeonce.surface-composition",
  "version": "0.1.1",
  "surface": "audiovisual",
  "format": "16x9",
  "role": "lower-third",
  "recipe": "zocalo",
  "line": "growth",
  "theme": "dark",
  "voice": {
    "question": "Terreno · panadería del cliente, 06:40",
    "answer": [
      "Producción"
    ]
  },
  "selection": {
    "target": "answer",
    "label": "Producción",
    "participantKind": "role"
  }
}

Resolverlo

pnpm surface:resolve -- --input docs/examples/surfaces/audiovisual-zocalo-intent.json --out /tmp/surface-manifest.json
Manifest resuelto (axis.surface-composition.v1)
{
  "schema": "axis.surface-composition.v1",
  "contract": {
    "id": "efeonce.surface-composition",
    "version": "0.1.2",
    "lifecycle": "candidate"
  },
  "status": "resolved",
  "surface": "audiovisual",
  "format": "16x9",
  "role": "lower-third",
  "recipe": {
    "id": "zocalo",
    "status": "approved",
    "role": "lower-third"
  },
  "use": null,
  "layout": null,
  "line": "growth",
  "theme": "dark",
  "palette": {
    "background": "#001a33",
    "accent": "#36c8bf",
    "ink": "#ffffff",
    "soft": "#e2e2e2"
  },
  "canvas": {
    "width": 1920,
    "height": 1080,
    "unit": "px",
    "format": "16x9"
  },
  "safeArea": null,
  "reserves": [
    {
      "band": "lowerThird",
      "side": "bottom",
      "inset": 0.0625,
      "fromTop": 0.7407
    }
  ],
  "type": {
    "question": {
      "family": "Poppins",
      "weight": 300,
      "px": 38,
      "lineHeight": null,
      "tracking": null,
      "uppercase": false,
      "color": "#ffffff"
    },
    "answer": {
      "family": "Bricolage Grotesque",
      "weight": 760,
      "px": 128,
      "lineHeight": null,
      "tracking": "-0.035em",
      "uppercase": false,
      "color": "#ffffff"
    }
  },
  "dominance": {
    "ratio": 3.37,
    "min": 3,
    "ok": true
  },
  "steps": null,
  "signature": {
    "mode": "close-only",
    "photoCarriesLogo": false,
    "orbitDelegate": "surface-owned"
  },
  "timeline": {
    "sequence": "texts",
    "durationMs": 13100,
    "window": [
      2500,
      5000
    ],
    "enterMs": 400,
    "segments": [],
    "close": {
      "piece": "reveal",
      "startMs": 9500,
      "durationMs": 3600,
      "audio": true
    },
    "audio": true,
    "reducedMotion": "final-frame"
  },
  "rules": [
    {
      "id": "efeonce-dark-ground",
      "text": "El fondo Efeonce (#001a33) se mantiene en toda pieza de línea; la línea sólo aporta el acento (operador, 2026-09-26)."
    },
    {
      "id": "one-sphere-per-piece",
      "text": "Una esfera por pieza: cierra la respuesta; nunca es viñeta ni adorno."
    },
    {
      "id": "one-orbit-per-piece",
      "text": "Una órbita por pieza o lámina: anillo, lente, indicador o medida, uno solo."
    },
    {
      "id": "accent-text-min-size",
      "text": "El acento nunca colorea texto de menos de 24 px: ahí el texto va en blanco o suave sobre oscuro (navy sobre claro); el acento marca con un elemento de 24 px o más o con el ícono."
    },
    {
      "id": "timings-from-tokens",
      "text": "Los tiempos salen de efeonceGraphicLine (surfaces.*.timeline y motion); nunca se escriben en el script."
    },
    {
      "id": "answer-dominates-3x",
      "text": "La respuesta mide al menos 3 veces la pregunta (type.answer.minRatioOverQuestion)."
    },
    {
      "id": "figures-with-source",
      "text": "Cifras sólo con fuente; precios siempre como marcador."
    },
    {
      "id": "isotype-composed",
      "text": "El isotipo en prendas generadas se compone desde @efeoncepro/axis-brand-assets; nunca el que dibuja el modelo."
    },
    {
      "id": "cine-only-nexa-or-proposal",
      "text": "Registro cine sólo con Nexa protagonista o en las recetas de cine del deck (photo.cine.recipes: proposal-cinematic y, desde el 2026-09-27, la portada de brochure, las contraportadas con foto, la sección de cine, la lente de la propuesta sobria desde el 2026-09-28 y, como excepción aprobada con personas del equipo en luz dramática, la sección partida); proporciones reales (cámara a ~2 m, 85 mm)."
    },
    {
      "id": "no-close-gaze-pairs",
      "text": "Nunca dos personas mirándose de cerca: se lee romántico (rechazo del operador, 2026-09-27)."
    },
    {
      "id": "semantic-reserves-only",
      "text": "Sin coordenadas libres: regiones semánticas y fracciones que salen de tokens."
    },
    {
      "id": "first-frame-passes-still-qa",
      "text": "El primer cuadro de cada plano es una foto que pasó el QA fijo (foto:validar); recién entonces se anima."
    },
    {
      "id": "one-light-one-register",
      "text": "Una luz con carácter y un registro por pieza; los planos se emparejan, no se mezclan."
    },
    {
      "id": "grade-matches-photo",
      "text": "El grade sólo empareja hacia la colorimetría de la foto, sin look propio; sombras sin azul."
    },
    {
      "id": "wardrobe-by-register",
      "text": "Uniforme por registro de escena; el emblema se revisa cuadro a cuadro (si el modelo lo reinventa, no se lee o se compone)."
    },
    {
      "id": "text-only-in-planned-reserves",
      "text": "Texto sólo en las reservas planeadas del plano, como cartela compuesta después, nunca generada."
    },
    {
      "id": "native-format-per-shot",
      "text": "Formato nativo por plano (cobertura 16:9, 9:16 y 1:1): no se recorta uno desde otro."
    },
    {
      "id": "signature-in-close-own-brand-only",
      "text": "La firma va en el cierre (sting o reveal), sólo en marca propia; nunca en piezas de clientes. La toma nunca lleva logo."
    },
    {
      "id": "lower-third-enters-400ms",
      "text": "El zócalo entra en 0,4 s."
    }
  ],
  "references": [
    {
      "id": "zocalo",
      "title": "Escenas con texto · 02 generador de caracteres (zócalo)",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/zocalo.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "AudiovisualTextos.dc.html"
    }
  ],
  "delegates": {
    "orbit": [
      {
        "scene": "main",
        "contract": "efeonce.graphic-line-orbit",
        "intent": {
          "canvas": {
            "width": 1920,
            "height": 1080,
            "line": "growth",
            "surface": "dark",
            "channel": "screen"
          },
          "elements": [
            {
              "kind": "voice",
              "id": "voice",
              "questionId": "question",
              "answerId": "answer",
              "answerText": "Producción"
            }
          ]
        }
      }
    ],
    "close": {
      "piece": "reveal",
      "format": "16x9",
      "durationMs": 3600,
      "startMs": 9500,
      "source": "efeonceGraphicLine.motion.pieces.reveal",
      "signsOnlyOwnBrand": true
    },
    "selection": [
      {
        "contract": "efeonce.collaboration-selection",
        "intent": {
          "targetId": "answer",
          "targetKind": "group",
          "variant": "open-brackets",
          "padding": "compact",
          "cursors": [
            {
              "id": "collaborator",
              "kind": "collaborator",
              "targetId": "answer",
              "anchor": "top-end",
              "label": "Producción",
              "participantKind": "role"
            }
          ]
        },
        "collaboratorScale": 1.2,
        "targetKind": "group",
        "variant": "open-brackets",
        "padding": "compact"
      }
    ],
    "icons": [],
    "photo": null
  },
  "content": {
    "eyebrow": null,
    "question": "Terreno · panadería del cliente, 06:40",
    "answer": [
      "Producción"
    ],
    "answerSphere": "closes-last-line",
    "body": null,
    "proof": null,
    "measure": null,
    "progress": null,
    "cta": null,
    "variants": null,
    "levels": null,
    "note": null,
    "panels": null,
    "figures": null,
    "nav": null,
    "title": null,
    "frames": null,
    "chapter": null,
    "shots": null,
    "subtitles": null,
    "lines": null,
    "slogan": null
  },
  "adapterChecks": [
    "text-inside-its-reserve",
    "text-never-crosses-ring",
    "answer-dominates-3x-painted",
    "accent-text-min-size",
    "signature-where-the-surface-says",
    "subject-outside-text-reserve",
    "last-frame-is-static-fallback",
    "legibility-at-reading-distance"
  ],
  "issues": []
}

docs/examples/surfaces/audiovisual-cartela-intent.json

{
  "contract": "efeonce.surface-composition",
  "version": "0.1.1",
  "surface": "audiovisual",
  "format": "16x9",
  "role": "opening-title",
  "recipe": "cartela",
  "line": "growth",
  "theme": "dark",
  "voice": {
    "question": "¿Cómo trabajamos?",
    "answer": [
      "Así"
    ]
  },
  "progress": {
    "sections": 3,
    "current": 1
  },
  "chapter": {
    "title": "Escucha"
  },
  "selection": {
    "target": "answer",
    "label": "Dirección de arte",
    "participantKind": "role"
  }
}

Resolverlo

pnpm surface:resolve -- --input docs/examples/surfaces/audiovisual-cartela-intent.json --out /tmp/surface-manifest.json
Manifest resuelto (axis.surface-composition.v1)
{
  "schema": "axis.surface-composition.v1",
  "contract": {
    "id": "efeonce.surface-composition",
    "version": "0.1.2",
    "lifecycle": "candidate"
  },
  "status": "resolved",
  "surface": "audiovisual",
  "format": "16x9",
  "role": "opening-title",
  "recipe": {
    "id": "cartela",
    "status": "approved",
    "role": "opening-title"
  },
  "use": null,
  "layout": null,
  "line": "growth",
  "theme": "dark",
  "palette": {
    "background": "#001a33",
    "accent": "#36c8bf",
    "ink": "#ffffff",
    "soft": "#e2e2e2"
  },
  "canvas": {
    "width": 1920,
    "height": 1080,
    "unit": "px",
    "format": "16x9"
  },
  "safeArea": null,
  "reserves": [
    {
      "band": "voice",
      "side": "start",
      "inset": 0.0781,
      "fromTop": 0.1815
    },
    {
      "band": "answer",
      "side": "start",
      "inset": 0.0667,
      "fromTop": 0.2944
    },
    {
      "band": "orbit",
      "region": "center-end",
      "circle": {
        "cxOfWidth": 0.7396,
        "cyOfHeight": 0.4815,
        "rOfHeight": 0.3519
      },
      "source": "surfaces.recipe.progress"
    }
  ],
  "type": {
    "question": {
      "family": "Poppins",
      "weight": 300,
      "px": 52,
      "lineHeight": null,
      "tracking": null,
      "uppercase": false,
      "color": "#ffffff"
    },
    "answer": {
      "family": "Bricolage Grotesque",
      "weight": 760,
      "px": 400,
      "lineHeight": null,
      "tracking": "-0.06em",
      "uppercase": false,
      "color": "#ffffff"
    },
    "chapterWord": {
      "family": null,
      "weight": null,
      "px": 96,
      "lineHeight": null,
      "tracking": null,
      "uppercase": false,
      "color": "#ffffff"
    },
    "chapterLabel": {
      "family": null,
      "weight": null,
      "px": 34,
      "lineHeight": null,
      "tracking": null,
      "uppercase": false,
      "color": "#ffffff"
    }
  },
  "dominance": {
    "ratio": 7.69,
    "min": 3,
    "ok": true
  },
  "steps": null,
  "signature": {
    "mode": "close-only",
    "photoCarriesLogo": false,
    "orbitDelegate": "surface-owned"
  },
  "timeline": {
    "sequence": "texts",
    "durationMs": 13100,
    "window": [
      0,
      2500
    ],
    "enterMs": null,
    "segments": [],
    "close": {
      "piece": "reveal",
      "startMs": 9500,
      "durationMs": 3600,
      "audio": true
    },
    "audio": true,
    "reducedMotion": "final-frame"
  },
  "rules": [
    {
      "id": "efeonce-dark-ground",
      "text": "El fondo Efeonce (#001a33) se mantiene en toda pieza de línea; la línea sólo aporta el acento (operador, 2026-09-26)."
    },
    {
      "id": "one-sphere-per-piece",
      "text": "Una esfera por pieza: cierra la respuesta; nunca es viñeta ni adorno."
    },
    {
      "id": "one-orbit-per-piece",
      "text": "Una órbita por pieza o lámina: anillo, lente, indicador o medida, uno solo."
    },
    {
      "id": "accent-text-min-size",
      "text": "El acento nunca colorea texto de menos de 24 px: ahí el texto va en blanco o suave sobre oscuro (navy sobre claro); el acento marca con un elemento de 24 px o más o con el ícono."
    },
    {
      "id": "timings-from-tokens",
      "text": "Los tiempos salen de efeonceGraphicLine (surfaces.*.timeline y motion); nunca se escriben en el script."
    },
    {
      "id": "answer-dominates-3x",
      "text": "La respuesta mide al menos 3 veces la pregunta (type.answer.minRatioOverQuestion)."
    },
    {
      "id": "figures-with-source",
      "text": "Cifras sólo con fuente; precios siempre como marcador."
    },
    {
      "id": "isotype-composed",
      "text": "El isotipo en prendas generadas se compone desde @efeoncepro/axis-brand-assets; nunca el que dibuja el modelo."
    },
    {
      "id": "cine-only-nexa-or-proposal",
      "text": "Registro cine sólo con Nexa protagonista o en las recetas de cine del deck (photo.cine.recipes: proposal-cinematic y, desde el 2026-09-27, la portada de brochure, las contraportadas con foto, la sección de cine, la lente de la propuesta sobria desde el 2026-09-28 y, como excepción aprobada con personas del equipo en luz dramática, la sección partida); proporciones reales (cámara a ~2 m, 85 mm)."
    },
    {
      "id": "no-close-gaze-pairs",
      "text": "Nunca dos personas mirándose de cerca: se lee romántico (rechazo del operador, 2026-09-27)."
    },
    {
      "id": "semantic-reserves-only",
      "text": "Sin coordenadas libres: regiones semánticas y fracciones que salen de tokens."
    },
    {
      "id": "first-frame-passes-still-qa",
      "text": "El primer cuadro de cada plano es una foto que pasó el QA fijo (foto:validar); recién entonces se anima."
    },
    {
      "id": "one-light-one-register",
      "text": "Una luz con carácter y un registro por pieza; los planos se emparejan, no se mezclan."
    },
    {
      "id": "grade-matches-photo",
      "text": "El grade sólo empareja hacia la colorimetría de la foto, sin look propio; sombras sin azul."
    },
    {
      "id": "wardrobe-by-register",
      "text": "Uniforme por registro de escena; el emblema se revisa cuadro a cuadro (si el modelo lo reinventa, no se lee o se compone)."
    },
    {
      "id": "text-only-in-planned-reserves",
      "text": "Texto sólo en las reservas planeadas del plano, como cartela compuesta después, nunca generada."
    },
    {
      "id": "native-format-per-shot",
      "text": "Formato nativo por plano (cobertura 16:9, 9:16 y 1:1): no se recorta uno desde otro."
    },
    {
      "id": "signature-in-close-own-brand-only",
      "text": "La firma va en el cierre (sting o reveal), sólo en marca propia; nunca en piezas de clientes. La toma nunca lleva logo."
    }
  ],
  "references": [
    {
      "id": "cartela",
      "title": "Escenas con texto · 01 cartela de apertura",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/cartela.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "AudiovisualTextos.dc.html"
    }
  ],
  "delegates": {
    "orbit": [
      {
        "scene": "main",
        "contract": "efeonce.graphic-line-orbit",
        "intent": {
          "canvas": {
            "width": 1920,
            "height": 1080,
            "line": "growth",
            "surface": "dark",
            "channel": "screen"
          },
          "elements": [
            {
              "kind": "voice",
              "id": "voice",
              "questionId": "question",
              "answerId": "answer",
              "answerText": "Así"
            },
            {
              "kind": "progress",
              "id": "progress",
              "region": "center-end",
              "sections": 3,
              "current": 1
            }
          ]
        }
      }
    ],
    "close": {
      "piece": "reveal",
      "format": "16x9",
      "durationMs": 3600,
      "startMs": 9500,
      "source": "efeonceGraphicLine.motion.pieces.reveal",
      "signsOnlyOwnBrand": true
    },
    "selection": [
      {
        "contract": "efeonce.collaboration-selection",
        "intent": {
          "targetId": "answer",
          "targetKind": "text",
          "cursors": [
            {
              "id": "collaborator",
              "kind": "collaborator",
              "targetId": "answer",
              "anchor": "bottom-end",
              "label": "Dirección de arte",
              "participantKind": "role"
            }
          ]
        },
        "collaboratorScale": 1.6,
        "targetKind": "text"
      }
    ],
    "icons": [],
    "photo": null
  },
  "content": {
    "eyebrow": null,
    "question": "¿Cómo trabajamos?",
    "answer": [
      "Así"
    ],
    "answerSphere": "closes-last-line",
    "body": null,
    "proof": null,
    "measure": null,
    "progress": {
      "sections": 3,
      "current": 1
    },
    "cta": null,
    "variants": null,
    "levels": null,
    "note": null,
    "panels": null,
    "figures": null,
    "nav": null,
    "title": null,
    "frames": null,
    "chapter": {
      "title": "Escucha",
      "label": null,
      "current": 1,
      "sections": 3
    },
    "shots": null,
    "subtitles": null,
    "lines": null,
    "slogan": null
  },
  "adapterChecks": [
    "text-inside-its-reserve",
    "text-never-crosses-ring",
    "answer-dominates-3x-painted",
    "accent-text-min-size",
    "signature-where-the-surface-says",
    "subject-outside-text-reserve",
    "last-frame-is-static-fallback",
    "legibility-at-reading-distance"
  ],
  "issues": []
}

docs/examples/surfaces/audiovisual-callout-selection-intent.json

{
  "contract": "efeonce.surface-composition",
  "version": "0.1.1",
  "surface": "audiovisual",
  "format": "16x9",
  "role": "callout",
  "recipe": "callout-selection",
  "line": "growth",
  "theme": "dark",
  "selection": {
    "target": "object",
    "label": "Dirección de arte",
    "participantKind": "role",
    "box": {
      "left": 0.375,
      "top": 0.5185,
      "right": 0.5521,
      "bottom": 0.7407
    }
  }
}

Resolverlo

pnpm surface:resolve -- --input docs/examples/surfaces/audiovisual-callout-selection-intent.json --out /tmp/surface-manifest.json
Manifest resuelto (axis.surface-composition.v1)
{
  "schema": "axis.surface-composition.v1",
  "contract": {
    "id": "efeonce.surface-composition",
    "version": "0.1.2",
    "lifecycle": "candidate"
  },
  "status": "resolved",
  "surface": "audiovisual",
  "format": "16x9",
  "role": "callout",
  "recipe": {
    "id": "callout-selection",
    "status": "approved",
    "role": "callout"
  },
  "use": null,
  "layout": null,
  "line": "growth",
  "theme": "dark",
  "palette": {
    "background": "#001a33",
    "accent": "#36c8bf",
    "ink": "#ffffff",
    "soft": "#e2e2e2"
  },
  "canvas": {
    "width": 1920,
    "height": 1080,
    "unit": "px",
    "format": "16x9"
  },
  "safeArea": null,
  "reserves": [],
  "type": {},
  "dominance": null,
  "steps": null,
  "signature": {
    "mode": "close-only",
    "photoCarriesLogo": false,
    "orbitDelegate": "surface-owned"
  },
  "timeline": {
    "sequence": "texts",
    "durationMs": 13100,
    "window": [
      5000,
      6500
    ],
    "enterMs": null,
    "segments": [],
    "close": {
      "piece": "reveal",
      "startMs": 9500,
      "durationMs": 3600,
      "audio": true
    },
    "audio": true,
    "reducedMotion": "final-frame"
  },
  "rules": [
    {
      "id": "efeonce-dark-ground",
      "text": "El fondo Efeonce (#001a33) se mantiene en toda pieza de línea; la línea sólo aporta el acento (operador, 2026-09-26)."
    },
    {
      "id": "one-sphere-per-piece",
      "text": "Una esfera por pieza: cierra la respuesta; nunca es viñeta ni adorno."
    },
    {
      "id": "one-orbit-per-piece",
      "text": "Una órbita por pieza o lámina: anillo, lente, indicador o medida, uno solo."
    },
    {
      "id": "accent-text-min-size",
      "text": "El acento nunca colorea texto de menos de 24 px: ahí el texto va en blanco o suave sobre oscuro (navy sobre claro); el acento marca con un elemento de 24 px o más o con el ícono."
    },
    {
      "id": "timings-from-tokens",
      "text": "Los tiempos salen de efeonceGraphicLine (surfaces.*.timeline y motion); nunca se escriben en el script."
    },
    {
      "id": "answer-dominates-3x",
      "text": "La respuesta mide al menos 3 veces la pregunta (type.answer.minRatioOverQuestion)."
    },
    {
      "id": "figures-with-source",
      "text": "Cifras sólo con fuente; precios siempre como marcador."
    },
    {
      "id": "isotype-composed",
      "text": "El isotipo en prendas generadas se compone desde @efeoncepro/axis-brand-assets; nunca el que dibuja el modelo."
    },
    {
      "id": "cine-only-nexa-or-proposal",
      "text": "Registro cine sólo con Nexa protagonista o en las recetas de cine del deck (photo.cine.recipes: proposal-cinematic y, desde el 2026-09-27, la portada de brochure, las contraportadas con foto, la sección de cine, la lente de la propuesta sobria desde el 2026-09-28 y, como excepción aprobada con personas del equipo en luz dramática, la sección partida); proporciones reales (cámara a ~2 m, 85 mm)."
    },
    {
      "id": "no-close-gaze-pairs",
      "text": "Nunca dos personas mirándose de cerca: se lee romántico (rechazo del operador, 2026-09-27)."
    },
    {
      "id": "semantic-reserves-only",
      "text": "Sin coordenadas libres: regiones semánticas y fracciones que salen de tokens."
    },
    {
      "id": "first-frame-passes-still-qa",
      "text": "El primer cuadro de cada plano es una foto que pasó el QA fijo (foto:validar); recién entonces se anima."
    },
    {
      "id": "one-light-one-register",
      "text": "Una luz con carácter y un registro por pieza; los planos se emparejan, no se mezclan."
    },
    {
      "id": "grade-matches-photo",
      "text": "El grade sólo empareja hacia la colorimetría de la foto, sin look propio; sombras sin azul."
    },
    {
      "id": "wardrobe-by-register",
      "text": "Uniforme por registro de escena; el emblema se revisa cuadro a cuadro (si el modelo lo reinventa, no se lee o se compone)."
    },
    {
      "id": "text-only-in-planned-reserves",
      "text": "Texto sólo en las reservas planeadas del plano, como cartela compuesta después, nunca generada."
    },
    {
      "id": "native-format-per-shot",
      "text": "Formato nativo por plano (cobertura 16:9, 9:16 y 1:1): no se recorta uno desde otro."
    },
    {
      "id": "signature-in-close-own-brand-only",
      "text": "La firma va en el cierre (sting o reveal), sólo en marca propia; nunca en piezas de clientes. La toma nunca lleva logo."
    }
  ],
  "references": [
    {
      "id": "callout-selection",
      "title": "Escenas con texto · 03 callout con selección",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/callout-selection.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "AudiovisualTextos.dc.html"
    }
  ],
  "delegates": {
    "orbit": [],
    "close": {
      "piece": "reveal",
      "format": "16x9",
      "durationMs": 3600,
      "startMs": 9500,
      "source": "efeonceGraphicLine.motion.pieces.reveal",
      "signsOnlyOwnBrand": true
    },
    "selection": [
      {
        "contract": "efeonce.collaboration-selection",
        "intent": {
          "targetId": "object",
          "targetKind": "object",
          "cursors": [
            {
              "id": "collaborator",
              "kind": "collaborator",
              "targetId": "object",
              "anchor": "top-start",
              "label": "Dirección de arte",
              "participantKind": "role"
            }
          ]
        },
        "collaboratorScale": 1.6,
        "targetKind": "object",
        "box": {
          "left": 0.375,
          "top": 0.5185,
          "right": 0.5521,
          "bottom": 0.7407,
          "px": {
            "x": 720,
            "y": 559.98,
            "width": 340.03,
            "height": 239.98
          }
        }
      }
    ],
    "icons": [],
    "photo": null
  },
  "content": {
    "eyebrow": null,
    "question": null,
    "answer": [],
    "answerSphere": null,
    "body": null,
    "proof": null,
    "measure": null,
    "progress": null,
    "cta": null,
    "variants": null,
    "levels": null,
    "note": null,
    "panels": null,
    "figures": null,
    "nav": null,
    "title": null,
    "frames": null,
    "chapter": null,
    "shots": null,
    "subtitles": null,
    "lines": null,
    "slogan": null
  },
  "adapterChecks": [
    "text-inside-its-reserve",
    "text-never-crosses-ring",
    "answer-dominates-3x-painted",
    "accent-text-min-size",
    "signature-where-the-surface-says",
    "subject-outside-text-reserve",
    "last-frame-is-static-fallback",
    "legibility-at-reading-distance"
  ],
  "issues": []
}

docs/examples/surfaces/audiovisual-shot-plan-intent.json

{
  "contract": "efeonce.surface-composition",
  "version": "0.1.1",
  "surface": "audiovisual",
  "format": "16x9",
  "role": "plan",
  "recipe": "shot-plan",
  "line": "growth",
  "theme": "dark",
  "title": "Producción audiovisual · un video de 12,6 s «Cómo trabajamos», cuadros clave generados",
  "shots": [
    {
      "segment": "shot-01-wide",
      "title": "Plano general",
      "spec": "Terreno, panadería del cliente · 35 mm · cámara en mano, avanza despacio · luz del horno + ventana",
      "note": "Documental: nadie mira a cámara · gorra + hoodie (terreno)",
      "plateRef": "ai-generations/2026-09-26_audiovisual/plates/V1-terreno.png",
      "alt": "Una productora de Efeonce filma al panadero junto al horno"
    },
    {
      "segment": "shot-02-insert",
      "title": "Inserto",
      "spec": "Detalle de manos · macro 100 mm · fijo, foco en la punta del lápiz · una lámpara rasante",
      "note": "El oficio en primer plano · manga del polo (oficina)",
      "plateRef": "ai-generations/2026-09-26_audiovisual/plates/V2-detalle.png",
      "alt": "Las manos de un director de arte marcan una prueba de impresión con lápiz rojo y una lupa"
    },
    {
      "segment": "shot-03-medium",
      "title": "Plano medio",
      "spec": "Sala del cliente · 50 mm · sobre el hombro del cliente, empuje lento · la pantalla es la luz",
      "note": "Documental · chaqueta sobre polo (reunión importante)",
      "plateRef": "ai-generations/2026-09-26_audiovisual/plates/V3-sala.png",
      "alt": "Una estratega de Efeonce presenta la curva de resultados al equipo del cliente"
    },
    {
      "segment": "shot-04-close",
      "title": "Cierre",
      "spec": "Reveal aprobado (3,6 s, con sonido) · masters de AXIS v1.1",
      "note": "La toma nunca lleva logo: firma el cierre",
      "plateRef": "masters/orbit-motion/v1.1/reveal/16x9/navy/efeonce-orbita-reveal_16x9_navy_cuadro-final.png",
      "alt": "El último cuadro del reveal: el logo de Efeonce con su eslogan sobre el navy de la marca"
    }
  ]
}

Resolverlo

pnpm surface:resolve -- --input docs/examples/surfaces/audiovisual-shot-plan-intent.json --out /tmp/surface-manifest.json
Manifest resuelto (axis.surface-composition.v1)
{
  "schema": "axis.surface-composition.v1",
  "contract": {
    "id": "efeonce.surface-composition",
    "version": "0.1.2",
    "lifecycle": "candidate"
  },
  "status": "resolved",
  "surface": "audiovisual",
  "format": "16x9",
  "role": "plan",
  "recipe": {
    "id": "shot-plan",
    "status": "approved",
    "role": "plan"
  },
  "use": null,
  "layout": null,
  "line": "growth",
  "theme": "dark",
  "palette": {
    "background": "#001a33",
    "accent": "#36c8bf",
    "ink": "#ffffff",
    "soft": "#e2e2e2"
  },
  "canvas": {
    "width": 1920,
    "height": 1080,
    "unit": "px",
    "format": "16x9"
  },
  "safeArea": null,
  "reserves": [],
  "type": {},
  "dominance": null,
  "steps": null,
  "signature": {
    "mode": "close-only",
    "photoCarriesLogo": false,
    "orbitDelegate": "surface-owned"
  },
  "timeline": {
    "sequence": "shots",
    "durationMs": 12600,
    "window": null,
    "enterMs": null,
    "segments": [
      {
        "id": "shot-01-wide",
        "fromMs": 0,
        "toMs": 3000,
        "lensMm": 35,
        "camera": "hand-held-slow-advance",
        "register": "documental"
      },
      {
        "id": "shot-02-insert",
        "fromMs": 3000,
        "toMs": 5000,
        "lensMm": 100,
        "camera": "fixed-macro"
      },
      {
        "id": "shot-03-medium",
        "fromMs": 5000,
        "toMs": 9000,
        "lensMm": 50,
        "camera": "over-the-shoulder-slow-push"
      },
      {
        "id": "shot-04-close",
        "fromMs": 9000,
        "toMs": 12600,
        "close": "reveal"
      }
    ],
    "close": {
      "piece": "reveal",
      "startMs": 9000,
      "durationMs": 3600,
      "audio": true
    },
    "audio": true,
    "reducedMotion": "final-frame"
  },
  "rules": [
    {
      "id": "efeonce-dark-ground",
      "text": "El fondo Efeonce (#001a33) se mantiene en toda pieza de línea; la línea sólo aporta el acento (operador, 2026-09-26)."
    },
    {
      "id": "one-sphere-per-piece",
      "text": "Una esfera por pieza: cierra la respuesta; nunca es viñeta ni adorno."
    },
    {
      "id": "one-orbit-per-piece",
      "text": "Una órbita por pieza o lámina: anillo, lente, indicador o medida, uno solo."
    },
    {
      "id": "accent-text-min-size",
      "text": "El acento nunca colorea texto de menos de 24 px: ahí el texto va en blanco o suave sobre oscuro (navy sobre claro); el acento marca con un elemento de 24 px o más o con el ícono."
    },
    {
      "id": "timings-from-tokens",
      "text": "Los tiempos salen de efeonceGraphicLine (surfaces.*.timeline y motion); nunca se escriben en el script."
    },
    {
      "id": "answer-dominates-3x",
      "text": "La respuesta mide al menos 3 veces la pregunta (type.answer.minRatioOverQuestion)."
    },
    {
      "id": "figures-with-source",
      "text": "Cifras sólo con fuente; precios siempre como marcador."
    },
    {
      "id": "isotype-composed",
      "text": "El isotipo en prendas generadas se compone desde @efeoncepro/axis-brand-assets; nunca el que dibuja el modelo."
    },
    {
      "id": "cine-only-nexa-or-proposal",
      "text": "Registro cine sólo con Nexa protagonista o en las recetas de cine del deck (photo.cine.recipes: proposal-cinematic y, desde el 2026-09-27, la portada de brochure, las contraportadas con foto, la sección de cine, la lente de la propuesta sobria desde el 2026-09-28 y, como excepción aprobada con personas del equipo en luz dramática, la sección partida); proporciones reales (cámara a ~2 m, 85 mm)."
    },
    {
      "id": "no-close-gaze-pairs",
      "text": "Nunca dos personas mirándose de cerca: se lee romántico (rechazo del operador, 2026-09-27)."
    },
    {
      "id": "semantic-reserves-only",
      "text": "Sin coordenadas libres: regiones semánticas y fracciones que salen de tokens."
    },
    {
      "id": "first-frame-passes-still-qa",
      "text": "El primer cuadro de cada plano es una foto que pasó el QA fijo (foto:validar); recién entonces se anima."
    },
    {
      "id": "one-light-one-register",
      "text": "Una luz con carácter y un registro por pieza; los planos se emparejan, no se mezclan."
    },
    {
      "id": "grade-matches-photo",
      "text": "El grade sólo empareja hacia la colorimetría de la foto, sin look propio; sombras sin azul."
    },
    {
      "id": "wardrobe-by-register",
      "text": "Uniforme por registro de escena; el emblema se revisa cuadro a cuadro (si el modelo lo reinventa, no se lee o se compone)."
    },
    {
      "id": "text-only-in-planned-reserves",
      "text": "Texto sólo en las reservas planeadas del plano, como cartela compuesta después, nunca generada."
    },
    {
      "id": "native-format-per-shot",
      "text": "Formato nativo por plano (cobertura 16:9, 9:16 y 1:1): no se recorta uno desde otro."
    },
    {
      "id": "signature-in-close-own-brand-only",
      "text": "La firma va en el cierre (sting o reveal), sólo en marca propia; nunca en piezas de clientes. La toma nunca lleva logo."
    }
  ],
  "references": [
    {
      "id": "shot-plan",
      "title": "Producción audiovisual · planos y reglas",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/shot-plan.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "Audiovisual.dc.html"
    }
  ],
  "delegates": {
    "orbit": [],
    "close": {
      "piece": "reveal",
      "format": "16x9",
      "durationMs": 3600,
      "startMs": 9000,
      "source": "efeonceGraphicLine.motion.pieces.reveal",
      "signsOnlyOwnBrand": true
    },
    "selection": [],
    "icons": [],
    "photo": null
  },
  "content": {
    "eyebrow": null,
    "question": null,
    "answer": [],
    "answerSphere": null,
    "body": null,
    "proof": null,
    "measure": null,
    "progress": null,
    "cta": null,
    "variants": null,
    "levels": null,
    "note": null,
    "panels": null,
    "figures": null,
    "nav": null,
    "title": "Producción audiovisual · un video de 12,6 s «Cómo trabajamos», cuadros clave generados",
    "frames": null,
    "chapter": null,
    "shots": [
      {
        "segment": "shot-01-wide",
        "fromMs": 0,
        "toMs": 3000,
        "lensMm": 35,
        "close": null,
        "title": "Plano general",
        "spec": "Terreno, panadería del cliente · 35 mm · cámara en mano, avanza despacio · luz del horno + ventana",
        "note": "Documental: nadie mira a cámara · gorra + hoodie (terreno)",
        "plateRef": "ai-generations/2026-09-26_audiovisual/plates/V1-terreno.png",
        "alt": "Una productora de Efeonce filma al panadero junto al horno"
      },
      {
        "segment": "shot-02-insert",
        "fromMs": 3000,
        "toMs": 5000,
        "lensMm": 100,
        "close": null,
        "title": "Inserto",
        "spec": "Detalle de manos · macro 100 mm · fijo, foco en la punta del lápiz · una lámpara rasante",
        "note": "El oficio en primer plano · manga del polo (oficina)",
        "plateRef": "ai-generations/2026-09-26_audiovisual/plates/V2-detalle.png",
        "alt": "Las manos de un director de arte marcan una prueba de impresión con lápiz rojo y una lupa"
      },
      {
        "segment": "shot-03-medium",
        "fromMs": 5000,
        "toMs": 9000,
        "lensMm": 50,
        "close": null,
        "title": "Plano medio",
        "spec": "Sala del cliente · 50 mm · sobre el hombro del cliente, empuje lento · la pantalla es la luz",
        "note": "Documental · chaqueta sobre polo (reunión importante)",
        "plateRef": "ai-generations/2026-09-26_audiovisual/plates/V3-sala.png",
        "alt": "Una estratega de Efeonce presenta la curva de resultados al equipo del cliente"
      },
      {
        "segment": "shot-04-close",
        "fromMs": 9000,
        "toMs": 12600,
        "lensMm": null,
        "close": "reveal",
        "title": "Cierre",
        "spec": "Reveal aprobado (3,6 s, con sonido) · masters de AXIS v1.1",
        "note": "La toma nunca lleva logo: firma el cierre",
        "plateRef": "masters/orbit-motion/v1.1/reveal/16x9/navy/efeonce-orbita-reveal_16x9_navy_cuadro-final.png",
        "alt": "El último cuadro del reveal: el logo de Efeonce con su eslogan sobre el navy de la marca"
      }
    ],
    "subtitles": null,
    "lines": null,
    "slogan": null
  },
  "adapterChecks": [
    "text-inside-its-reserve",
    "text-never-crosses-ring",
    "answer-dominates-3x-painted",
    "accent-text-min-size",
    "signature-where-the-surface-says",
    "subject-outside-text-reserve",
    "last-frame-is-static-fallback",
    "legibility-at-reading-distance"
  ],
  "issues": []
}

docs/examples/surfaces/audiovisual-subtitles-intent.json

{
  "contract": "efeonce.surface-composition",
  "version": "0.1.1",
  "surface": "audiovisual",
  "format": "16x9",
  "role": "subtitles",
  "recipe": "subtitles",
  "line": "growth",
  "theme": "dark",
  "subtitles": {
    "lines": [
      "«Ya no discutimos el gusto:",
      "vemos qué corte vende.»"
    ]
  }
}

Resolverlo

pnpm surface:resolve -- --input docs/examples/surfaces/audiovisual-subtitles-intent.json --out /tmp/surface-manifest.json
Manifest resuelto (axis.surface-composition.v1)
{
  "schema": "axis.surface-composition.v1",
  "contract": {
    "id": "efeonce.surface-composition",
    "version": "0.1.2",
    "lifecycle": "candidate"
  },
  "status": "resolved",
  "surface": "audiovisual",
  "format": "16x9",
  "role": "subtitles",
  "recipe": {
    "id": "subtitles",
    "status": "approved",
    "role": "subtitles"
  },
  "use": null,
  "layout": null,
  "line": "growth",
  "theme": "dark",
  "palette": {
    "background": "#001a33",
    "accent": "#36c8bf",
    "ink": "#ffffff",
    "soft": "#e2e2e2"
  },
  "canvas": {
    "width": 1920,
    "height": 1080,
    "unit": "px",
    "format": "16x9"
  },
  "safeArea": null,
  "reserves": [
    {
      "band": "subtitles",
      "side": "bottom",
      "fromTop": 0.8148,
      "align": "center"
    }
  ],
  "type": {
    "subtitle": {
      "family": "Poppins",
      "weight": 600,
      "px": 46,
      "lineHeight": 1.3,
      "tracking": null,
      "uppercase": false,
      "color": "#ffffff",
      "maxLines": 2,
      "box": false,
      "shadow": "0 2px 6px rgba(0,0,0,.55)"
    }
  },
  "dominance": null,
  "steps": null,
  "signature": {
    "mode": "close-only",
    "photoCarriesLogo": false,
    "orbitDelegate": "surface-owned"
  },
  "timeline": {
    "sequence": "texts",
    "durationMs": 13100,
    "window": [
      0,
      13100
    ],
    "enterMs": null,
    "segments": [],
    "close": {
      "piece": "reveal",
      "startMs": 9500,
      "durationMs": 3600,
      "audio": true
    },
    "audio": true,
    "reducedMotion": "final-frame"
  },
  "rules": [
    {
      "id": "efeonce-dark-ground",
      "text": "El fondo Efeonce (#001a33) se mantiene en toda pieza de línea; la línea sólo aporta el acento (operador, 2026-09-26)."
    },
    {
      "id": "one-sphere-per-piece",
      "text": "Una esfera por pieza: cierra la respuesta; nunca es viñeta ni adorno."
    },
    {
      "id": "one-orbit-per-piece",
      "text": "Una órbita por pieza o lámina: anillo, lente, indicador o medida, uno solo."
    },
    {
      "id": "accent-text-min-size",
      "text": "El acento nunca colorea texto de menos de 24 px: ahí el texto va en blanco o suave sobre oscuro (navy sobre claro); el acento marca con un elemento de 24 px o más o con el ícono."
    },
    {
      "id": "timings-from-tokens",
      "text": "Los tiempos salen de efeonceGraphicLine (surfaces.*.timeline y motion); nunca se escriben en el script."
    },
    {
      "id": "answer-dominates-3x",
      "text": "La respuesta mide al menos 3 veces la pregunta (type.answer.minRatioOverQuestion)."
    },
    {
      "id": "figures-with-source",
      "text": "Cifras sólo con fuente; precios siempre como marcador."
    },
    {
      "id": "isotype-composed",
      "text": "El isotipo en prendas generadas se compone desde @efeoncepro/axis-brand-assets; nunca el que dibuja el modelo."
    },
    {
      "id": "cine-only-nexa-or-proposal",
      "text": "Registro cine sólo con Nexa protagonista o en las recetas de cine del deck (photo.cine.recipes: proposal-cinematic y, desde el 2026-09-27, la portada de brochure, las contraportadas con foto, la sección de cine, la lente de la propuesta sobria desde el 2026-09-28 y, como excepción aprobada con personas del equipo en luz dramática, la sección partida); proporciones reales (cámara a ~2 m, 85 mm)."
    },
    {
      "id": "no-close-gaze-pairs",
      "text": "Nunca dos personas mirándose de cerca: se lee romántico (rechazo del operador, 2026-09-27)."
    },
    {
      "id": "semantic-reserves-only",
      "text": "Sin coordenadas libres: regiones semánticas y fracciones que salen de tokens."
    },
    {
      "id": "first-frame-passes-still-qa",
      "text": "El primer cuadro de cada plano es una foto que pasó el QA fijo (foto:validar); recién entonces se anima."
    },
    {
      "id": "one-light-one-register",
      "text": "Una luz con carácter y un registro por pieza; los planos se emparejan, no se mezclan."
    },
    {
      "id": "grade-matches-photo",
      "text": "El grade sólo empareja hacia la colorimetría de la foto, sin look propio; sombras sin azul."
    },
    {
      "id": "wardrobe-by-register",
      "text": "Uniforme por registro de escena; el emblema se revisa cuadro a cuadro (si el modelo lo reinventa, no se lee o se compone)."
    },
    {
      "id": "text-only-in-planned-reserves",
      "text": "Texto sólo en las reservas planeadas del plano, como cartela compuesta después, nunca generada."
    },
    {
      "id": "native-format-per-shot",
      "text": "Formato nativo por plano (cobertura 16:9, 9:16 y 1:1): no se recorta uno desde otro."
    },
    {
      "id": "signature-in-close-own-brand-only",
      "text": "La firma va en el cierre (sting o reveal), sólo en marca propia; nunca en piezas de clientes. La toma nunca lleva logo."
    },
    {
      "id": "subtitles-no-box",
      "text": "Subtítulos sin caja, dos líneas como máximo, centrados en el tercio inferior."
    }
  ],
  "references": [
    {
      "id": "subtitles",
      "title": "Escenas con texto · 06 subtítulos quemados",
      "status": "approved",
      "image": "/references/surfaces/audiovisual/subtitles.jpg",
      "canvasPage": "audiovisual",
      "canvasBoard": "AudiovisualTextos.dc.html"
    }
  ],
  "delegates": {
    "orbit": [],
    "close": {
      "piece": "reveal",
      "format": "16x9",
      "durationMs": 3600,
      "startMs": 9500,
      "source": "efeonceGraphicLine.motion.pieces.reveal",
      "signsOnlyOwnBrand": true
    },
    "selection": [],
    "icons": [],
    "photo": null
  },
  "content": {
    "eyebrow": null,
    "question": null,
    "answer": [],
    "answerSphere": null,
    "body": null,
    "proof": null,
    "measure": null,
    "progress": null,
    "cta": null,
    "variants": null,
    "levels": null,
    "note": null,
    "panels": null,
    "figures": null,
    "nav": null,
    "title": null,
    "frames": null,
    "chapter": null,
    "shots": null,
    "subtitles": {
      "lines": [
        "«Ya no discutimos el gusto:",
        "vemos qué corte vende.»"
      ],
      "maxLines": 2
    },
    "lines": null,
    "slogan": null
  },
  "adapterChecks": [
    "text-inside-its-reserve",
    "text-never-crosses-ring",
    "answer-dominates-3x-painted",
    "accent-text-min-size",
    "signature-where-the-surface-says",
    "subject-outside-text-reserve",
    "last-frame-is-static-fallback",
    "legibility-at-reading-distance"
  ],
  "issues": []
}

Todas las superficies en datos: /references/surfaces.json.

Qué no hacer

Lo que no se hace

Además de las reglas de todas las superficies, en el índice.