TrainBeyondEspañolEnglish

TrainBeyond — Propuesta Interactiva / Interactive Proposal

---

ESPAÑOL

1. Qué es

La propuesta interactiva es la propuesta comercial de TrainBeyond convertida en una experiencia: una página web privada por cliente donde una presentadora virtual con voz recorre la propuesta sección por sección, responde preguntas en vivo, y donde el cliente entra a una escena 3D de su propia planta u operación para ver, de pie y a escala real, lo que el entrenamiento le va a dar. La misma página funciona en computadora, teléfono, visor de realidad virtual (Meta Quest) y, con passthrough, en realidad aumentada dentro de la sala del cliente.

Todo sale de tres cosas:

PiezaQuién la haceCon qué
El texto de la propuestaventas, con ayuda de la IAfuentes del cliente en Google Drive + un Google Doc editable
La escena 3D (opcional pero es lo que vende)el equipo de diseño 3Dun archivo .blend o .fbx con las convenciones de nombres de este documento
La publicaciónoperacionescomandos en Google Chat (/gen-proposal, /audit-showcase)

El resultado es una URL estable por unidad (código de 3 letras, p. ej. FCA) protegida por un código de acceso que se le da al cliente. Republicar sobrescribe esa misma URL.

2. Qué ve y hace el cliente

2.1 Entrar

El cliente abre el enlace y escribe su código de acceso (dura 60 días; el navegador lo recuerda 7 días). Dentro, la galería muestra los paneles de la propuesta en un anillo alrededor de una maqueta de la escena, y la presentadora empieza a hablar.

2.2 La presentación y la guía de voz

2.3 Dentro de la escena

AcciónComputadoraVisor VR
Entrar a la escenaclic en la maquetabotón Enter VR
Mirararrastrar con el ratóngirar la cabeza
Caminarflechas (el suelo se sigue: escalones, rampas)palanca; teletransporte apuntando al suelo
Cambiar de estaciónclic en el marcador numeradoapuntar al marcador y gatillo
Vista de pájarobarra espaciadora—
Cambiar de vista (tercera / primera persona / dron)V—
Activar un punto interactivo cercanoE, o clic en el rombogatillo sobre el rombo
Pasar imagen en una pantallaclic en la pantallagatillo
Hablar con un personajeE cerca de él, o clicgatillo
Pulsar un botón / girar una perilla / mover una palanca de la máquinaclic / arrastrar o rueda / arrastrargatillo / gatillo sostenido y subir o bajar la mano o usar el stick / gatillo sostenido y el stick
Abrir un formularioclic en el portapapelesse llena desde un teléfono (?clipboard)
SalirEsc—

Con un Avatar entregado, el cliente recorre la escena como un personaje (tercera persona por defecto); en VR ve su propio cuerpo del cuello hacia abajo y, con manos rastreadas, sus manos reales mueven las del avatar.

2.4 Direcciones especiales

DirecciónPara qué
https://…/FCA/la propuesta
https://…/FCA/?clipboarden un teléfono o tableta: los formularios de la escena, para llenarlos mientras otro los ve en el visor
https://…/FCA/?displayen una computadora: comparte su pantalla hacia los monitores Display_ de la escena (misma red)
https://…/FCA/?browsesin presentación; solo la escena y la guía

2.5 Realidad aumentada

En un visor con passthrough, Ver en tu sala (RA) coloca la maqueta sobre una mesa real. Con un personaje entregado (--character), el botón Practicar en tu sala (RA) pone a esa persona a tamaño real en la sala del cliente, con una pantalla delante, para practicar una conversación.

3. Cómo se produce una propuesta

3.1 Fuentes en Google Drive

Cada unidad tiene su carpeta bajo la raíz de ventas (Sales Drive). Lo que hay ahí alimenta el texto, la guía y la escena:

QuéDónde / cómo se reconocePara qué sirve
Documentos del cliente, notas de reunión, imágenescarpetas de la unidad; la carpeta da la etiqueta (from-client, meeting-notes…)el borrador de la propuesta y el contexto de la guía
Temas del recorridoun Doc cuyo nombre contenga scene topics o temas del recorridouna frase por estación que la guía desarrolla al llegar
Escena 3Del archivo que se pasa a --showcasela maqueta y la vista interior
Avatar presentadorcarpeta con export FBX de Character Creator 4, pasada a --avatarla presentadora en 3D
Personaje para practicararchivos pasados a --character, --persona, --idle, --talkuna persona con la que el cliente conversa
Páginas de formulariosarchivos .html en una carpeta llamada formslos portapapeles Clipboard_ de la escena
Videos de ejemplocarpeta compartida video-samples / trainbeyondla galería de ejemplos

3.2 Los comandos

Se escriben en Google Chat, en el espacio de Flow Manager. CODIGO es el código de la unidad: 3 caracteres alfanuméricos.

Paso 1 — generar el borrador

/gen-proposal FCA --es
/gen-proposal FCA --es --high

Genera con IA un borrador y lo guarda como Google Doc "FCA Proposal" en la carpeta de ventas de la unidad. --es fija el idioma de la propuesta (el predeterminado es inglés); --high pide un borrador más completo. Volver a correr este paso regenera el Doc y borra las ediciones.

Paso 2 — editar el Doc

Lo que quede en el Doc es lo que se publica. Dentro de una sección se pueden poner líneas especiales:

<<panel-image: https://drive.google.com/file/d/1AbC.../view | Vista de la línea de corte>>
<<examples: https://drive.google.com/file/d/1Vid1.../view | https://drive.google.com/file/d/1Vid2.../view>>
<<examples-exclude: https://drive.google.com/file/d/1Vid3.../view>>
<<examples: none>>

Paso 3 — publicar

/gen-proposal FCA --es --publish
/gen-proposal FCA --es --publish --interactive

Publica el Doc tal cual (sin IA). --interactive publica además la experiencia 3D con la presentadora en vivo. Repite --es para que la narración y la guía hablen en el idioma correcto. La respuesta en el chat trae la URL y el código de acceso para el cliente.

La escena 3D

/audit-showcase https://drive.google.com/file/d/1AbC.../view --project FCA --es
/gen-proposal FCA --es --showcase https://drive.google.com/file/d/1AbC.../view
/gen-proposal FCA --es --publish --interactive --showcase https://drive.google.com/file/d/1AbC.../view
  1. Auditar primero (/audit-showcase): abre el archivo entregado, lo revisa y reporta en el chat. Es de solo lectura: no convierte ni publica nada. Pasa el mismo --project que la unidad.
  2. --showcase con el enlace al .blend, .fbx o .glb (o a una carpeta con uno): convierte el archivo, lo aloja y lo pone como maqueta y vista interior. Sin --publish republica la propuesta existente con la escena nueva; con --publish --interactive publica todo junto.
  3. Volver a entregar el mismo archivo sin cambios no reconvierte nada.

Avatar presentador

/gen-proposal FCA --es --avatar https://drive.google.com/drive/folders/1Fem.../

