← Todas las superficies

La órbita por superficie · Motion

Se anima la línea, no la foto

Una pieza corta en bucle: una foto de oficio dentro de la lente, la voz que entra con el golpe de la esfera, la selección que encaja y el cierre de marca. La foto es material fijo que sólo se acerca un poco. Guía completa: docs/agent-composition/surfaces/motion.md.

motion
2 aprobadas
Token
surfaces.motion

01 · motion

Gráfica animada con foto fija

Redes, pantallas y presentaciones: la animación de la línea sobre una foto hecha para la lente, con el reveal del logo al final.

Formatos · efeonceGraphicLine.surfaces.motion.formats
FormatoMedidasCómo se lee
16x91920 × 1080 pxEn silencio y en autoplay: quien mira entra en cualquier momento, por eso el mensaje completo ocupa la mayor parte del tiempo.

Reglas de la superficie

Línea de tiempo de la superficie

Tramos · efeonceGraphicLine.surfaces.motion.timeline
TramoDesdeHastaDetalle del token
Anticipación: el anillo aparece chico y la esfera retrocede0 s0,3 s
La lente se abre y la foto se asienta0,3 s0,8 s
El arco corre y la esfera golpea0,8 s1,2 s
La voz entra con sobrepaso1,2 s1,8 sovershoot: default → letters · secondWordScaleOver: 0.12
La selección encaja1,8 s2,4 s
Sostén: sólo la foto se acerca; es el estático de respaldo2,4 s4,4 sphotoZoomMax: 0.1 · staticFallback: true
Cierre: el reveal del logo4,4 s5,4 s
Tapa final: logo y eslogan5,4 s8 s

Recetas aprobadas y pendientes

loop-lens-reveal

Aprobadapapel loop · formato 16x9
Motion · la animación (8 s, en bucle): foto hecha para la lente + reveal
Motion · la animación (8 s, en bucle): foto hecha para la lente + reveal
Motion · cuadros de la animación aprobada
Motion · cuadros de la animación aprobada

Animación en bucle: foto hecha para la lente, la voz con sobrepaso, la selección que encaja y el reveal del logo.

Token
efeonceGraphicLine.surfaces.motion.recipes['loop-lens-reveal']
Tablero del canvas
motion · MotionVideo
Valores del token
{
  "status": "approved",
  "role": "loop",
  "formats": [
    "16x9"
  ],
  "voice": {
    "mode": "question-answer"
  },
  "lens": {
    "piece": "wall"
  },
  "photo": {
    "madeForLens": true,
    "lensMm": 24,
    "lookAtLens": true,
    "scale": 1.1
  },
  "reserves": {
    "voice": {
      "side": "start",
      "inset": 0.07291666666666667,
      "fromTop": 0.24259259259259258
    },
    "answer": {
      "side": "start",
      "inset": 0.06666666666666667,
      "fromTop": 0.32592592592592595
    }
  },
  "type": {
    "question": {
      "px": 40
    },
    "answer": {
      "px": 170,
      "lineHeight": 0.92,
      "tracking": "-0.05em"
    }
  },
  "selection": {
    "target": "answer",
    "targetKind": "text",
    "anchor": "bottom-end",
    "participantKind": "role",
    "label": "Growth",
    "collaboratorScale": 1.6
  },
  "rules": [],
  "references": [
    {
      "id": "loop-lens-reveal",
      "title": "Motion · la animación (8 s, en bucle): foto hecha para la lente + reveal",
      "status": "approved",
      "image": "/references/surfaces/motion/loop-lens-reveal.jpg",
      "canvasPage": "motion",
      "canvasBoard": "MotionVideo.dc.html"
    },
    {
      "id": "loop-lens-reveal-frames",
      "title": "Motion · cuadros de la animación aprobada",
      "status": "approved",
      "image": "/references/surfaces/motion/loop-lens-reveal-frames.jpg",
      "canvasPage": "motion",
      "canvasBoard": "MotionVideo.dc.html"
    }
  ]
}

storyboard

Aprobadapapel storyboard · formato 16x9
Motion · cuadro a cuadro con el lenguaje de movimiento
Motion · cuadro a cuadro con el lenguaje de movimiento

Cuadro a cuadro con el lenguaje de movimiento: anticipación, la lente se abre, el arco golpea, entra la voz, encaja la selección, sostén y cierre.

Token
efeonceGraphicLine.surfaces.motion.recipes.storyboard
Tablero del canvas
motion · MotionStoryboard
Valores del token
{
  "status": "approved",
  "role": "storyboard",
  "formats": [
    "16x9"
  ],
  "voice": {
    "mode": "question-answer"
  },
  "voiceFrom": "loop-lens-reveal",
  "lens": {
    "piece": "wall"
  },
  "sheetTitle": true,
  "frames": {
    "per": "segment"
  },
  "rules": [],
  "references": [
    {
      "id": "storyboard",
      "title": "Motion · cuadro a cuadro con el lenguaje de movimiento",
      "status": "approved",
      "image": "/references/surfaces/motion/storyboard.jpg",
      "canvasPage": "motion",
      "canvasBoard": "MotionStoryboard.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/motion-loop-lens-reveal-intent.json

{
  "contract": "efeonce.surface-composition",
  "version": "0.1.1",
  "surface": "motion",
  "format": "16x9",
  "role": "loop",
  "recipe": "loop-lens-reveal",
  "line": "growth",
  "theme": "dark",
  "voice": {
    "question": "¿Tu marketing mide lo que vende?",
    "answer": [
      "Ahora",
      "sí"
    ]
  },
  "timeline": {
    "close": "reveal"
  },
  "photo": {
    "register": "respuesta",
    "subject": "person",
    "plateRef": "ai-generations/2026-09-26_web-movil/plates/M1-avanza-polo.png",
    "alt": "Una directora de cuentas con el polo de Efeonce avanza hacia la cámara y la mira",
    "native": "4:7",
    "focus": {
      "xOfWidth": 0.456,
      "yOfHeight": 0.2372
    }
  },
  "selection": {
    "target": "answer",
    "label": "Growth",
    "participantKind": "role"
  }
}

Resolverlo

pnpm surface:resolve -- --input docs/examples/surfaces/motion-loop-lens-reveal-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": "motion",
  "format": "16x9",
  "role": "loop",
  "recipe": {
    "id": "loop-lens-reveal",
    "status": "approved",
    "role": "loop"
  },
  "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",
    "fps": 30,
    "render": {
      "width": 960,
      "height": 540
    },
    "codec": "h264",
    "pixelFormat": "yuv420p",
    "audio": false
  },
  "safeArea": null,
  "reserves": [
    {
      "band": "voice",
      "side": "start",
      "inset": 0.0729,
      "fromTop": 0.2426
    },
    {
      "band": "answer",
      "side": "start",
      "inset": 0.0667,
      "fromTop": 0.3259
    },
    {
      "band": "lens",
      "region": "center",
      "circle": {
        "cxOfWidth": 0.599,
        "cyOfHeight": 0.3889,
        "rOfHeight": 0.363
      },
      "source": "pieces.lens.wall"
    }
  ],
  "type": {
    "question": {
      "family": "Poppins",
      "weight": 300,
      "px": 40,
      "lineHeight": null,
      "tracking": null,
      "uppercase": false,
      "color": "#ffffff"
    },
    "answer": {
      "family": "Bricolage Grotesque",
      "weight": 760,
      "px": 170,
      "lineHeight": 0.92,
      "tracking": "-0.05em",
      "uppercase": false,
      "color": "#ffffff"
    }
  },
  "dominance": {
    "ratio": 4.25,
    "min": 3,
    "ok": true
  },
  "steps": null,
  "signature": {
    "mode": "close-only",
    "photoCarriesLogo": false,
    "orbitDelegate": "surface-owned"
  },
  "timeline": {
    "durationMs": 8000,
    "loop": true,
    "audio": false,
    "segments": [
      {
        "id": "anticipation",
        "fromMs": 0,
        "toMs": 300
      },
      {
        "id": "lens-opens",
        "fromMs": 300,
        "toMs": 800
      },
      {
        "id": "arc-runs-sphere-hits",
        "fromMs": 800,
        "toMs": 1200
      },
      {
        "id": "voice-enters",
        "fromMs": 1200,
        "toMs": 1800,
        "overshoot": [
          {
            "key": "default",
            "value": 1.2
          },
          {
            "key": "letters",
            "value": 1.6
          }
        ],
        "secondWordScaleOver": 0.12
      },
      {
        "id": "selection-settles",
        "fromMs": 1800,
        "toMs": 2400
      },
      {
        "id": "hold",
        "fromMs": 2400,
        "toMs": 4400,
        "photoZoomMax": 0.1,
        "staticFallback": true
      },
      {
        "id": "close-reveal",
        "fromMs": 4400,
        "toMs": 5400
      },
      {
        "id": "end-card",
        "fromMs": 5400,
        "toMs": 8000
      }
    ],
    "close": {
      "piece": "reveal",
      "startMs": 4400,
      "durationMs": 3600
    },
    "crossfadeMs": 250,
    "curves": {
      "arrive": "emphasized",
      "transform": "standard",
      "exit": "emphasizedAccelerate"
    },
    "cameraZoom": "log",
    "staticFallback": "hold",
    "reducedMotion": "static-fallback"
  },
  "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": "photo-passes-still-qa",
      "text": "La foto es material fijo: pasa el QA de foto fija antes de animar."
    },
    {
      "id": "animate-the-line-not-the-photo",
      "text": "Se anima la línea (arco, esfera, halo) y la voz; la foto no."
    },
    {
      "id": "photo-zoom-max-10pct-log",
      "text": "La foto sólo se acerca, dentro de su lente o a sangre: hasta 10 %, en escala logarítmica, nunca mientras entra la voz."
    },
    {
      "id": "message-80pct-of-time",
      "text": "El mensaje completo ocupa al menos el 80 % del tiempo."
    },
    {
      "id": "last-frame-static-fallback",
      "text": "El último cuadro (o el sostén) es el estático de respaldo completo y la versión con movimiento reducido."
    },
    {
      "id": "no-audio-outdoor",
      "text": "En vía pública, sin audio. Con sonido, sólo el golpe sintetizado."
    },
    {
      "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": "no-generated-animation",
      "text": "Nunca se genera la animación con un modelo de video ni paralaje falso sobre la foto."
    }
  ],
  "references": [
    {
      "id": "loop-lens-reveal",
      "title": "Motion · la animación (8 s, en bucle): foto hecha para la lente + reveal",
      "status": "approved",
      "image": "/references/surfaces/motion/loop-lens-reveal.jpg",
      "canvasPage": "motion",
      "canvasBoard": "MotionVideo.dc.html"
    },
    {
      "id": "loop-lens-reveal-frames",
      "title": "Motion · cuadros de la animación aprobada",
      "status": "approved",
      "image": "/references/surfaces/motion/loop-lens-reveal-frames.jpg",
      "canvasPage": "motion",
      "canvasBoard": "MotionVideo.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": "Ahora sí"
            },
            {
              "kind": "lens",
              "id": "lens",
              "photoId": "ai-generations/2026-09-26_web-movil/plates/M1-avanza-polo.png",
              "alt": "Una directora de cuentas con el polo de Efeonce avanza hacia la cámara y la mira",
              "region": "center"
            }
          ]
        }
      }
    ],
    "close": {
      "piece": "reveal",
      "format": "16x9",
      "durationMs": 3600,
      "startMs": 4400,
      "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": "Growth",
              "participantKind": "role"
            }
          ]
        },
        "collaboratorScale": 1.6,
        "targetKind": "text"
      }
    ],
    "icons": [],
    "photo": {
      "madeForLens": true,
      "lensMm": 24,
      "lookAtLens": true,
      "scale": 1.1,
      "register": "respuesta",
      "subject": "person",
      "plateRef": "ai-generations/2026-09-26_web-movil/plates/M1-avanza-polo.png",
      "alt": "Una directora de cuentas con el polo de Efeonce avanza hacia la cámara y la mira",
      "native": "4:7",
      "focus": {
        "xOfWidth": 0.456,
        "yOfHeight": 0.2372
      },
      "emblem": "compose-from-axis-brand-assets"
    }
  },
  "content": {
    "eyebrow": null,
    "question": "¿Tu marketing mide lo que vende?",
    "answer": [
      "Ahora",
      "sí"
    ],
    "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/motion-storyboard-intent.json

{
  "contract": "efeonce.surface-composition",
  "version": "0.1.1",
  "surface": "motion",
  "format": "16x9",
  "role": "storyboard",
  "recipe": "storyboard",
  "line": "growth",
  "theme": "dark",
  "voice": {
    "question": "¿Tu marketing mide lo que vende?",
    "answer": [
      "Ahora",
      "sí"
    ]
  },
  "title": "Motion · 8 s con foto fija · el lenguaje de movimiento de la órbita, cuadro a cuadro",
  "frames": [
    {
      "segment": "anticipation",
      "title": "Anticipación",
      "caption": "Navy vacío. El anillo aparece chico y la esfera retrocede antes de salir."
    },
    {
      "segment": "lens-opens",
      "title": "La lente se abre",
      "caption": "El círculo crece y descubre la foto: la escena entra por la lente, rápido y con curva de llegada."
    },
    {
      "segment": "arc-runs-sphere-hits",
      "title": "El arco corre y la esfera golpea",
      "caption": "Tramo rápido con estela; la esfera llega con sobrepaso y un pulso de impacto con eco."
    },
    {
      "segment": "voice-enters",
      "title": "La voz entra con sobrepaso",
      "caption": "Pregunta primero; «Ahora» ya asentó; «sí» llega un 12 % más grande y se asienta."
    },
    {
      "segment": "selection-settles",
      "title": "La selección encaja",
      "caption": "Los corchetes de AXIS se ajustan a la respuesta y entra el cursor de Growth. Un protagonista a la vez."
    },
    {
      "segment": "hold",
      "title": "Sostén",
      "caption": "Todo quieto salvo la foto, que respira dentro de la lente (hasta 10 %). Este cuadro es el estático de respaldo."
    },
    {
      "segment": "close-reveal",
      "title": "Cierre: reveal",
      "caption": "El reveal aprobado v1.1, el mismo cierre del audiovisual: la nave entra en su órbita y se asienta."
    },
    {
      "segment": "end-card",
      "title": "Tapa final",
      "caption": "Logo con el eslogan: la tapa de cierre del reveal. Con sonido, el golpe del lenguaje de movimiento."
    }
  ],
  "photo": {
    "register": "respuesta",
    "subject": "person",
    "plateRef": "ai-generations/2026-09-26_web-movil/plates/M1-avanza-polo.png",
    "alt": "Una directora de cuentas con el polo de Efeonce avanza hacia la cámara y la mira",
    "native": "4:7",
    "focus": {
      "xOfWidth": 0.456,
      "yOfHeight": 0.2372
    }
  }
}

Resolverlo

pnpm surface:resolve -- --input docs/examples/surfaces/motion-storyboard-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": "motion",
  "format": "16x9",
  "role": "storyboard",
  "recipe": {
    "id": "storyboard",
    "status": "approved",
    "role": "storyboard"
  },
  "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",
    "fps": 30,
    "render": {
      "width": 960,
      "height": 540
    },
    "codec": "h264",
    "pixelFormat": "yuv420p",
    "audio": false
  },
  "safeArea": null,
  "reserves": [
    {
      "band": "voice",
      "side": "start",
      "inset": 0.0729,
      "fromTop": 0.2426
    },
    {
      "band": "answer",
      "side": "start",
      "inset": 0.0667,
      "fromTop": 0.3259
    },
    {
      "band": "lens",
      "region": "center",
      "circle": {
        "cxOfWidth": 0.599,
        "cyOfHeight": 0.3889,
        "rOfHeight": 0.363
      },
      "source": "pieces.lens.wall"
    }
  ],
  "type": {
    "question": {
      "family": "Poppins",
      "weight": 300,
      "px": 40,
      "lineHeight": null,
      "tracking": null,
      "uppercase": false,
      "color": "#ffffff"
    },
    "answer": {
      "family": "Bricolage Grotesque",
      "weight": 760,
      "px": 170,
      "lineHeight": 0.92,
      "tracking": "-0.05em",
      "uppercase": false,
      "color": "#ffffff"
    }
  },
  "dominance": {
    "ratio": 4.25,
    "min": 3,
    "ok": true
  },
  "steps": null,
  "signature": {
    "mode": "close-only",
    "photoCarriesLogo": false,
    "orbitDelegate": "surface-owned"
  },
  "timeline": {
    "durationMs": 8000,
    "loop": true,
    "audio": false,
    "segments": [
      {
        "id": "anticipation",
        "fromMs": 0,
        "toMs": 300
      },
      {
        "id": "lens-opens",
        "fromMs": 300,
        "toMs": 800
      },
      {
        "id": "arc-runs-sphere-hits",
        "fromMs": 800,
        "toMs": 1200
      },
      {
        "id": "voice-enters",
        "fromMs": 1200,
        "toMs": 1800,
        "overshoot": [
          {
            "key": "default",
            "value": 1.2
          },
          {
            "key": "letters",
            "value": 1.6
          }
        ],
        "secondWordScaleOver": 0.12
      },
      {
        "id": "selection-settles",
        "fromMs": 1800,
        "toMs": 2400
      },
      {
        "id": "hold",
        "fromMs": 2400,
        "toMs": 4400,
        "photoZoomMax": 0.1,
        "staticFallback": true
      },
      {
        "id": "close-reveal",
        "fromMs": 4400,
        "toMs": 5400
      },
      {
        "id": "end-card",
        "fromMs": 5400,
        "toMs": 8000
      }
    ],
    "close": {
      "piece": "reveal",
      "startMs": 4400,
      "durationMs": 3600
    },
    "crossfadeMs": 250,
    "curves": {
      "arrive": "emphasized",
      "transform": "standard",
      "exit": "emphasizedAccelerate"
    },
    "cameraZoom": "log",
    "staticFallback": "hold",
    "reducedMotion": "static-fallback"
  },
  "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": "photo-passes-still-qa",
      "text": "La foto es material fijo: pasa el QA de foto fija antes de animar."
    },
    {
      "id": "animate-the-line-not-the-photo",
      "text": "Se anima la línea (arco, esfera, halo) y la voz; la foto no."
    },
    {
      "id": "photo-zoom-max-10pct-log",
      "text": "La foto sólo se acerca, dentro de su lente o a sangre: hasta 10 %, en escala logarítmica, nunca mientras entra la voz."
    },
    {
      "id": "message-80pct-of-time",
      "text": "El mensaje completo ocupa al menos el 80 % del tiempo."
    },
    {
      "id": "last-frame-static-fallback",
      "text": "El último cuadro (o el sostén) es el estático de respaldo completo y la versión con movimiento reducido."
    },
    {
      "id": "no-audio-outdoor",
      "text": "En vía pública, sin audio. Con sonido, sólo el golpe sintetizado."
    },
    {
      "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": "no-generated-animation",
      "text": "Nunca se genera la animación con un modelo de video ni paralaje falso sobre la foto."
    }
  ],
  "references": [
    {
      "id": "storyboard",
      "title": "Motion · cuadro a cuadro con el lenguaje de movimiento",
      "status": "approved",
      "image": "/references/surfaces/motion/storyboard.jpg",
      "canvasPage": "motion",
      "canvasBoard": "MotionStoryboard.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": "Ahora sí"
            },
            {
              "kind": "lens",
              "id": "lens",
              "photoId": "ai-generations/2026-09-26_web-movil/plates/M1-avanza-polo.png",
              "alt": "Una directora de cuentas con el polo de Efeonce avanza hacia la cámara y la mira",
              "region": "center"
            }
          ]
        }
      }
    ],
    "close": {
      "piece": "reveal",
      "format": "16x9",
      "durationMs": 3600,
      "startMs": 4400,
      "source": "efeonceGraphicLine.motion.pieces.reveal",
      "signsOnlyOwnBrand": true
    },
    "selection": [],
    "icons": [],
    "photo": {
      "register": "respuesta",
      "subject": "person",
      "plateRef": "ai-generations/2026-09-26_web-movil/plates/M1-avanza-polo.png",
      "alt": "Una directora de cuentas con el polo de Efeonce avanza hacia la cámara y la mira",
      "native": "4:7",
      "focus": {
        "xOfWidth": 0.456,
        "yOfHeight": 0.2372
      },
      "emblem": "compose-from-axis-brand-assets"
    }
  },
  "content": {
    "eyebrow": null,
    "question": "¿Tu marketing mide lo que vende?",
    "answer": [
      "Ahora",
      "sí"
    ],
    "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": "Motion · 8 s con foto fija · el lenguaje de movimiento de la órbita, cuadro a cuadro",
    "frames": [
      {
        "segment": "anticipation",
        "title": "Anticipación",
        "caption": "Navy vacío. El anillo aparece chico y la esfera retrocede antes de salir.",
        "fromMs": 0,
        "toMs": 300
      },
      {
        "segment": "lens-opens",
        "title": "La lente se abre",
        "caption": "El círculo crece y descubre la foto: la escena entra por la lente, rápido y con curva de llegada.",
        "fromMs": 300,
        "toMs": 800
      },
      {
        "segment": "arc-runs-sphere-hits",
        "title": "El arco corre y la esfera golpea",
        "caption": "Tramo rápido con estela; la esfera llega con sobrepaso y un pulso de impacto con eco.",
        "fromMs": 800,
        "toMs": 1200
      },
      {
        "segment": "voice-enters",
        "title": "La voz entra con sobrepaso",
        "caption": "Pregunta primero; «Ahora» ya asentó; «sí» llega un 12 % más grande y se asienta.",
        "fromMs": 1200,
        "toMs": 1800
      },
      {
        "segment": "selection-settles",
        "title": "La selección encaja",
        "caption": "Los corchetes de AXIS se ajustan a la respuesta y entra el cursor de Growth. Un protagonista a la vez.",
        "fromMs": 1800,
        "toMs": 2400
      },
      {
        "segment": "hold",
        "title": "Sostén",
        "caption": "Todo quieto salvo la foto, que respira dentro de la lente (hasta 10 %). Este cuadro es el estático de respaldo.",
        "fromMs": 2400,
        "toMs": 4400
      },
      {
        "segment": "close-reveal",
        "title": "Cierre: reveal",
        "caption": "El reveal aprobado v1.1, el mismo cierre del audiovisual: la nave entra en su órbita y se asienta.",
        "fromMs": 4400,
        "toMs": 5400
      },
      {
        "segment": "end-card",
        "title": "Tapa final",
        "caption": "Logo con el eslogan: la tapa de cierre del reveal. Con sonido, el golpe del lenguaje de movimiento.",
        "fromMs": 5400,
        "toMs": 8000
      }
    ],
    "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": []
}

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.