Carpeta de Drive con el export FBX de Character Creator 4. El nombre de la carpeta debe contener female o male: eso elige la voz. Sin --publish republica la propuesta existente con el avatar nuevo.

Personaje para practicar una conversación

/gen-proposal FCA --es --publish --interactive \
  --character https://drive.google.com/file/d/1Alej.../view \
  --persona https://docs.google.com/document/d/1Pers.../edit \
  --idle https://drive.google.com/file/d/1Idle.../view \
  --talk https://drive.google.com/file/d/1Talk.../view

Ejemplo de Doc de persona:

Nombre: Alejandra
Género: Femenino
Persona: Recepcionista del hotel, 8 años en el puesto, amable pero firme con el protocolo.
Líneas:
Buenos días, bienvenido al Hotel Foliatti, ¿tiene reservación?
El check-in es a partir de las 15:00.

Otros

/gen-proposal --help
/audit-showcase --help
/flow status --project FCA

3.3 Qué devuelve una publicación

En el chat: fuentes usadas, trabajos de imagen, la URL de la propuesta interactiva y el código de acceso. Cada unidad tiene una sola URL; republicar la reemplaza en el momento, sin interrumpir a quien la tenga abierta.

4. Convenciones de nombres — referencia rápida

El visor no se configura: lee los nombres de los objetos y de las acciones del archivo de Blender. Lo que no coincide con ninguna convención es escenografía normal. Los nombres se comparan sin espacios sobrantes y sin distinguir mayúsculas; el separador puede ser _ o ..

NombreTipoQué haceEjemplo
Station_NN_Nombreempty en el pisopunto de pie; NN ordena; se entra por el menor; su −Y mira hacia el frenteStation_01_Recepcion, Station_02_Linea_De_Corte
Seat_Nombreempty a la altura de los ojospunto sentado (cabina, silla de control); vista limitadaSeat_Cabina_Grua
Skyboxmalla (domo invertido)el cielo y la luz ambiente; oculto en la maquetaSkybox
Sunluz tipo Sundirección y color de las sombras (la intensidad la pone el visor)Sun
Loop_Nombreacciónanimación ambiental en ciclo mientras el cliente está dentroLoop_Transportador, Loop_Antorcha
Avatar + Idle, Walkarmature + accionesel cliente recorre la escena como ese personajeAvatar, Avatar_Eyes (empty opcional a la altura de los ojos)
Hotspot_X / Play_X / Act_Xempty / acción de escena / clip del avatarinteracción: ancla donde se para, el equipo moviéndose, el gesto humanoHotspot_Abrir_Valvula, Play_Abrir_Valvula, Act_Abrir_Valvula (Act_Operate = gesto genérico)
Focus_Nombreobjeto o emptylo que la maqueta encuadra cuando el terreno es enormeFocus_Avion
Screen_Nombre_NNmallas apiladaspantalla con imágenes en secuencia; un clic pasa a la siguienteScreen_Menu_01, Screen_Menu_02
Display_Nombremalla 16:9monitor que muestra en vivo la pantalla compartida con ?displayDisplay_Registro
Character_Nombreempty o raízdónde está una persona con la que se puede hablar; propiedades persona, voice, genderCharacter_Alejandra
Clipboard_Nombremalla con forma del papelformulario que el cliente llena; propiedad form = página HTML (o fields)Clipboard_Inspeccion + form = corte.html
Show_Nombreobjetola guía lo ilumina al describirlo; propiedad note opcionalShow_Casco, Show_Guantes_De_Nitrilo
Button_Nombremalla o empty con mallasbotón de máquina; reproduce Play_Nombre; propiedad mode = once / toggle / holdButton_Arranque + Play_Arranque
Knob_Nombremalla o empty con mallasperilla; recorre Play_Nombre de mínimo a máximo; propiedad stepsKnob_Presion + Play_Presion
Joystick_Nombremalla o empty con mallaspalanca de dos ejes; mueve Play_Nombre_X y Play_Nombre_Y; propiedades mode (position / rate), sticky, speed, tiltJoystick_Pluma + Play_Pluma_X, Play_Pluma_Y

Propiedades personalizadas (Object Properties → Custom Properties) que el visor lee:

ObjetoPropiedadEjemplo
Station_ / Hotspot_note — tema de la estación que la guía desarrollaAquí se inspecciona cada rollo antes del corte
Show_note — una frase sobre el objetoProtegen de químicos
Character_persona, voice, genderRecepcionista, 8 años…, Kore, female
Clipboard_form (página HTML), fields (lista A; B; C...), notecorte.html · Nombre; Fecha; Observaciones...
Button_mode (once, toggle, hold), plays (otra acción)toggle · Play_Bomba
Knob_steps (posiciones fijas), plays5
Joystick_mode (position, rate), sticky (no vuelve al centro), speed (acción por segundo a tope), tilt (grados)rate · 1 · 0.5 · 20

Varios objetos en una acción: pistas NLA con el mismo nombre en cada objeto (Play_Arranque en el botón y en el pistón) se exportan como una sola animación. Así se hace que el botón se hunda y la máquina responda, o que la perilla gire y la aguja la siga.

5. Formularios (Clipboard_)

El formulario es una página HTML que escribe el diseñador: cualquier diseño, la hoja de la planta tal cual como tabla, estilos en línea, incluso un script que arme los renglones. Reglas:

  1. Cada casilla que el cliente llena es un <input>, <select> o <textarea> con name.
  2. El archivo va en la carpeta forms de las fuentes de la unidad en Drive (p. ej. corte.html).
  3. En Blender, el plano Clipboard_Inspeccion lleva la propiedad form = corte.html. Modélalo con la forma del papel (horizontal o vertical).

Ejemplo mínimo:

<!doctype html>
<html lang="es"><meta charset="utf-8">
<style>body{font:12px Arial;padding:10px} td,th{border:1px solid #333;padding:2px} input{width:100%;border:0}</style>
<body>
<h2>Inspección · Línea de corte</h2>
<label>O.T. <input name="ot"></label> <label>Fecha <input name="fecha" type="date"></label>
<table>
  <tr><th>#</th><th>Longitud</th><th>Defectos</th></tr>
  <tr><td>1</td><td><input name="fila1_longitud"></td><td><input name="fila1_defectos"></td></tr>
  <tr><td>2</td><td><input name="fila2_longitud"></td><td><input name="fila2_defectos"></td></tr>
</table>
</body></html>

Cómo se usa: en computadora, clic en el portapapeles abre la página en la propuesta; en visor o tableta, un teléfono abre …/FCA/?clipboard y ahí aparecen todos los formularios de la escena. Lo que se escribe aparece en el papel de todos los que están en la escena. Sin página, fields = Nombre; Fecha; Observaciones... genera un formulario sencillo (... = varias líneas). Ejemplos completos: docs/examples/clipboard-forms/ en el repositorio wrk-mgr.

6. Controles de máquina (Button_, Knob_)

  1. Nombra el control Button_Arranque o Knob_Presion (una malla, o un empty con las mallas del control debajo).
  2. Crea la acción Play_Arranque / Play_Presion con keyframes del control y de lo que mueve: el botón que se hunde y el pistón que sube; la perilla que gira y la aguja que la sigue.
  3. Exporta.
ControlComportamientoPropiedades
Button_reproduce la acción una vez al pulsarlomode = toggle: se repite hasta pulsarlo otra vez y vuelve al reposo · mode = hold: avanza mientras se mantiene y regresa al soltar · plays = Play_Otra para usar otra acción
Knob_recorre la acción: inicio = mínimo, fin = máximo; se gira arrastrando, con la rueda, o en VR con el gatillo sostenido subiendo/bajando la mano (o con el stick del control)steps = 5: posiciones fijas · plays
Joystick_dos ejes sobre Play_Nombre_X / Play_Nombre_Y (centro = mitad de la acción); la palanca se inclina sola; vuelve al centro al soltar; se mueve arrastrando o, en VR, con el gatillo sostenido y el stick del controlmode = rate: la acción avanza mientras se empuja y se queda al soltar (grúa, pluma) · speed = 0.5 · sticky = 1 · tilt = 20

La acción de una perilla es una pose por valor, sin ciclos. Un hotspot sigue siendo la opción cuando el avatar debe caminar hasta el equipo y hacer un gesto.

7. La auditoría (/audit-showcase)

Revisa el archivo entregado antes de importarlo. El reporte llega al chat en varios mensajes: resumen y luego hallazgos por severidad.

SeveridadHallazgos
🛑 Bloqueante (no importar)linked_libraries_missing, image_has_no_pixels, images_not_packed, no_entry_points, reserved_loop_prefix, avatar_idle_clip_missing, avatar_walk_clip_missing, scene_scale_suspect
⚠️ Advertencia (algo falta)hotspot_without_clip, act_without_hotspot, single_entry_point, skybox_not_emissive, backdrop_not_emissive, sun_not_directional, focus_frames_nothing, screen_frame_unnumbered, screen_frames_misaligned, screen_single_frame, character_without_persona, character_voice_unknown, character_not_rigged, clipboard_without_fields, clipboard_not_a_mesh, control_without_clip, control_not_a_mesh, mesh_without_material, names_with_stray_whitespace
💡 Notacutout_uses_alpha_blend, opaque_material_carries_alpha

Cada hallazgo trae en el chat qué es y cómo arreglarlo, en el idioma del --es.

8. Especificación completa de la escena

Audiencia: equipo de diseño 3D

Entregable: una escena interactiva por propuesta, mostrada dentro de la propuesta interactiva del cliente

Formato: .blend (Blender 4.x o 5.x hasta 5.2, preferido) o .fbx — entrega el archivo fuente; nosotros nos encargamos de toda la exportación y optimización

Novedades v1.1

Qué vas a construir

La escena aparece dos veces en la propuesta, desde el mismo archivo:

  1. Maqueta — un modelo a escala de mesa al centro de la galería de la propuesta, como la maqueta de un arquitecto. Es lo primero que ve el cliente.
  2. Vista interior — al hacer clic en la maqueta, el cliente entra dentro de la escena a escala real: de pie en los puntos que tú definas, sentado en puntos de vista que tú definas (cabina de vehículo, silla de control), o recorriéndola como un personaje (Avatar) en tercera o primera persona. La presentadora de IA narra mientras el cliente explora.

Diseña para ambas escalas. La escena debe verse atractiva como miniatura desde arriba Y sostenerse a la altura de los ojos desde cada punto de vista que coloques. Detalla lo que una persona de pie va a mirar; no detalles lo que nadie verá de cerca.

Requisitos obligatorios

ReglaDetalle
UnidadesMetros reales. 1 unidad de Blender = 1 m. Una puerta mide ~2.1 m, un barandal ~1.0 m.
Transformaciones aplicadasTodas las escalas aplicadas (Ctrl+A → All Transforms) antes de entregar.
MaterialesSolo Principled BSDF. Texturas procedurales horneadas a imágenes, máximo 2048×2048, y máximo ~24 imágenes de textura en total — usa atlas para props repetidos. La memoria de texturas es el recurso más escaso en los dispositivos objetivo.
AnimaciónAcciones con keyframes montadas en pistas NLA. Sin simulaciones físicas, telas ni partículas — hornéalas a keyframes si las necesitas.
Presupuesto de geometría≤ 600,000 triángulos en total (objetivo ~450 mil). Gasta triángulos donde el cliente va a estar parado; el Avatar (~20–40 mil) cuenta dentro del total.
Presupuesto de objetos≤ 150 mallas después de unir (une todo lo que comparta material) y ≤ 25 materiales únicos. Este límite decide los FPS más que los triángulos — gasta mallas y materiales como si fueran dinero: una escena de 600 mil triángulos en 120 mallas rinde mejor que una de 250 mil en 600.
AutocontenidoEmpaca todas las texturas en el archivo (File → External Data → Pack Resources). Sin bibliotecas vinculadas. Archivo empacado ≤ ~150 MB.

Nosotros comprimimos todo (geometría y texturas) después de la conversión — no necesitas optimizar el tamaño del archivo más allá de estos presupuestos.

Convenciones de nombres — cómo tu escena le habla al visor

El visor lee nombres de objetos y nombres de acciones (animaciones) para saber cómo comportarse. Los objetos que no coinciden con ninguna convención son escenografía normal.

Station_NN_Nombre — puntos de pie (empties)

Un lugar donde una persona puede pararse. Agrega un empty por ubicación, posicionado en el piso (nosotros subimos la cámara a la altura de los ojos automáticamente). La rotación del empty define la dirección inicial de la vista (su eje −Y es "adelante" — activa Display As: Arrows para verlo).

Seat_Nombre — puntos sentados (empties)

Una vista fija y sentada: cabina, grúa, silla de control. Posiciona el empty en el punto exacto de los ojos de la persona sentada (no en el piso). El visitante puede mirar alrededor desde ahí pero no moverse.

Skybox — el cielo (malla, opcional)

Una esfera o domo invertido grande, material emisivo, textura de cielo equirectangular, rodeando la escena. Se oculta mientras la escena es maqueta; se revela cuando el cliente entra. Si lo omites, el visor pone un cielo simple por defecto — uno real siempre se ve mejor.

La imagen del cielo va conectada a Emission, no a Base Color. El visor hornea el domo en un mapa de entorno dentro de una escena sin luces: un domo con la textura en Base Color sale negro y toda la escena queda a oscuras (así se entregó AER). /audit-showcase lo reporta como skybox_not_emissive.

Loop_Nombre — animación ambiental (nombres de acciones)

Toda acción cuyo nombre empiece con Loop_ se reproduce automáticamente, por siempre, cuando el cliente está dentro: Loop_Antorcha, Loop_Transportador, Loop_Trafico. Haz que el primer y último keyframe coincidan para que el ciclo sea continuo.

Avatar — el personaje del cliente (armature, opcional)

Un personaje que el cliente "encarna" al entrar: puede verlo en tercera persona (cámara al hombro), mirar por sus ojos en primera persona, o soltarlo y volar libre (modo dron, el comportamiento actual). Si la escena no trae Avatar, el visor funciona como hasta ahora — solo modo dron.

Hotspot_Nombre — interacciones (empties) — el trío de nombres

Un punto donde el cliente hace algo: abrir una válvula, pulsar un botón, revisar un panel. Una interacción se define por hasta tres piezas que comparten exactamente el mismo nombre:

PiezaTipoPapel
Hotspot_AbrirValvulaempty en la escenaEl ancla (obligatoria): posición y orientación exactas donde una persona se pararía a hacerlo, con −Y hacia el equipo.
Play_AbrirValvulaacción de la escenaEl lado del equipo: el volante gira, el panel se enciende. Se reproduce una vez al activarse.
Act_AbrirValvulaclip del avatarEl lado humano: el gesto de alcanzar y girar.

Comportamiento del visor: al acercarse (~2.5 m) aparece el aviso; al activar, el avatar se desliza al ancla y Act_ + Play_ se reproducen a la vez; después vuelve a Idle. Por eso el ancla importa: colócala exactamente donde deberían estar los pies y la mano llegará al equipo. Sin avatar (o en modo dron), hacer clic en el marcador reproduce solo Play_ — los hotspots funcionan en toda escena, con o sin avatar.

Focus_Nombre — el sujeto de la maqueta (objeto o empty, opcional)

Dile al visor qué es lo que la maqueta muestra. En la galería la escena se ve como maqueta: el visor la escala para que su extensión más grande mida unos 4 m. Si la escena necesita mucho más entorno que sujeto — la cabina de FER tiene ventanas al frente y atrás, así que las vías y el piso deben correr lejos en ambos sentidos — el entorno se queda con esa escala y el sujeto termina diminuto.

Screen_Nombre_NN — pantallas con imágenes en secuencia (mallas)

Un monitor, tablet o kiosco que muestra una serie de imágenes (las pantallas de un sistema de registro, por ejemplo). Modela la pantalla como un plano con la primera imagen y duplícalo en el mismo sitio una vez por imagen: Screen_Registro_01, Screen_Registro_02, … cada copia con su propia imagen en el material (conectada a Emission, para que se vea encendida con cualquier luz). El visor muestra solo la _01; un clic, un toque o el gatillo de VR sobre la pantalla pasa a la siguiente y, tras la última, vuelve a la primera.

Display_Nombre — pantalla en vivo (malla)

Un monitor que muestra, en vivo, la pantalla de una computadora: el programa real del cliente (su sistema de registro, por ejemplo) corriendo mientras el cliente practica frente al personaje. Modela el monitor como un plano de 16:9 con UV completo (la imagen ocupa todo el plano) y nómbralo Display_Registro. El material que le pongas es lo que se ve cuando nadie está compartiendo.

Character_Nombre — personas con las que se puede hablar (empty o raíz)

Una persona de la escena con la que el cliente practica una conversación real por voz: un huésped en la recepción, un cliente en la ventanilla. El personaje no se modela en la escena: el equipo de operaciones lo entrega en el comando de publicación, como el showcase:

/gen-proposal UNIDAD --publish --showcase <escena> --character <modelo> --persona <doc> --idle <clip> --talk <clip>

Tu parte en la escena es el lugar: un empty (o cualquier objeto) llamado Character_Nombre donde va la persona, con el mismo Nombre que el documento de persona, mirando hacia donde está el cliente. El visor pone ahí el modelo entregado y oculta el marcador. Al acercarse (~2,5 m) aparece el aviso E — 💬 Nombre; con E, un clic o el gatillo de VR empieza la conversación y la guía calla; termina con E, otro clic, alejándose (> 4 m) o cuando la persona se despide, y la guía comenta cómo fue.

Clipboard_Nombre — formularios que el cliente llena (malla, opcional)

Un portapapeles con un formulario que el cliente llena durante la práctica: el alta de un cliente, un reporte de incidente, la hoja de inspección de la planta. Modela el portapapeles como un plano con UV completo, con la forma del papel (vertical u horizontal), y nómbralo Clipboard_Registro. El material que le pongas es lo que se ve cuando nadie está en la escena; adentro, el visor dibuja el formulario con lo que se va escribiendo.

Show_Nombre — objetos que la guía señala uno por uno (objetos, opcional)

Para una estación con varios objetos que la guía explica de uno en uno — el EPP sobre una mesa, las herramientas de un banco —, nombra cada objeto Show_Nombre (Show_Casco, Show_Guantes_De_Nitrilo). Mientras la guía habla de un objeto, ese objeto brilla en naranja; al pasar al siguiente, el anterior se apaga.

Button_Nombre, Knob_Nombre y Joystick_Nombre — controles de una máquina (mallas, opcional)

Botones, perillas, palancas e indicadores que el cliente acciona directamente sobre el equipo: pulsa el botón de arranque y el transportador se mueve; gira la perilla de presión y la aguja del manómetro la sigue. No necesitan ancla ni avatar: se accionan donde esté el cliente, con un clic, con el gatillo del visor o con la mano.

Luces

Tu Skybox es la luz principal de la escena. El visor lo convierte en un mapa de entorno (IBL): de ahí sale toda la luz ambiental y todos los reflejos del metal. Es lo mismo que hace el "world" de Blender, y es la palanca más grande que tienes sobre cómo se ve la escena. Un cielo bien expuesto ilumina bien; un cielo plano u oscuro deja todo apagado.

El Sun decide hacia dónde caen las sombras. El visor toma su dirección y su color, no su intensidad: Blender exporta W/m² convertidos a lux y el visor los vuelve a reescalar, así que la intensidad no sobrevive el viaje de forma útil. El visor pone su propia intensidad, calibrada con la exposición. Orienta el Sun como quieras que caigan las sombras y no te preocupes por su "Strength".

Se usa el primer Sun (luz direccional) de la escena. Las demás luces (point/spot, un segundo sol) viajan en el archivo pero el visor no las enciende — aproxima su aporte con el cielo. Usa pocas (≤ 4 recomendado).

Tiene que ser una lámpara de tipo Sun: una luz Point o Area llamada "Sun" no cuenta (AER entregó un point de 17,8 millones de candelas y el visor lo ignoró: sin dirección de sol, sin sombras autoradas). /audit-showcase lo reporta como sun_not_directional.

El piso no fija la escala de la maqueta. En la galería la escena se muestra como maqueta: el visor escala la extensión más grande de la escena (sin contar Skybox y Avatar) a 4 m. Un piso o explanada mucho más grande que el sujeto se convierte en la maqueta entera y el sujeto queda diminuto (el avión de AER medía 0,8 m sobre una explanada de 185 m). Recorta el piso a la zona caminable, o — si la escena necesita ese entorno, como unas vías que deben verse largas desde la cabina — nombra el sujeto Focus_Nombre y el piso deja de contar. /audit-showcase lo reporta como diorama_fit_dominated.

Hasta 2026-08-14 esta sección decía que todas las luces iluminaban la vista interior. No era cierto: el conversor nunca las exportaba. Ya se corrigió.

Cómo usa el visor tu escena

Entrega y retroalimentación

Entrega el archivo igual que cualquier modelo de showcase (enlace de Drive al equipo de operaciones). El pipeline de publicación valida la escena automáticamente y reporta los problemas por nombre en la tarjeta de chat — p. ej. "Station_03 está 4.2 m sobre el piso — las estaciones van en el piso" o "la escena mide 17 m de ancho pero declara estaciones caminables — reescala a metros." Corrige y vuelve a entregar; republicar es barato y el modelo solo se reconvierte cuando el archivo realmente cambia.

Antes de importar nada, el equipo de operaciones puede pedir una revisión del archivo con /audit-showcase <enlace de Drive>: abre tu archivo sin convertirlo ni publicarlo y responde en el chat con lo que encontró — bibliotecas vinculadas que faltan, imágenes que Blender no pudo cargar, objetos ocultos que no llegarían a exportarse, nombres de clips fuera de convención, los presupuestos de la escena, y desde septiembre de 2026 también si el Sun es direccional, si el Skybox es emisivo y qué objeto fija la escala de la maqueta. Si algo no cuadra, lo sabrás en minutos y sin tocar la propuesta del cliente. La tarjeta muestra los primeros seis elementos afectados de cada hallazgo; el informe completo (todas las texturas con su tamaño y los materiales que las usan, objetos ocultos, estaciones contra su piso) está en el enlace al final de la tarjeta.

Dos casos se rechazan de inmediato, porque el cliente vería una escena vacía: un archivo sin geometría (lo que produce un archivo maestro cuyas bibliotecas vinculadas no se entregaron con él) y una textura sin píxeles (una imagen cuyo archivo Blender no pudo cargar). El mensaje nombra los objetos que sí llegaron, o los materiales afectados.

Lista de verificación antes de entregar

---

9. Para desarrolladores

ComponenteRepositorioQué hace
Flow Manager Client (Google Apps Script)flow-manager-clientlos comandos de chat, el borrador en Google Doc, los callbacks
flow-mgrflow-mgrgenera la propuesta, convierte y aloja la escena y los personajes, sesiones de voz (relay a Gemini Live), códigos de acceso, canal de formularios y pantallas
wrk-mgr · interactive_webwrk-mgrempaqueta la experiencia (el shell web: workers/interactive_web/app_shell) y la publica en el origen de propuestas
wrk-mgr · blenderwrk-mgrconvierte .blend/.fbx a glTF comprimido, audita escenas, convierte avatares
src-mgrsrc-mgrsincroniza las fuentes de Drive y sus etiquetas

Documentación de referencia en los repositorios: wrk-mgr/docs/proposal-scene-spec.md (esta especificación), wrk-mgr/docs/workers/interactive-proposal.md (el shell y su contrato en tiempo de ejecución), flow-mgr/docs/proposals.md y flow-mgr/docs/live-relay.md (publicación, auditoría, voz, formularios). Los cambios al shell se despliegan como worker Modal interactive_web y se publican a cada unidad al republicarla.

---

ENGLISH

1. What it is

The interactive proposal is TrainBeyond's sales proposal turned into an experience: a private web page per client where a voiced virtual presenter walks through the proposal section by section and answers questions live, and where the client steps into a 3D scene of their own plant or operation to see, standing at real scale, what the training will give them. The same page works on a computer, a phone, a VR headset (Meta Quest) and, with passthrough, in augmented reality inside the client's own room.

Everything comes from three things:

PieceWho makes itWith what
The proposal textsales, with AI helpthe client's sources in Google Drive + an editable Google Doc
The 3D scene (optional, but it is what sells)the 3D design teama .blend or .fbx file following the naming conventions in this document
PublishingoperationsGoogle Chat commands (/gen-proposal, /audit-showcase)

The result is one stable URL per unit (a 3-letter code such as FCA) protected by an access code given to the client. Republishing overwrites that same URL.

2. What the client sees and does

2.1 Getting in

The client opens the link and types the access code (valid 60 days; the browser remembers it for 7). Inside, the gallery shows the proposal's panels in a ring around a diorama of the scene, and the presenter starts talking.

2.2 The presentation and the voice guide

2.3 Inside the scene

ActionComputerVR headset
Enter the sceneclick the dioramaEnter VR button
Lookdrag with the mouseturn your head
Walkarrow keys (the ground is followed: steps, ramps)thumbstick; teleport by pointing at the floor
Change stationclick the numbered markerpoint at the marker and pull the trigger
Bird's-eye viewspace bar—
Change view (third / first person / drone)V—
Activate a nearby interactive pointE, or click the diamondtrigger on the diamond
Next image on a screenclick the screentrigger
Talk to a characterE near them, or clicktrigger
Press a machine button / turn a knob / move a joystickclick / drag or wheel / dragtrigger / hold the trigger and raise or lower the hand or use the thumbstick / hold the trigger and use the thumbstick
Open a formclick the clipboardfilled in from a phone (?clipboard)
LeaveEsc—

With a delivered Avatar, the client tours the scene as a character (third person by default); in VR they see their own body from the neck down and, with hand tracking, their real hands drive the avatar's.

2.4 Special addresses

AddressWhat for
https://…/FCA/the proposal
https://…/FCA/?clipboardon a phone or tablet: the scene's forms, to fill in while someone else sees them in the headset
https://…/FCA/?displayon a computer: shares its screen to the scene's Display_ monitors (same network)
https://…/FCA/?browseno presentation; just the scene and the guide

2.5 Augmented reality

On a headset with passthrough, View in your room (AR) places the diorama on a real table. With a delivered character (--character), Practise in your room (AR) puts that person life-size in the client's room, with a screen in front, to practise a conversation.

3. How a proposal is produced

3.1 Sources in Google Drive

Each unit has its folder under the sales root (Sales Drive). What is in there feeds the text, the guide and the scene:

WhatWhere / how it is recognisedWhat it feeds
Client documents, meeting notes, imagesthe unit's folders; the folder gives the label (from-client, meeting-notes…)the proposal draft and the guide's context
Tour topicsa Doc whose name contains scene topics or temas del recorridoone sentence per station the guide expands on arrival
3D scenethe file passed to --showcasethe diorama and the inside view
Presenter avatarfolder with a Character Creator 4 FBX export, passed to --avatarthe presenter in 3D
Practice characterfiles passed to --character, --persona, --idle, --talka person the client talks to
Form pages.html files in a folder named formsthe scene's Clipboard_ planes
Example videosshared video-samples / trainbeyond folderthe examples gallery

3.2 The commands

Typed in Google Chat, in the Flow Manager space. CODE is the unit code: 3 alphanumeric characters.

Step 1 — generate the draft

/gen-proposal FCA
/gen-proposal FCA --es --high

Generates a draft with AI and saves it as the Google Doc "FCA Proposal" in the unit's sales folder. --es fixes the proposal language as Spanish (default is English); --high asks for a more thorough draft. Running this step again regenerates the Doc and discards the edits.

Step 2 — edit the Doc

Whatever stays in the Doc is what ships. Inside a section you can add special lines:

<<panel-image: https://drive.google.com/file/d/1AbC.../view | Cutting line overview>>
<<examples: https://drive.google.com/file/d/1Vid1.../view | https://drive.google.com/file/d/1Vid2.../view>>
<<examples-exclude: https://drive.google.com/file/d/1Vid3.../view>>
<<examples: none>>

Step 3 — publish

/gen-proposal FCA --publish
/gen-proposal FCA --es --publish --interactive

Publishes the Doc verbatim (no AI). --interactive also publishes the 3D experience with the live presenter. Repeat --es so the narration and the guide speak the right language. The chat reply carries the URL and the access code for the client.

The 3D scene

/audit-showcase https://drive.google.com/file/d/1AbC.../view --project FCA
/gen-proposal FCA --showcase https://drive.google.com/file/d/1AbC.../view
/gen-proposal FCA --es --publish --interactive --showcase https://drive.google.com/file/d/1AbC.../view
  1. Audit first (/audit-showcase): opens the delivered file, inspects it and reports in chat. Read-only: nothing is converted or published. Pass the unit as --project.
  2. --showcase with the link to the .blend, .fbx or .glb (or a folder holding one): converts the file, hosts it and makes it the diorama and the inside view. Without --publish it republishes the existing proposal with the new scene; with --publish --interactive it publishes everything together.
  3. Delivering the same unchanged file again converts nothing.

Presenter avatar

/gen-proposal FCA --avatar https://drive.google.com/drive/folders/1Fem.../

A Drive folder with the Character Creator 4 FBX export. The folder name must contain female or male: that picks the voice. Without --publish it republishes the existing proposal with the new avatar.

A character to practise a conversation with

/gen-proposal FCA --publish --interactive \
  --character https://drive.google.com/file/d/1Alej.../view \
  --persona https://docs.google.com/document/d/1Pers.../edit \
  --idle https://drive.google.com/file/d/1Idle.../view \
  --talk https://drive.google.com/file/d/1Talk.../view

Example persona Doc:

Name: Alejandra
Gender: Female
Persona: Hotel receptionist, 8 years in the job, friendly but firm on protocol.
Lines:
Good morning, welcome to Hotel Foliatti, do you have a reservation?
Check-in starts at 3 pm.

Other

/gen-proposal --help
/audit-showcase --help
/flow status --project FCA

3.3 What a publish returns

In chat: the sources used, image jobs, the interactive proposal URL and the access code. Each unit has one URL; republishing replaces it in place, without interrupting anyone who has it open.

4. Naming conventions — quick reference

The viewer is not configured: it reads the object and action names in the Blender file. Anything that matches no convention is plain scenery. Names are compared trimmed and case-insensitively; the separator can be _ or ..

NameTypeWhat it doesExample
Station_NN_Nameempty on the floorstanding viewpoint; NN orders; entered at the lowest; its −Y faces forwardStation_01_Reception, Station_02_Cutting_Line
Seat_Nameempty at eye heightseated viewpoint (cab, control chair); limited lookSeat_Crane_Cab
Skyboxmesh (inverted dome)the sky and the ambient light; hidden in the dioramaSkybox
SunSun-type lightdirection and colour of the shadows (the viewer sets the strength)Sun
Loop_Nameactionambient animation looping while the client is insideLoop_Conveyor, Loop_Flare
Avatar + Idle, Walkarmature + actionsthe client tours the scene as that characterAvatar, Avatar_Eyes (optional empty at eye height)
Hotspot_X / Play_X / Act_Xempty / scene action / avatar clipinteraction: the anchor where they stand, the equipment moving, the human gestureHotspot_Open_Valve, Play_Open_Valve, Act_Open_Valve (Act_Operate = generic gesture)
Focus_Nameobject or emptywhat the diorama frames when the ground is hugeFocus_Airliner
Screen_Name_NNstacked meshesscreen with an image sequence; a click advancesScreen_Menu_01, Screen_Menu_02
Display_Name16:9 meshmonitor showing live the screen shared with ?displayDisplay_Registration
Character_Nameempty or rootwhere a person the client can talk to stands; properties persona, voice, genderCharacter_Alejandra
Clipboard_Namemesh in the paper's shapea form the client fills in; property form = HTML page (or fields)Clipboard_Inspection + form = corte.html
Show_Nameobjectthe guide lights it up while describing it; optional noteShow_Helmet, Show_Nitrile_Gloves
Button_Namemesh or empty over meshesmachine button; plays Play_Name; property mode = once / toggle / holdButton_Start + Play_Start
Knob_Namemesh or empty over meshesknob; scrubs Play_Name from minimum to maximum; property stepsKnob_Pressure + Play_Pressure
Joystick_Namemesh or empty over meshestwo-axis stick; drives Play_Name_X and Play_Name_Y; properties mode (position / rate), sticky, speed, tiltJoystick_Boom + Play_Boom_X, Play_Boom_Y

Custom properties (Object Properties → Custom Properties) the viewer reads:

ObjectPropertyExample
Station_ / Hotspot_note — the station's topic the guide expandsEvery coil is inspected here before cutting
Show_note — one sentence about the objectProtects against chemicals
Character_persona, voice, genderReceptionist, 8 years…, Kore, female
Clipboard_form (HTML page), fields (A; B; C... list), notecorte.html · Name; Date; Notes...
Button_mode (once, toggle, hold), plays (another action)toggle · Play_Pump
Knob_steps (fixed positions), plays5
Joystick_mode (position, rate), sticky (no spring back), speed (action per second at full push), tilt (degrees)rate · 1 · 0.5 · 20

Several objects in one action: NLA tracks with the same name on each object (Play_Start on the button and on the piston) export as one animation. That is how the button sinks and the machine answers, or the knob turns and the needle follows.

5. Forms (Clipboard_)

The form is an HTML page the designer writes: any layout, the plant's sheet as a table, inline styles, even a script that builds the rows. Rules:

  1. Every box the client fills in is an <input>, <select> or <textarea> with a name.
  2. The file goes in the forms folder of the unit's Drive sources (e.g. corte.html).
  3. In Blender, the Clipboard_Inspection plane carries the property form = corte.html. Model it in the paper's shape (landscape or portrait).

Minimal example:

<!doctype html>
<html lang="en"><meta charset="utf-8">
<style>body{font:12px Arial;padding:10px} td,th{border:1px solid #333;padding:2px} input{width:100%;border:0}</style>
<body>
<h2>Inspection · Cutting line</h2>
<label>W.O. <input name="wo"></label> <label>Date <input name="date" type="date"></label>
<table>
  <tr><th>#</th><th>Length</th><th>Defects</th></tr>
  <tr><td>1</td><td><input name="row1_length"></td><td><input name="row1_defects"></td></tr>
  <tr><td>2</td><td><input name="row2_length"></td><td><input name="row2_defects"></td></tr>
</table>
</body></html>

How it is used: on a computer, a click on the clipboard opens the page inside the proposal; in a headset or on a tablet, a phone opens …/FCA/?clipboard and every form in the scene appears there. What is typed shows on the paper for everyone in the scene. Without a page, fields = Name; Date; Notes... generates a plain form (... = multi-line). Full examples: docs/examples/clipboard-forms/ in the wrk-mgr repository.

6. Machine controls (Button_, Knob_)

  1. Name the control Button_Start or Knob_Pressure (a mesh, or an empty with the control's meshes under it).
  2. Create the action Play_Start / Play_Pressure with keyframes of the control and of what it moves: the button sinking and the piston rising; the knob turning and the needle following.
  3. Export.
ControlBehaviourProperties
Button_plays the action once when pressedmode = toggle: repeats until pressed again, then rests · mode = hold: runs forward while held, back on release · plays = Play_Other to use another action
Knob_scrubs the action: start = minimum, end = maximum; turned by dragging, with the wheel, or in VR holding the trigger and raising/lowering the hand (or with the controller's thumbstick)steps = 5: fixed positions · plays
Joystick_two axes over Play_Name_X / Play_Name_Y (centre = the middle of the action); the stick tilts by itself; springs back on release; moved by dragging or, in VR, holding the trigger and using the controller's thumbstickmode = rate: the action runs while pushed and stays when let go (crane, boom) · speed = 0.5 · sticky = 1 · tilt = 20

A knob's action is one pose per value, no cycles. A hotspot is still the choice when the avatar should walk to the equipment and make a gesture.

7. The audit (/audit-showcase)

Checks the delivered file before importing it. The report arrives in chat as several messages: a summary, then findings by severity.

SeverityFindings
🛑 Blocking (do not import)linked_libraries_missing, image_has_no_pixels, images_not_packed, no_entry_points, reserved_loop_prefix, avatar_idle_clip_missing, avatar_walk_clip_missing, scene_scale_suspect
⚠️ Warning (something is missing)hotspot_without_clip, act_without_hotspot, single_entry_point, skybox_not_emissive, backdrop_not_emissive, sun_not_directional, focus_frames_nothing, screen_frame_unnumbered, screen_frames_misaligned, screen_single_frame, character_without_persona, character_voice_unknown, character_not_rigged, clipboard_without_fields, clipboard_not_a_mesh, control_without_clip, control_not_a_mesh, mesh_without_material, names_with_stray_whitespace
💡 Notecutout_uses_alpha_blend, opaque_material_carries_alpha

Each finding comes with what it is and how to fix it, in the language of --es.

8. Full scene specification

Audience: 3D design team

Deliverable: one interactive scene per proposal, shown inside the client's interactive proposal

Format: .blend (Blender 4.x or 5.x up to 5.2, preferred) or .fbx — deliver the source file, we handle all export and optimization

What's new in v1.1

What you are building

The scene appears twice in the proposal, from the same file:

  1. Diorama — a tabletop-scale model at the center of the proposal gallery, like an architect's scale model. This is what the client sees first.
  2. Inside view — clicking the diorama puts the client inside the scene at full scale: standing at locations you define, seated at eye points you define (vehicle cab, control chair), or touring it as a character (Avatar) in third or first person. The AI presenter narrates while they explore.

Design for both scales. The scene must read as an attractive miniature from above AND hold up at eye level from every viewpoint you place. Detail what a standing person will look at; don't detail what nobody will ever be near.

Hard requirements

RuleDetail
UnitsReal-world meters. 1 Blender unit = 1 m. A door is ~2.1 m, a handrail ~1.0 m.
Transforms appliedAll object scales applied (Ctrl+A → All Transforms) before delivery.
MaterialsPrincipled BSDF only. Procedural textures baked to image textures, max 2048×2048, and at most ~24 texture images total — atlas repeated props. Texture memory is the scarcest resource on target devices.
AnimationKeyframed actions staged on NLA tracks. No physics sims, cloth, or particles — bake them to keyframes if needed.
Geometry budget≤ 600,000 triangles total (aim ~450k). Spend triangles where the client will be standing; the Avatar (~20–40k) counts inside the total.
Object budget≤ 150 meshes after joining (join everything that shares a material) and ≤ 25 unique materials. This budget decides frame rate more than triangles do — spend meshes and materials like money: a 600k-triangle scene in 120 meshes outperforms a 250k one in 600.
Self-containedPack all textures into the file (File → External Data → Pack Resources). No linked libraries. Packed file ≤ ~150 MB.

We compress everything (geometry and textures) after conversion — you do not need to optimize file size beyond the budgets above.

Naming conventions — how your scene talks to the viewer

The viewer reads object names and animation (action) names to know how to behave. Objects that don't match any convention below are ordinary scenery.

Station_NN_Name — standing viewpoints (empties)

A place a person can stand. Add one empty per location, positioned on the floor (we raise the camera to the avatar's measured eye height automatically, and a station that is not on its floor is reported by /audit-showcase instead of being silently moved). The empty's rotation sets the initial view direction (its −Y axis is "forward" — enable Display As: Arrows to see it).

Seat_Name — seated viewpoints (empties)

A locked, seated view: cockpit, crane cab, control chair. Position the empty at the exact eye point of the seated person (not the floor). The visitor can look around from there but cannot move.

Skybox — the sky (mesh, optional)

A large inverted sphere or dome, emissive material, equirectangular sky texture, surrounding the scene. Hidden while the scene is a diorama; revealed when the client steps inside. If you skip it, the viewer supplies a plain default sky — a real one is always better.

The sky image is wired to Emission, not Base Color. The viewer bakes the dome into an environment map inside a scene with no lights: a dome with its texture on Base Color bakes black and the whole scene goes dark (AER shipped this way). /audit-showcase reports it as skybox_not_emissive.

Loop_Name — ambient animation (action names)

Any action whose name starts with Loop_ plays automatically, forever, once the client is inside: Loop_FlareStack, Loop_Conveyor, Loop_Traffic. Make the first and last keyframes match so the loop is seamless.

Avatar — the client's character (armature, optional)

A character the client "embodies" once inside: they can see it in third person (over-the-shoulder camera), look through its eyes in first person, or release it and fly free (drone mode, the current behavior). If the scene has no Avatar, the viewer works exactly as before — drone mode only.

Hotspot_Name — interactions (empties) — the name triad

A point where the client does something: open a valve, push a button, inspect a panel. An interaction is defined by up to three pieces that share exactly the same name:

PieceTypeRole
Hotspot_OpenValveempty in the sceneThe anchor (required): the exact position and orientation where a person would stand to do it, with −Y toward the equipment.
Play_OpenValvescene actionThe equipment side: the wheel turns, the panel lights up. Plays once when triggered.
Act_OpenValveavatar clipThe human side: the reach-and-turn motion.

Viewer behavior: approaching (~2.5 m) surfaces the prompt; on trigger the avatar glides onto the anchor and Act_ + Play_ play together, then it returns to Idle. That's why the anchor matters: place it exactly where the feet should be and the hand will land on the equipment. Without an avatar (or in drone mode), clicking the marker plays Play_ alone — hotspots work in every scene, avatar or not.

Focus_Name — the diorama's subject (object or empty, optional)

Tell the viewer what the diorama is showing. In the gallery the scene is a diorama: the viewer scales it so its largest extent measures about 4 m. When a scene needs far more surroundings than subject — FER's cab has windows front and back, so the rails and the floor must run a long way in both directions — the surroundings own that scale and the subject ends up tiny.

Screen_Name_NN — screens with image sequences (meshes)

A monitor, tablet or kiosk that shows a series of images (the screens of a registration system, say). Model the screen as a plane carrying the first image and duplicate it in place once per image: Screen_Registration_01, Screen_Registration_02, … each copy with its own image in the material (wired to Emission, so it reads as a lit display under any lighting). The viewer shows only _01; a click, a tap or the VR trigger on the screen advances to the next image and wraps around after the last.

Display_Name — live display (mesh)

A monitor that shows a computer's screen live: the client's real software (their registration system, say) running while the client practises in front of the character. Model the monitor as a 16:9 plane with a full UV (the image fills the plane) and name it Display_Registration. Whatever material you give it is what shows while nobody is sharing.

Character_Name — people the client can talk to (empty or root)

A person in the scene the client practises a real voice conversation with: a guest at the reception desk, a customer at the counter. The character is not modelled in the scene: the operations team delivers it on the publish command, like the showcase:

/gen-proposal UNIT --publish --showcase <scene> --character <model> --persona <doc> --idle <clip> --talk <clip>

Your part in the scene is the spot: an empty (or any object) named Character_Name where the person stands, with the same Name as the persona doc, facing where the client will be. The viewer puts the delivered model there and hides the marker. Within ~2.5 m the prompt E — 💬 Name appears; E, a click or the VR trigger starts the conversation and the guide stays quiet; it ends with E again, another click, walking away (> 4 m) or the person saying goodbye, and the guide comments on how it went.

Clipboard_Name — forms the client fills in (mesh, optional)

A clipboard with a form the client fills in during the practice: a new-customer registration, an incident report, the plant's own inspection sheet. Model the clipboard as a plane with full UV, in the paper's shape (portrait or landscape), and name it Clipboard_Registration. The material you give it is what shows when nobody is in the scene; inside, the viewer draws the form with what is being typed.

Show_Name — objects the guide points out one by one (objects, optional)

For a station with several objects the guide explains one at a time — PPE on a table, tools on a bench — name each object Show_Name (Show_Helmet, Show_Nitrile_Gloves). While the guide talks about an object it glows orange; moving on to the next one turns the previous one off.

Button_Name, Knob_Name and Joystick_Name — controls on a machine (meshes, optional)

Buttons, knobs, levers and gauges the client operates right on the equipment: press the start button and the conveyor runs; turn the pressure knob and the gauge needle follows. They need no anchor and no avatar: the client works them from wherever they stand, with a click, the headset trigger or a hand.

Lights

Your Skybox is the scene's main light. The viewer bakes it into an environment map (IBL), and that is where all ambient light and every metal reflection comes from. It is the same thing Blender's world does, and it is the biggest lever you have over how the scene looks. A well-exposed sky lights the scene well; a flat or dark one leaves everything dull.

The Sun decides where shadows fall. The viewer takes its direction and colour, not its intensity: Blender exports W/m² converted to lux and the viewer rescales again, so intensity does not survive the trip usefully. The viewer sets its own strength, calibrated against exposure. Aim the Sun how you want the shadows and ignore its Strength value.

The first Sun (directional light) in the scene is the one used. Other lights (point/spot, a second sun) travel in the file but the viewer does not switch them on — their contribution is approximated by the sky. Use a handful at most (≤ 4 recommended).

It has to be a Sun-type lamp: a Point or Area light named "Sun" does not count (AER shipped a 17.8-million-candela point and the viewer ignored it — no sun direction, no authored shadows). /audit-showcase reports it as sun_not_directional.

The ground must not set the diorama scale. In the gallery the scene is shown as a diorama: the viewer scales the scene's largest extent (Skybox and Avatar excluded) to 4 m. A ground plane or apron much larger than the subject becomes the whole diorama and the subject turns tiny (AER's airliner rendered 0.8 m on a 185 m apron). Trim the ground to the walkable area, or — when the scene needs those surroundings, like rails that must look long from the cab — name the subject Focus_Name and the ground stops counting. /audit-showcase reports it as diorama_fit_dominated.

Until 2026-08-14 this section claimed every light lit the inside view. It did not: the converter never exported them. Fixed.

How the viewer uses your scene

Delivery and feedback

Deliver the file the same way as any showcase model (Drive link to the operations team). The publish pipeline validates the scene automatically and reports problems by name in the chat card — e.g. "Station_03 sits 4.2 m above the ground — stations belong on the floor" or "scene is 17 m wide but declares walkable stations — rescale to meters." Fix and re-deliver; re-publishing is cheap and the model is reconverted only when the file actually changes.

Before anything is imported, the operations team can ask for a check with /audit-showcase <drive link>: it opens your file without converting or publishing it and answers in chat with what it found — missing linked libraries, images Blender could not load, hidden objects that would never reach the export, clip names outside the conventions, the scene budgets, and since September 2026 also whether the Sun is directional, whether the Skybox is emissive, and which object sets the diorama scale. If something is off you hear about it in minutes, without touching the client's proposal. The card shows the first six affected items of each finding; the full report (every texture with its size and the materials using it, hidden objects, stations against their floor) is at the link at the end of the card.

Two cases are rejected outright, because the client would open an empty scene: a file with no geometry (what a master file whose linked libraries were not delivered with it produces) and a texture with no pixels (an image whose file Blender could not load). The message names the objects that did arrive, or the materials affected.

Pre-delivery checklist

9. For developers

ComponentRepositoryWhat it does
Flow Manager Client (Google Apps Script)flow-manager-clientthe chat commands, the Google Doc draft, the callbacks
flow-mgrflow-mgrgenerates the proposal, converts and hosts the scene and characters, voice sessions (relay to Gemini Live), access codes, the form and display channels
wrk-mgr · interactive_webwrk-mgrpackages the experience (the web shell: workers/interactive_web/app_shell) and publishes it to the proposal origin
wrk-mgr · blenderwrk-mgrconverts .blend/.fbx to compressed glTF, audits scenes, converts avatars
src-mgrsrc-mgrsyncs the Drive sources and their labels

Reference documentation in the repositories: wrk-mgr/docs/proposal-scene-spec.md (this specification), wrk-mgr/docs/workers/interactive-proposal.md (the shell and its runtime contract), flow-mgr/docs/proposals.md and flow-mgr/docs/live-relay.md (publishing, audit, voice, forms). Shell changes deploy as the interactive_web Modal worker and reach each unit when it is republished.