SpAIne — fábrica de parches

Documentación viva unificada: cómo está implementado SpAIne en Forge, qué toca Grabbr, qué hace Spline, y qué está en HOLD de verdad.

SpAIne es la fábrica de parches de slots que vive dentro de Forge. Amplía /opt/forge; no pisa local/serve.mjs, el catálogo Magix, arena-reels ni Caddy de forge.jailbroken.tech.

El flujo cerrado: Forge arranca desde un slot que ya juega → Grabbr captura → catálogo en el apartado → el operador elige QUÉ y CÓMO → los originales explotados viajan a Spline (clasificar, guardar, brief MCP, editar) → approve trae v2 y recompila, reject sigue editando. Originales intactos. Bundle id nuevo.

Glosario (para no mezclar las piezas)

Spine

Esoteric 2D. Atlas + huesos. Horror Circus 4.1.24. El runtime del slot.

Spline

spline.design. Editor 3D/Hana. MCP hosted u app macOS. No es Spine.

SpAIne

La fábrica en Forge. Plugin ha-spaine + runtime /opt/forge/spaine.

Grabbr

Cliente público grabbr.jailbroken.tech :8790. Captura + tab QUÉ/CÓMO.

Forge

forge.jailbroken.tech :8766. Catálogo y trabajo. Se amplía, no se pisa.

Genie

Reskin Spine :8765/:5173. Proceso aparte. Nunca dentro de forge.service.

Darwin

El kernel de macOS. Spline.app desktop MCP solo corre ahí.

Imagine

Stills grok-imagine-image-2.0 en imagina.jailbroken.tech :8791.

Máquina de estados

Hacé click en un estado. Eso es exactamente lo que escribe el runtime en pipeline.json.

idle → capturing → ingesting → cataloged → selected → spline_ready → editing → review → recompiled

CLI y HTTP reales

Fuente: /opt/forge/spaine/cli.mjs · routes.mjs · forge.service :8766

node /opt/forge/spaine/cli.mjs status
node /opt/forge/spaine/cli.mjs inventory
node /opt/forge/spaine/cli.mjs validate-tree
node /opt/forge/spaine/cli.mjs hydrate
node /opt/forge/spaine/cli.mjs mockup
node /opt/forge/spaine/cli.mjs start --name='Horror Circus' --provider=axion
node /opt/forge/spaine/cli.mjs ingest --capture=<grabbrId>
node /opt/forge/spaine/cli.mjs catalog
node /opt/forge/spaine/cli.mjs select --codes=BAR,BELL --how='3D idle gold glints'
node /opt/forge/spaine/cli.mjs spline-pack
node /opt/forge/spaine/cli.mjs spline-zip --code=BAR
node /opt/forge/spaine/cli.mjs inbox --code=BAR --file=/path/v2.png
node /opt/forge/spaine/cli.mjs approve --code=BAR
node /opt/forge/spaine/cli.mjs reject --code=BAR --note='more gold'
node /opt/forge/spaine/cli.mjs recompile
node /opt/forge/spaine/cli.mjs gen-stills --prompt='…' --codes=AA,AB
node /opt/forge/spaine/cli.mjs gen-sfx --theme='horror circus slot'
node /opt/forge/spaine/cli.mjs atlas-repack
node /opt/forge/spaine/cli.mjs zip

HTTP Forge :8766 (mismo proceso forge.service, handler handleSpaine): GET /spaine/health, /spaine/pipeline, POST /spaine/pipeline/start|ingest, /spaine/catalog, /spaine/select, POST /spaine/spline/pack, GET /spaine/spline/outbox, POST /spaine/review/approve|reject, POST /spaine/recompile. Grabbr proxy: /v1/spaine/*.

Jobs en disco

Horror Circus jobs/horrorcircus-1.0.23/ — Axion Spine 4.1.24, 5×3, wild WD, AA–BN. Piloto atlas + oggs + Genie. Gem Magix: no.

Joker’s Diamond original jobs/jokers-diamond-hplay/ — stills de /root/hplay-hc.png (HPlay, no el clon Horror Circus). Códigos BAR BELL GRAPE SHOE ORNG SEVEN MELON LOGO. Estado spline_ready. CÓMO: objeto 3D del still + idle loop. Spline hosted: HOLD OAuth 401.

Chrome headed Chile 127.0.0.1:9336 pid 1901346: no matar.

HOLD medido (sin teatro)

  • HOLD Spline hosted MCP OAuth 401 — grok mcp doctor spline.
  • HOLD paytable completo del Joker original (símbolo joker en reel / diamond scatter) no está en /root/hplay-hc.png.
  • HOLD no reusar Chrome Chile :9336 para otra captura HPlay.
  • HOLD SAM / FAL slice en Genie.
  • HOLD deploy jugable temporal de este corte.
  • GO Imagine paint, ElevenLabs por cue, Grabbr tab, Forge :8766, outbox Jokers 8 zips, Chrome :9336 vivo.

Índice vivo

Fuente: INDEX.md

SpAIne — documentación viva

English handbook (unified, interactive): SPAINE.html — product, pipeline, CLI, HOLDs. One-pager: SPAINE.html.md. Spanish chapters below are unchanged.

Dónde vive el producto: Forge (/opt/forge, forge.jailbroken.tech). Quién consume: Grabbr (grabbr.jailbroken.tech). No duplicar el módulo. Ampliar Forge; no sobreescribir local/serve.mjs, public/index.html, bulk, arena-reels, RGS ni Caddy Host.

Este folder se redacta y se edita a medida que hablamos. No es un índice vacío: cada capítulo está escrito.

| Archivo | Qué cubre | |---|---| | 00-producto.md | Decisiones de producto ya cerradas (flujo, modelos, audio, deploy, descargas) | | 01-original-vs-clon.md | Joker's Diamond (HPlay) vs Horror Circus (Axion), grupo por grupo | | 02-audio-dinamico.md | Efectos, capas, disparos en vivo, escalera de premio, arias | | 03-que-falta.md | Qué hay hoy vs qué falta para lograr ese nivel | | 04-puntos-producto.md | Producto, punto por punto: actual / técnica / no técnica / how-to | | 05-puntos-visual.md | Visual y movimiento, punto por punto (V1–V20) | | 06-puntos-audio.md | Audio dinámico, punto por punto (A0–A22) | | 07-howto-piloto.md | Receta operativa del piloto sobre Horror Circus | | 08-pack.md | Pack: plugin ha-spaine + runtime Forge + cliente Grabbr. Defaults y orden de build | | 09-provenance-horrorcircus.md | Provenance del pack (Axion Joker's Diamond + paint custom) | | 10-spine-animation-ai.md | Repo Genielabs + 12 principios → clips Axion | | 11-reskin-app.md | Genie Spine Reskin cableado :8765/:5173, explode joker, Imagine paint, HOLD SAM | | 12-spline-mcp.md | Spline.design MCP: hosted en Arena; app de escritorio en macOS | | 13-pipeline.md | Paso intermedio: Forge → Grabbr → catálogo → QUÉ/CÓMO → Spline Mac → v2 / reject | | board-current.png | Mockup v0.1: tablero real (fondo+marco+stills actuales, sin Imagine) |

Cada punto de 04–06 usa cuatro capas: qué hay ahora, cómo está cableado, qué se siente, y cómo se hace (juego + reskin).

Señal de implementación: pack + pipeline 13. CLI: hydrate/inventory/validate/mockup/apply/gen-stills/gen-sfx/atlas-repack/zip/start/ingest/catalog/select/spline-pack/approve/reject/recompile. Grabbr tab SpAIne elige QUÉ/CÓMO.

Puntero en Grabbr: /opt/hallallow/apps/game-images-api/docs/spaine/README.md

Estado medido (2026-10-28)

| Pieza | Evidencia | |---|---| | Forge :8766 | GET /spaine/health ok, handleSpaine montado | | Grabbr :8790 | tab SpAIne + proxy /v1/spaine/* | | Genie :8765/:5173 | Imagine paint GO; SAM/FAL slice HOLD | | Job piloto | jobs/horrorcircus-1.0.23/ src + catalog 8 + dst + zip 6 110 526 B | | Pipeline | cataloged → selected AA → spline_ready → editing → review → recompiled | | Outbox AA | original.webp + blur + classify + brief + mcp-request, zip 92 721 B | | Chrome Grabbr | headed :9336 — no matar | | Spline.app MCP | packs listos; stdio solo en Darwin | | Deploy jugable | HOLD este corte |

---

Changelog

| Fecha | Qué se agregó | |---|---| | 2026-10-28 | Primer cierre: producto, análisis visual original vs clon, audio dinámico, huecos para el piloto | | 2026-10-28 | Punto por punto en 4 capas (actual, técnica, no técnica, how-to): producto P1–P6, visual V1–V20, audio A0–A22, receta piloto | | 2026-10-28 | Pack plugin+runtime (08-pack.md): no hay bloqueo; defaults; tres capas; orden de build | | 2026-10-28 | Pack v0.1: plugin ha-spaine + runtime /opt/forge/spaine (inventory/validate/hydrate/mockup/apply). Oggs overlay /tmp/hc-cmp/snd. Magix no. | | 2026-10-28 | Genie Reskin lab: vendor + ingest joker 37 slots + API open PASS. UI :5173 API :8765. Forge :8766 intacto. Gemini/SAM HOLD. | | 2026-10-28 | Gemini → Imagine: grok-imagine-image-2.0 SuperGrok OAuth. Generate ya no pide GEMINI. SAM/FAL HOLD de slice. | | 2026-10-28 | Spline MCP hosted en Grok/Claude/Cursor. Desktop MCP = Spline.app en macOS (install-spline-mcp-mac.sh). Darwin = núcleo de macOS. | | 2026-10-28 | CLI wired: gen-stills (Imagine), gen-sfx (ElevenLabs), atlas-repack, zip. Grabbr /v1/spaine + tab UI. FAL no es gate de Generate. | | 2026-10-28 | Pipeline 13: Forge apartado cataloga el zip desmenuzado; QUÉ/CÓMO → outbox Spline Mac (classify+brief+MCP); approve v2 / reject loop; recompile. | | 2026-10-28 | Docs 00–13 + plugin + Grabbr README alineados al disco (P1–P7 Actual, 03 huecos, 07 comandos, 08 pack ya no HOLD Imagine/Grabbr). |

Job Jokers Diamond original (2026-10-28)

Stills del original HPlay (no Horror Circus) recortados de /root/hplay-hc.png. Job: /opt/forge/spaine/jobs/jokers-diamond-hplay/ estado spline_ready. Outbox: BAR BELL GRAPE SHOE ORNG SEVEN MELON LOGO. Spline hosted MCP: HOLD oauth (grok mcp doctor spline → AuthRequired 401). English unified HTML (in progress, two parallel agents, parent not cancelled): SPAINE.html + SPAINE.html.md.

Producto

Fuente: 00-producto.md

SpAIne — producto (decisiones cerradas)

Nombre: SpAIne (juego con Spine). Fábrica de parches de slots, prompt-first, con herramientas de selección.

Rol en el ecosistema

| Pieza | Rol | |---|---| | Forge | Host y trabajo. SpAIne amplía Forge; no es un segundo Forge. | | Grabbr | Cliente delgado: captura, galería, tab SpAIne (QUÉ/CÓMO), mockups, proxy /v1/spaine/*. | | Imagine Lab | Stills (símbolos, fondo, marco, logo, HUD). imagina.jailbroken.tech + Genie paint. | | ElevenLabs | Generación de cues de audio. Clave en secrets/elevenlabs.env (no echo). | | Genie Spine Reskin | Lab :8765/:5173 — pintar atlas Spine. No está en forge.service. | | Spline Mac | Editor visual de los QUE. Puente = outbox/inbox (13-pipeline.md). | | Grok + Claude | Plan / crítica / prompts, vía suscripción. MCP Spline hosted en Arena. | | Auth | Misma cookie hall_sala que consola / pentest / audit / forge / ticketing. |

Uso interno (operador + amigos). Autorizado a parecerse a originales.

Qué significa “editar”

No es un recorte de PNG suelto. A partir de cualquier capture job:

  • reskin de mascota;
  • cambio de paleta;
  • reemplazo / reversionado de símbolos;
  • tema completo: fondo, marco de carretes, UI, mascota, paleta, sonidos, textos.

Ejemplo de pedido: “reemplazá los símbolos y la temática de caramelo por emoticones”. El sistema tiene que entender, proponer algo bien hecho y acorde, no un collage.

Flujo (cerrado)

  1. Forge arranca el job sobre la base de un slot.
  2. Capture en Grabbr (POST /v1/capture) — cualquier job.
  3. Descargar, desmenuzar el zip, catalogar y guardar en el apartado Forge jobs/<id>/.
  4. El usuario elige QUÉ (casilleros) y CÓMO (pedido).
  5. Los QUE van a Spline Mac: clasificar original → guardar en Spline.app → adjuntar brief MCP → editar.
  6. 5.a aprueba → asset v2 a Forge → recompile. 5.b rechaza → seguir editando.
  7. Apply: repack + deploy temporal en Forge.
  8. El usuario ve y juega. Pack descargable. Originales intactos. Bundle id nuevo.

Detalle: 13-pipeline.md.

Modo Adobe: no por ahora. Default: simplificado, más prompt que edición manual.

Descargas (ambas)

  • Formato Forge / Magix gems.
  • Formato Grabbr capture zip (packs + unpacked/).

Animaciones (Spine)

Los slots tipo Horror Circus no son figuritas quietas. Cada símbolo tiene caras:

  • quieto (idle, loop);
  • giro borroso (spin blur);
  • aterrizaje (land);
  • victoria (~4 s, no loop);
  • nowin (foto quieta);
  • miniatura de paytable.

v1 no inventa marionetas de 55 huesos. v1 cambia la piel y deja huesos/tiempos. Ver 03-que-falta.md.

Audio (criterio de producto)

Lo premium no es “un mp3 de fondo”. Es un director: qué pista entra, cuándo, a qué volumen, quién pisa a quién. Detalle en 02-audio-dinamico.md.

El piloto debe respetar la partitura del engine (Sounds.json + Manifest.json), no aplastarla con un sprite de 3 cortes al estilo Magix.

Qué ya despliega (2026-10-28)

Runtime /opt/forge/spaine montado en Forge :8766 (handleSpaine). CLI + HTTP + Grabbr tab. Pipeline 13 smoke: catalog 8 → select AA → outbox → approve v2 → recompile zip 6.1 MB. Chrome :9336 no se toca.

Sigue abierto: variantes N en UI, SAM slice, deploy temporal jugado en browser este corte, Spline.app desktop MCP vivo (solo Darwin).

Este folder se edita con el producto. No es un índice de “cuando arranquemos”.

Pipeline Forge ↔ Grabbr ↔ Spline

Fuente: 13-pipeline.md

Pipeline Forge ↔ Grabbr ↔ Spline Mac

Paso intermedio entre Arena (Forge/Grabbr) y el MCP de Spline en la Mac.

Spline.app es el editor visual (Darwin/macOS). SpAIne/Forge es la fábrica en Arena. Grabbr es el cliente: captura + selección QUÉ/CÓMO.

Flujo (este es el contrato)

1. Forge arranca un job sobre la base de un slot
2. Ese slot se manda a Grabbr capture (POST /v1/capture)
3. Se descarga, se desmenuza el zip, se cataloga y se guarda en el apartado
   jobs/<id>/  (src/ + catalog.json)
4. El usuario elige QUÉ (códigos AA…) y CÓMO (pedido de edición)
5. Los QUE viven en Arena (zip original explotado) se empaquetan para Spline Mac:
   5.1 original clasificado (classify.json)
   5.2 original guardado para importar en Spline.app
   5.3 brief + mcp-request.json (qué va a pedir el agente via MCP)
   5.4 se edita el asset en Spline
   5.a user aprueba → asset v2 vuelve a Forge inbox → recompile
   5.b user rechaza → siguen las modificaciones hasta approve

Disco

/opt/forge/spaine/jobs/<id>/
  src/                     original explotado (hydrate o ingest Grabbr)
  catalog.json             clasificación de cada casillero
  select.json              { codes, how }
  pipeline.json            estado
  bridge/outbox/<CODE>/    pack para la Mac (original + classify + brief + mcp-request)
  bridge/inbox/<CODE>/     asset.v2.* + status.json
  bridge/approved/<CODE>/  copia de lo aprobado
  dst/                     copy-on-write + v2
  gen/zip/<id>.zip         pack recompilado

Estados

idle → capturing → ingesting → cataloged → selected → spline_ready → editing → review → recompiled

Reject de un asset: review → editing (el resto del job sigue).

CLI

node /opt/forge/spaine/cli.mjs start --name='Horror Circus' --provider=axion
node /opt/forge/spaine/cli.mjs ingest --capture=<grabbrId>
node /opt/forge/spaine/cli.mjs catalog
node /opt/forge/spaine/cli.mjs select --codes=AA --how='neon clown, keep silhouette'
node /opt/forge/spaine/cli.mjs spline-pack
node /opt/forge/spaine/cli.mjs spline-zip --code=AA
node /opt/forge/spaine/cli.mjs spline-claim --code=AA
node /opt/forge/spaine/cli.mjs inbox --code=AA --file=/path/v2.png
node /opt/forge/spaine/cli.mjs approve --code=AA
node /opt/forge/spaine/cli.mjs reject --code=AA --note='más brillo'
node /opt/forge/spaine/cli.mjs recompile
node /opt/forge/spaine/cli.mjs pipeline

Piloto ya hidratado: start sin --url no dispara Grabbr; cataloga jobs/horrorcircus-1.0.23/src.

HTTP Forge (:8766)

| Método | Path | |---|---| | GET | /spaine/pipeline | | POST | /spaine/pipeline/start {name,provider,slotUrl} | | POST | /spaine/pipeline/ingest {captureId} | | POST/GET | /spaine/catalog | | POST/GET | /spaine/select {codes,how} | | POST | /spaine/spline/pack | | GET | /spaine/spline/outbox · /spaine/spline/outbox/AA.zip | | POST | /spaine/spline/claim {code} | | POST/GET | /spaine/spline/inbox | | POST | /spaine/review/approve {code} | | POST | /spaine/review/reject {code,note} | | POST | /spaine/recompile |

Grabbr proxy: mismos paths bajo /v1/spaine/…. Tab SpAIne: chips QUÉ + textarea CÓMO + Send to Spline.

Mac

SSH Arena→Mac no hace falta. El operador baja AA.zip del outbox (Grabbr o Forge), lo abre en Spline.app, el agente MCP sigue brief.md / mcp-request.json. El PNG v2 se sube a inbox (inbox --file= o POST). Approve en Grabbr.

Desktop MCP: install-spline-mcp-mac.sh en Darwin. Hosted MCP en Arena para briefs 3D/Hana cuando no hay app.

Originales

src/ no se pisa. v2 entra en dst/ (apply copy-on-write). Bundle id nuevo en recompile.

Smoke medido (2026-10-28, Arena)

Piloto horrorcircus-1.0.23, src/ ya hidratado (no se disparó Grabbr capture).

| Paso | Resultado | |---|---| | cli.mjs start | PASS, skippedCapture: true, state ingesting | | catalog | PASS, 8 códigos AA–BN | | select --codes=AA --how='neon clown…' | PASS | | spline-pack | class spine-atlas-part, original+blur copiados | | spline-zip --code=AA | 92 721 bytes | | claim / inbox (v2 = copia del original, Mac ausente) | PASS | | approve --code=AA | dst/assets/images/symbols/Joker.webp | | recompile | atlas 38 placements, zip 6 110 526 bytes, state recompiled | | Grabbr GET /v1/spaine/spline/outbox/AA.zip | HTTP 200, 92721 | | Chrome :9336 | PID intacto |

Libs: lib/pipeline.mjs catalog.mjs select.mjs spline-bridge.mjs review.mjs. Routes Forge + proxy Grabbr POST/GET.

Original vs clon

Fuente: 01-original-vs-clon.md

Caso piloto — original vs clon (grupo por grupo)

Lenguaje de jugador. Evidencia de pantalla y de pack, no de folleto.

Los dos URLs

| | Original | Clon (nuevo) | |---|---|---| | Host | https://hplay.games/game/launcher | https://games.stage.axiongames.io/HorrorCircus/ | | Ids | merchantId=0199ece3-… · gameId=13121200 · demo · language=es | gameId=jdhorrorcircus · jurisdiction=99 · demo · currency=ARS · brand=gamesplay | | Título en página | Joker’s Diamond | Horror Circus / cartel CIRCUS OF HORROR | | Motor | Pack cerrado HPlay (JS ofuscado) | Axion Pixi, build 1.0.23, Spine 4.1.24 | | Grilla | 5×3 | 5×3 (reels.symbols [3,3,3,3,3]) |

Captura original (tablero real): /root/hplay-hc.png. Pack vivo del clon: https://games.stage.axiongames.io/HorrorCircus/game/ · copia local /tmp/hc-cmp/axion-live/ y /opt/hallallow/apps/game-images-api/cache/hc-cmp/. Plantilla Translaxion: /opt/translaxion/data/slotre/horrorcircus-template/.

El clon en Chromium headless se quedó en el loader; el análisis visual del clon es de los archivos que el juego baja, que son los que el jugador ve al terminar de cargar.

Lectura honesta (antes de los grupos)

No es un repintado suave del mismo look. Comparten el esqueleto de un slot clásico 5×3 (columnas, líneas, spin a la derecha, menú a la izquierda, saldo abajo). El vestuario entero está cambiado.

El lazo de sangre: el Joker y el diamante. El original se llama por ellos. El clon los conserva como mascota y scatter, y dejó nombres viejos adentro (carpeta Joker_Sounds, atlas de líneas joker_atlas, archivos Juggling, shoes, Square, Circle). Huella de pintar encima de una plantilla, no de copiar el look 1:1.

Si el “original” mental era un Horror Circus de Hacksaw u otro proveedor: este 13121200 de HPlay es Joker’s Diamond.

---

1. Escenario (fondo)

Original. Teatro de casino de lujo: arco dorado, luces de escenario, columnas, champagne. El tablero flota como un cuadro. Noche de gala.

Nuevo. BG_Background.webp. Carpa de circo de terror: gradas con siluetas, linternas, jaula, escalera, arco CIRCUS OF HORROR en verde ácido, cortinas rojas, pista con espiral rojo-amarillo, pedestales con estrellas. Púrpura / verde / rojo. Show maldito.

Cambio. No retocaron el teatro. Lo reemplazaron. El único eco es “estamos en un espectáculo”.

2. Marco de carretes (el mueble)

Original. Ventana beige con rombos, borde dorado grueso, columnas separadas con líneas finas. Marco de museo.

Nuevo. Reel.webp. Tambor de madera azul de cinco fajas, borde violeta, salpicaduras de sangre y manchas verdes. Barril de feria manchado.

Cambio. El mueble pasa a ser parte del terror. En un reskin, este grupo pesa tanto como los símbolos: marco dorado + payasos = a medias.

3. Logo y nombre

Original. JOKER’S DIAMOND arriba a la izquierda, letras de joya (rojo, violeta, oro), diamante incrustado.

Nuevo. El título vive en el fondo (neón verde sobre el arco). Hay Logo.json animado. Nombre de build: Horror Circus.

Cambio. De “joker + diamante” como marca a “circo de horror”. El diamante sobrevive como scatter, no como nombre.

4. Paleta

Original. Oro, beige, uva, rojo del 7, naranja. Calidez. Casino de los 90 premium.

Nuevo. Púrpura de carpa, verde baba, rojo sangre, naranja de motosierra, rosa cerebro, azul de diamante roto. Frío + tóxico.

Cambio. Toda la temperatura, no un tinte de metal.

5. HUD (botonera y barra de plata)

Original (captura real).

  • Parlante redondo violeta-oro arriba izquierda.
  • Izquierda: Información, menú, autoplay — círculos violeta con aro de oro.
  • Derecha: spin verde circular con aro de oro.
  • Abajo: SALDO / APUESTA TOTAL / ÚLTIMA GANANCIA / AUTOPLAY.
  • Cinta: “Tres o más símbolos Scatter activan giros gratis.”

Nuevo. Misma lógica de puestos. Skins horror (buy_basegame.png, lightFrame, reelLight). Compra de feature (HorrorCircus_54) que esa captura del original no muestra. Paytable con claves HorrorCircus_*.

Cambio. Disposición = mismo tipo de máquina. Pintado y buy bonus = del clon. Mover el spin cambia el género; recolorarlo no.

6. Símbolos, uno por uno

El original muestra feria clásica. El clon tiene ocho dibujos (códigos AA–GG + BN). Varios archivos se llaman como el objeto viejo y adentro hay otro dibujo.

Stills del clon: /opt/hallallow/apps/game-images-api/cache/hc-cmp/symbols/. Cableado: Symbols.json (idle / payline_info / win ~4 s / nowin / spin blur / land).

Mascota (AA)

Original. El joker vive sobre todo en el logo. En el tablero de esa captura mandan BAR, 7, campana, herradura.

Nuevo. Joker.webp. Bufón de terror: gorro violeta/rojo/verde con cascabeles, piel cosida, ojos amarillos, sonrisa de cuchillo. 3D, no sticker. Spine joker.json (~55 huesos). Aria Win_Joker.

Cambio. De marca a símbolo estrella que gira, de gracioso de casino a payaso de película.

Personaje 2 (BB)

Original. No hay mono. Hay uva, naranja, sandía.

Nuevo. Seal.webp (nombre interno “foca”). Mono zombi: piel verde, cerebro de fuera, baba, colmillos. Sonido Win_Monkey. Spine seal.json (~40 huesos).

Cambio. Animal de circo → criatura de horror. El archivo no se rebautizó.

Arma (CC)

Original. Campana de oro, herradura (suerte).

Nuevo. Juggling.webp (nombre: malabares). Motosierra naranja/violeta con carita de payaso (ojos X), sangre en la cadena. Win_Saw. Spine Juggling.json.

Cambio. Casillero de malabares rellenado con arma. Recambio total del objeto.

Low / suelo (DD)

Nuevo. shoes.webp (nombre: zapatos). Triciclo rojo de payaso, flecos, baba verde. Estética “IT”. Sin aria propia.

Filler (EE)

Nuevo. Ball.webp. Globo rojo hiperrealista. Win_Balloon. Spine casi rígido (Ball.json, ~2 huesos).

Low extra (FF)

Nuevo. Square.webp (nombre: cuadrado). Cerebro rosa con baba verde. Sin aria.

Low extra (GG)

Nuevo. Circle.webp (nombre: círculo). Ticket HORROR CIRCUS / ADMIT ONE, borde violeta, baba. Sin aria.

Scatter / bonus (BN)

Original. Banner: tres o más Scatter = giros gratis. Por el nombre del juego, el scatter es el diamante (o un joker especial). En esa captura no cayó en el tablero.

Nuevo. Bonus.webp. Diamante azul-violeta agrietado, sangre, palabra BONUS en oro sucio. Spine diamond.json. Aterrizaje Bonus_Landing (prioridad sobre el stop normal). Buy feature.

Cambio. Misma idea (diamante = puerta al extra). Ahora roto, gore, con palabra BONUS y compra de ronda.

Tabla casillero → archivo → pantalla → eco original

| Código | Archivo (nombre viejo) | Se ve ahora | Eco en Joker's Diamond | |---|---|---|---| | AA | Joker | Payaso de terror | Joker del logo | | BB | Seal | Mono zombi | Nada; frutas de medio | | CC | Juggling | Motosierra | Campana / herradura | | DD | shoes | Triciclo rojo | Nada; low fruit | | EE | Ball | Globo rojo | Nada | | FF | Square | Cerebro | Nada (antes una forma) | | GG | Circle | Ticket | Nada (antes una forma) | | BN | Bonus / diamond | Diamante roto + BONUS | Diamante del título + scatter |

Los nombres Square/Circle/Juggling/shoes son la prueba: mejoraron los símbolos encima de la plantilla; el electricista interno no reetiquetó los cables.

7. Cómo se mueven

Original. Figuras quietas que bajan. Lujo en el pintado estático y el marco. Blur de carrete genérico. Win = brillo / línea / recuento. No hay muñeco articulado por símbolo.

Nuevo. Cada símbolo es un actor:

  1. idle — vive en loop;
  2. spin — foto borrosa (Joker_Blur, Seal_Blur, …);
  3. land — vuelve el muñeco;
  4. win — ~4 s, sin loop, el personaje actúa;
  5. nowin — foto quieta más chica;
  6. paytable — miniatura *_Small.png.

Líneas de pago: seis coreografías Spine (payline0…payline5), no un trazo amarillo. Wild interno WD. Posiciones de carrete x: -546, -278, 0, 277, 546. Celda ~200×190.

Cambio. El original es un álbum de figuritas de lujo. El clon es un teatro de títeres. Por eso los símbolos se sienten considerablemente mejores: no es solo más 3D, se mueven como personajes.

8. Luces y UI extra

Original. Luces de teatro cálidas en el arco. El oro ya brilla.

Nuevo. Luz de marco, glow al girar, blur de carrete propio, sombra, fondo vertical para celular, neblina verde en el arco. El tablero es un objeto oscuro que emite púrpura.

Cambio. El original ilumina desde el edificio. El clon ilumina desde el show.

9. Textos

Original. HUD en español. Banner de scatter en español. Logo en inglés.

Nuevo. Motor i18n (el launch de ejemplo va en inglés, moneda ARS). Claves HorrorCircus_1… (reglas, buy). Ticket en inglés de feria.

10. Lo que no cambiaron (esqueleto)

  • Cinco carretes × tres visibles.
  • Símbolos de tamaño de celda.
  • Líneas de pago.
  • Wild WD.
  • Scatter que abre extras.
  • Spin derecha, menú izquierda, plata abajo.
  • Autoplay, info, sonido on/off.
  • ADN joker + diamante.

Misma máquina, otro espectáculo adentro.

11. Cómo se hizo el recambio (lectura no técnica)

  1. Original = maniquí de traje dorado, frutas de vidrio, letrero Joker's Diamond.
  2. Plantilla de circo con cajones llamados malabares, zapatos, círculo, cuadrado, foca.
  3. Un artista más fuerte pintó encima: malabares → motosierra, zapatos → triciclo, círculo → ticket, cuadrado → cerebro, foca → mono zombi, joker del logo bajó al carrete hecho monstruo, diamante se partió y dice BONUS.
  4. Nadie renombró los cajones.
  5. Marionetas (respiran, ganan, se nublan) + banda con aria por personaje.
  6. Teatro dorado → carpa. Marco beige-oro → tambor azul ensangrentado.

Por eso “mejoras considerables de símbolos” pega, y “algunos leves cambios de look” no: el tema entero es otro show. Lo leve es el chasis.

12. Límites de evidencia

  • El original no entrega figuritas sueltas (paquete cerrado). Comparación de stills = pantalla real.
  • El clon en headless no terminó de pintar el HUD; símbolos/fondo/sonido = CDN + JSON.
  • Audio del original no se pudo bajar. Comparación de oído = familia de producto vs partitura medida del clon. Ver 02-audio-dinamico.md.

Audio dinámico

Fuente: 02-audio-dinamico.md

Audio dinámico — lo que hace premium al clon

El look no se termina en el dibujo. En Horror Circus el sonido está dirigido: el motor decide qué pista entra, cuándo, a qué volumen, y cuál pisa a cuál, según lo que acaba de pasar en el tablero.

Fuentes medidas (clon vivo):

  • Partitura: /tmp/hc-cmp/axion-live/json/Sounds.json
  • Lista de archivos: Manifest.json → assets/sounds/Joker_Sounds/*
  • CDN: https://games.stage.axiongames.io/HorrorCircus/game/assets/sounds/Joker_Sounds/<nombre>.ogg
  • Plantilla: /opt/translaxion/data/slotre/horrorcircus-template/game/Manifest.json + game/Sounds.json
  • Config: "winSounds": "all"
  • Duraciones: ffprobe sobre los ogg vivos (2026-10-28)

La carpeta se llama Joker_Sounds: cicatriz del original. El contenido ya es de circo de terror.

---

Original (Joker’s Diamond) — familia de oído

No se pudo extraer el pack de audio (va cerrado). En esta familia el oído es genérico de casino:

  • tema de teatro que queda ahí;
  • whoosh al girar;
  • clack igual en cada carrete;
  • sting de “ganaste” más o menos el mismo si salió uva o 7;
  • clicks de menú.

Cada cosa suena. Casi nada cuenta una historia. El 7 no tiene voz. El diamante no aterriza distinto. El recuento de plata no tiene motor propio.

---

Clon — un director, no una playlist

Varias capas a la vez, con reglas de quién manda.

| Capa | Archivo vivo | Duración medida | Cómo se usa | |---|---|---|---| | Cama | Main_BGM.ogg | 124.88 s (~2 min), loop | Empieza en juego base (states.basespin). No se reinicia en cada spin | | Motor de carrete | Reel_Spin.ogg | 4.20 s, loop | Play en reels.start_spin, stop en reels.stop_spin | | Golpe de parada | Reel_Stop.ogg | 0.22 s | Uno por carrete, en cascada | | Excepción scatter | Bonus_Landing.ogg | 1.34 s | Si el símbolo es BN, reemplaza el clack (priority: 1) | | Aria payaso | Win_Joker.ogg | 3.67 s | symbolWin_AA | | Aria mono | Win_Monkey.ogg | 4.00 s | symbolWin_BB | | Aria sierra | Win_Saw.ogg | 4.00 s | symbolWin_CC | | Aria globo | Win_Balloon.ogg | 4.00 s | symbolWin_EE | | Aria diamante | Win_Diamond.ogg | 4.00 s | symbolWin_BN | | Línea / win chico | Payline_Win.ogg | 4.00 s | win0 y win1 (mismo file; cambia el recuento) | | Big | Big_Win.ogg | 8.00 s | win2 (15×–30×) | | Huge | Huge_Win.ogg | 8.03 s | win3 (30×–45×) + pre-win 3 s | | Mega | Mega_Win.ogg | 8.00 s | win4 (45×+) + pre-win 3 s | | Cierre de premio | Win_Stop.ogg | 2.00 s | Cadencia de cierre | | Contador | Counterloop.ogg | 4.82 s, loop, volume 0.3 | Mientras sube el número | | Cierre de contador | Counterloop_Stop.ogg | 0.89 s | Cuando el número llega | | Click de panel | UI_Button.ogg | 0.75 s | Casi todo el menú | | Gatillo de spin | Spin_Button.ogg | 0.10 s | Solo el botón de girar |

No suenan todos siempre. Suenan los que el resultado merece, en orden de número de circo.

---

Un spin, segundo a segundo

0.00 s — botón. spinButton en button.spin. No usa el click del menú. El oído lee “acción”.

0.00 s — la cama sigue. basegameBgm tipo bgm, loop, evento states.basespin. Si cortaran la música en cada spin, se sentiría barato.

Junto con el giro — motor. reelSpin loop atado a estado, no a un timer fijo. Turbo más corto = el loop se corta en reels.stop_spin.

Parada, carrete por carrete. Cada columna pide reelStop (0.22 s). Cinco clacks en escalera = “máquina mecánica”.

Excepción: cayó el diamante. reelStopSounds: default reelStop; BN → bonusLanding con prioridad 1. El diamante anuncia que aterrizó aunque el resto siga girando. Un scatter silencioso se siente de adorno; uno con voz propia se siente evento.

Sin premio. Motor off, clacks, cama. No hay falsa fanfarria.

Con línea. Dos cosas a la vez:

  1. voz del personaje si es de los caros;
  2. tema de premio según el múltiplo.

Las animaciones de win de símbolo duran 4 s. Las arias duran ~3.7–4.0 s. El oído y el títere terminan juntos.

---

Escalera de “cuán gordo fue”

Cinco tramos según veces la apuesta (winSounds en Sounds.json):

| Id | Rango | Stage | Tipo | Recuento | Monedas | Sprite | Extra | |---|---|---|---|---|---|---|---| | win0 | 0–1× | win0 → Payline_Win | normal | no | no | no | Propina: no montan show | | win1 | 1–15× | win1 → Payline_Win | normal | sí | no | sí | Mismo file; prende el contador | | win2 | 15–30× | win2 → Big_Win | big | sí | sí | sí | Animación bigwinStyle | | win3 | 30–45× | win3 → Huge_Win | big | sí | sí | sí | pre_win: 3 | | win4 | 45×+ | win4 → Mega_Win | big | sí | sí | sí | pre_win: 3, end: -1 (sin techo) |

Detalles de ritmo:

  • win0 vs win1 comparten archivo. La diferencia es si encienden el contador. Un premio chico no te come 8 s de ópera.
  • Desde Big: coins (lluvia, CoinSettings.json, hasta 52 partículas) + bigwinStyle.
  • Huge/Mega: 3 s de “se viene” antes del cartel.
  • sound_sprite: true en win1…win4: el motor recorta el bloque según cuánto tarde el número. No es un mp3 que se reproduce entero sí o sí.
  • Al terminar: Win_Stop o Counterloop_Stop. Hay cierre, no corte seco.

---

Contador de plata

counterloop: loop ~4.8 s, volumen 0.3 a propósito. Cubre 2 s o 12 s de recuento sin costurón. counterloopStop: el oído lee “la máquina terminó de contar”.

Está atenuado para no pelearse con Big/Huge/Mega ni con la aria. En el original, o no hay recuento audible, o es un beep único. Acá el recuento es un instrumento.

---

Arias: no todos merecen voz

Solo cinco símbolos, los de arriba del cartel. Mapeo Manifest:

| Código | Stage | Archivo | Duración | |---|---|---|---| | AA | symWinAA | Win_Joker | 3.67 s | | BB | symWinBB | Win_Monkey | 4.00 s | | CC | symWinCC | Win_Saw | 4.00 s | | EE | symWinEE | Win_Balloon | 4.00 s | | BN | symWinBN | Win_Diamond | 4.00 s |

Sin aria: DD triciclo, FF cerebro, GG ticket. Pagan con el win de línea. Si todos tuvieran jingle, ninguno pesaría.

Disparo por identidad (symbolWin_AA → Win_Joker), no un pool al azar. En una tirada gorda se mezclan aria + tema de múltiplo + contador bajito. Tres capas, un momento.

---

UI casteada

Casi todo el menú (info, apuesta, turbo, auto, historial, buy, mute, replay) comparte menu → UI_Button. El spin no: spinButton → Spin_Button.

Dos familias de click: panel vs gatillo. Mute: button.sound_music_off corta música y sfx.

---

Eventos (partitura, no archivos)

De Sounds.json sounds.*.events:

| Cue | Play | Stop | |---|---|---| | basegameBgm | states.basespin | — (loop) | | spinButton | button.spin | — | | reelSpin | reels.start_spin | reels.stop_spin | | menu (y familia) | button.menu / button.buy / button.bet / … | — |

reelStop y bonusLanding no van por button.*: van por contenido del carrete (reelStopSounds).

Las arias no listan events.play en el JSON: las dispara el engine cuando el pay step identifica el símbolo.

---

Comparación directa

| Momento | Original | Clon | |---|---|---| | Música | Cama de teatro genérica | Tema ~2 min, loop, no se reinicia por spin | | Girar | Whoosh típico | Loop atado a inicio/fin reales | | Parar | Mismo clack | Clack salvo BN → sting | | Símbolo que gana | Mismo sting para uva o 7 | 5 voces; low van con la línea | | Tamaño del premio | Un “ganaste” | 5 escalones + anticipación Huge/Mega | | Recuento | Poco o nada | Loop suave + cierre, calzado al número | | Monedas | Raras | Desde Big, con el audio de Big | | Botones | Un click | Panel vs gatillo | | Timing con el dibujo | Audio por su lado | Aria ~4 s = animación ~4 s |

El original acompaña. El clon narra el resultado.

---

Por qué se siente premium

El audio está enchufado a hechos del spin:

  1. Estado (base → cama).
  2. Movimiento (start/stop → motor).
  3. Contenido del carrete (BN → aterrizaje).
  4. Quién pagó (AA/BB/CC/EE/BN → aria).
  5. Cuánto pagó (escalera win0…win4).
  6. Cuánto tarda el número (contador loop + sprite recortable).
  7. Anticipación (pre_win 3 s).
  8. Cierre (Win_Stop / Counterloop_Stop).

Eso hace un slot AAA: el oído explica el tablero antes de terminar de leer los números.

---

Implicancia para SpAIne

Generar “tema horror” o “tema caramelos” no es poner un mp3 de fondo. Es respetar o reescribir estas reglas: qué pista entra en cada hecho, quién pisa a quién, arias que duren lo mismo que el títere.

ElevenLabs llena los atriles. Sounds.json es el director. Forge es la sala.

El motor Magix de Forge hoy empaqueta sounds.ogg con 3 cortes (bgm, big_win, bgm_freespin). Arena Zeus tiene 9 one-shots. Ninguno de los dos es este show. Ver 03-que-falta.md.

Checklist de oído (piloto)

  • La cama no salta al dar spin.
  • El motor de carrete arranca y muere con el movimiento.
  • Cinco clacks; el diamante no clackea, canta.
  • Aria ~4 s junto con la cara de win.
  • Premio chico ≠ ópera de 8 s.
  • 15× / 30× / 45× cambian de pista; Huge/Mega tienen 3 s de “se viene”.
  • El contador se oye abajo, no tapa.
  • Hay cierre, no corte seco.
  • Mute corta música y sfx.

Si eso no se oye jugando el deploy, no está hecho.

Qué falta

Fuente: 03-que-falta.md

Qué falta para lograr algo así

Para llegar al nivel del clon (tema completo + títeres + director de audio) no falta “un mp3 más”. Falta una fábrica que respete la partitura y deje jugar el resultado.

---

Ya está (no inventar)

| Pieza | Dónde | Alcance real | |---|---|---| | Grabbr capture + unpack Unity | /opt/hallallow/apps/game-images-api | Texturas, AudioClip, UHTSpine 3.7, NGUI. Galería pública. | | Forge deploy / gems / RGS | /opt/forge | Juegos jugables. Magix gems, Arena, RGS. | | Imagine stills | imagina.jailbroken.tech | Símbolo, fondo, marco, logo. | | ElevenLabs | secrets/elevenlabs.env | Genera ondas. No genera la orquesta. | | Partitura de este slot | Sounds.json + Manifest.json | 18 cues, escalera, stop BN, 5 arias, contador 0.3. | | Plantilla Horror Circus | /opt/translaxion/data/slotre/horrorcircus-template/ | El motor ya dirige el audio. El clon cambió archivos y dejó reglas. | | Cookie hall_sala | ecosistema | Auth unificada. |

Chrome headed Chile :9336 (Grabbr Stake): no matar. Reiniciar solo game-images-api.

---

El atajo de v1 (el que sí se siente premium)

No generar un payaso de 55 huesos ni un mezclador nuevo.

Tomar un slot que ya tenga director (este Horror Circus u otro Axion/Pixi con Sounds.json) y:

  1. dejar intactas las reglas (eventos, prioridades, duraciones, escalera);
  2. cambiar dibujos, atlas, oggs, textos;
  3. reempaquetar con id nuevo;
  4. desplegar en Forge y jugarlo;
  5. recién ahí el zip.

Eso es lo que hizo el clon (chasis 5×3 joker-diamante → circo de terror) y es lo único que en un primer corte va a sonar a proveedor.

Si el piloto sale sobre Magix (sounds.ogg de 3 cortes) o Arena Zeus (9 one-shots), aunque ElevenLabs suene lindo, el juego se oye plano. Pintar encima de un motor mudo no llega a esto.

---

Huecos

1. El producto SpAIne — en disco (pipeline 13 inclusive)

Grabbr tab SpAIne + Forge /spaine/* + Genie :8765/:5173. Inventory/validate/hydrate/mockup/apply/zip/gen-stills/gen-sfx/atlas-repack cableados. Imagine pinta. ElevenLabs por cue. Atlas-repack 38 placements.

Pipeline 13 (2026-10-28, smoke PASS): catalog 8 casilleros → select QUÉ/CÓMO → outbox Spline (classify+original+brief+mcp-request) → claim → inbox v2 → approve → recompile zip 6 110 526 bytes. Estado recompiled. Chrome :9336 PID intacto.

Sigue abierto: variantes N a elegir en UI, SAM slice por slot, deploy temporal jugado en browser este corte, Spline.app desktop MCP vivo en la Mac (packs listos en outbox; el stdio corre en Darwin).

2. Capture del motor correcto

Grabbr está pensado para Pragmatic/Unity. Horror Circus es Pixi + JSON + Spine 4.1 + ogg sueltos.

Hoy ese pack se bajó a mano. Falta un capture que deje un árbol jugable:

Manifest · Sounds.json · Symbols.json · Reels.json · webp · Spine json+atlas · ogg.

Si el zip no arranca en Forge, el audio premium no se puede verificar.

3. Audio — archivos sí, director no

| Pieza | Estado | Falta | |---|---|---| | Clave ElevenLabs | Hay | — | | Sprite Magix 3 cortes | Forge lo hizo en gems | Corto de más para este show | | Lista de cues Horror Circus | Documentada | Generador por cue con duración fija | | Loops (cama, motor, contador) | No | Empalme sin costurón | | Escalera win0…win4 | En JSON | Respetarla; no un único win.mp3 | | Aria por símbolo | 5 mapeos | Carácter (sierra ≠ globo) calzado a 4 s | | Stop BONUS pisa clack | En reelStopSounds | No romper al regenerar | | Contador 0.3 + cierre | En JSON | Mezcla: que no mate aria ni Big | | Empaque | Magix = 1 ogg sprite | Este juego = muchos ogg + Manifest | | Mezclador en deploy | Engine Axion ya lo tiene | No reemplazarlo por Howler de 3 cortes |

QA: una tirada donde se oiga gatillo → motor → clacks → (si BN) sting → aria + tema de múltiplo + contador bajito → cierre. Si no pasa en el browser, no está hecho.

4. Imagen — cerca, incompleta

Imagine cubre stills. Falta el juego de caras por símbolo: quieto, blur de giro, miniatura, skins del atlas Spine.

Un PNG lindo que no entra en el atlas = el títere se parte o muestra el dibujo viejo.

Fondo + tambor + logo + HUD van en el mismo Apply. Solo símbolos = parche (el original vs este clon lo demuestra).

5. Movimiento — techo técnico

| Camino | Factible en v1 | Nota | |---|---|---| | Reusar huesos, cambiar piel | Sí | Camino del clon | | Blur generado del still | Sí | Filtro o segundo pass Imagine | | Spine de pocos huesos (globo, ticket) | v1.5 | | | Inventar idle/win de 40–55 huesos | No | Imagine hace video, no joker.json 4.1 |

Sin marionetas, el techo es Joker's Diamond: figuritas premium quietas.

6. Cerrar el círculo jugable

Pedido cerrado: Apply → repack → deploy temporal Forge → se ve y se juega → zip (gems + capture).

Falta:

  • bundle id nuevo, originales intocados;
  • host temporal ampliando Forge (no pisar serve.mjs / Caddy);
  • RGS de ese engine girando de verdad (no un mp4);
  • dos descargas.

Hasta que no gire con el audio encima, es teatro.

---

Orden de construcción (qué ya corrió / qué sigue)

Hecho en disco: ingest piloto, inventory, validate, mockup tablero, gen-stills/sfx, atlas-repack, zip, catalog/select/outbox/approve/recompile.

Sigue:

  1. Capture Pixi automático (hoy el árbol piloto es hydrate a mano / src ya en job).
  2. Variantes N + pick en Grabbr.
  3. Deploy temporal Forge jugado (RGS Axion, no Magix).
  4. QA oído en browser (02-audio-dinamico.md).
  5. Spline.app en la Mac importando el outbox de verdad (packs ya se generan acá).

No en el primer corte: motor de audio nuevo, Spine desde cero, Adobe mode, clonar Magix a 3 cortes y fingir que es esto.

---

Piloto recomendado

Base: Horror Circus Axion 1.0.23 (director ya existe, análisis hecho). Trabajo: reskin de tema completo + recambio de cues, reglas intactas. Éxito: checklist de oído + tablero jugable en Forge + zip dual + original intacto.

Piloto confirmado: Horror Circus 1.0.23. Flujo de producto: 00-producto.md. Puente Spline: 13-pipeline.md.

Puntos de producto

Fuente: 04-puntos-producto.md

Punto por punto — producto SpAIne

Cada punto tiene cuatro capas:

| Capa | Qué responde | |---|---| | Actual | Qué hay hoy en disco / en el ecosistema, medido | | Técnica | Nombres, rutas, contratos, formatos | | No técnica | Qué significa para vos o para el jugador | | How-to | Cómo se hace hoy (CLI / HTTP / Grabbr) y en el juego |

---

P1. Dónde vive SpAIne

Actual. Módulo en disco: /opt/forge/spaine montado en local/serve.mjs via handleSpaine (:8766). Plugin ha-spaine. Grabbr tab SpAIne + proxy /v1/spaine/*. Docs /opt/forge/docs/spaine/ 00–13. Genie aparte :8765/:5173. Imagine :8791.

Técnica. Ampliar Forge: no rewrite de serve.mjs núcleo, public/index.html, bulk/, arena-reels/, rgs/, Caddy Host. Jobs en spaine/jobs/<id>/. Grabbr llama HTTP a Forge.

No técnica. SpAIne es el taller. Grabbr es la vidriera. Spline Mac es el banco de edición visual de los QUE.

How-to. node /opt/forge/spaine/cli.mjs status · Grabbr modo SpAIne · ctl.sh pipeline.

---

P2. Capture de entrada

Actual. Grabbr POST /v1/capture baja tráfico (PP Unity, job histórico 1164f573806a). Horror Circus no salió de ese capture: dump /tmp/hc-cmp/axion-live/ → hydrate → jobs/horrorcircus-1.0.23/src. Pipeline start sin URL salta Grabbr si src/ ya está. ingest --capture=<id> sí pega el zip Grabbr al apartado.

Técnica. PP = Unity WebGL packs. Axion Horror Circus = Pixi loader (Manifest.json) + webp sueltos + Spine 4.1 (*.json + Symbols.atlas + Symbols.webp) + ogg en Joker_Sounds/. Un capture útil tiene que conservar árbol jugable, no una galería plana.

No técnica. Si el zip no se puede volver a abrir como juego, SpAIne no tiene “base real” para los mockups. Es como pedirle a un sastre que rediseñe un traje con una foto borrosa.

How-to.

  1. Grabbr capture (PP hoy; Pixi Axion = hueco) o cli.mjs hydrate del dump.
  2. cli.mjs ingest --capture=<grabbrId> si el zip viene de Grabbr.
  3. cli.mjs catalog escribe catalog.json en el apartado.
  4. Verificar Manifest + Sounds + Symbols + Reels + atlas + oggs. Ese árbol es el input.

---

P3. Pedido (prompt + selección + refs)

Actual. Grabbr tab SpAIne: chips QUÉ (AA–BN del catalog) + textarea CÓMO + “Send selected to Spline”. HTTP POST /spaine/select {codes,how} → select.json. Outbox por código.

Técnica. Input: job Forge + codes[] + how string. Opcional Imagine/ElevenLabs por CLI. Spline Mac recibe classify+brief+original. Refs extra (inbox Forge) siguen el contrato de 00-producto.md.

No técnica. Marcás el payaso (AA) y escribís “neon clown, keep silhouette”. El pack que baja la Mac es ese original + ese pedido, no un prompt genérico.

How-to. cli.mjs select --codes=AA --how='…' luego spline-pack. En Grabbr: chips + CÓMO + Send.

---

P4. Mockups sobre la base real

Actual. cli.mjs mockup → jobs/horrorcircus-1.0.23/mockups/board-current.png (fondo+marco+stills del árbol). Grabbr GET /v1/spaine/mockup.png. Variantes N no están en UI. Screenshot original HPlay: /root/hplay-hc.png.

Técnica. Componer: BG_Background.webp + Reel.webp + 15 celdas (5×3) con los stills AA…BN a ~200×190, HUD placeholder. Las variantes son N de esas composiciones, no N PNG de un símbolo suelto. El pedido del operador: las mockups tienen que responder al prompt.

No técnica. Ves el slot vestido con la idea, como un figurín sobre el maniquí de verdad, y elegís. Recién ahí se cose el traje entero.

How-to.

  1. Usuario elige si quiere variaciones y cuántas.
  2. SpAIne pinta N tableros 16:9 usando el fondo/marco del job (o los nuevos si el pedido era tema completo).
  3. UI: pick one (o pick & merge grupos).
  4. Ese pick es el único que entra a Apply.

---

P5. Apply → jugar → zip

Actual. apply copy-on-write src/ → dst/ + SPAINE-BUNDLE.json (id nuevo). recompile = atlas-repack + zip (gen/zip/horrorcircus-1.0.23.zip, 6.1 MB medido). Approve de Spline pisa still en dst/. Deploy temporal jugado en browser: todavía hueco. Gems Magix existen en Forge; no son este piloto.

Técnica. Copy-on-write del árbol fuente → bundleId nuevo. Original intocado. Deploy temporal = el mismo host Forge, path distinto. RGS del engine Axion/HorrorCircus (no el lines5x3 de Magix, salvo que el piloto sea un gem Magix — no es el caso de este análisis). Descargas: (a) árbol tipo capture zip + unpacked; (b) gem Magix solo si el engine destino es Magix.

No técnica. Primero lo jugás. Si el payaso se mueve y la sierra suena en el win, ahí bajás el pack. Si bajás antes, estás comprando un zip ciego.

How-to. Orden: catalog → select QUÉ/CÓMO → (Spline approve o Imagine/atlas) → apply → recompile zip. Sounds.json intacto. Original src/ no se pisa. Jugar el dst/ en Forge = siguiente corte.

---

P6. Modelos y audio APIs

Actual. Imagine Lab vivo (grok-imagine-image-2.0). cli.mjs gen-stills pintó gen/stills/AA-Joker.png. gen-sfx UI_Button ogg. ElevenLabs en secrets/elevenlabs.env. Genie Generate usa Imagine (SAM/FAL slice HOLD). Grok/Claude suscripción. Magix gems = sprite 3 cortes: otro engine.

Técnica. Horror Circus no es Howler sprite de 3 cortes. Es N ogg + Manifest.sound[].name + Sounds.json. Mezclar el pipeline Magix aquí aplasta al director. Local LLM: diferido.

No técnica. Tenemos pintor y tenemos cantante. Nos falta el director de orquesta en la fábrica (el juego piloto ya lo tiene adentro).

How-to. v1: ElevenLabs un cue = un ogg, nombres del Manifest. gen-sfx --stems=UI_Button. Stills gen-stills --codes=AA. Atlas aparte (Genie o atlas-repack). LLM plan/crítica, no reescribe Sounds.json.

---

P7. Spline Mac (paso intermedio)

Actual. Outbox/inbox en jobs/<id>/bridge/. Smoke AA: classify spine-atlas-part, original.webp + blur, brief.md, mcp-request.json, zip 92 721 bytes. Approve copió v2 a dst/assets/images/symbols/Joker.webp. Desktop MCP = Spline.app en Darwin; Arena usa hosted mcp.spline.design.

Técnica. Ver 13-pipeline.md. Estados cataloged → selected → spline_ready → editing → review → recompiled. Reject → editing.

No técnica. La Mac no adivina el slot: le llega el original clasificado y el CÓMO. Vos ves el cambio en Spline y aprobás o mandás a rehacer.

How-to. Grabbr Send to Spline → bajar /v1/spaine/spline/outbox/AA.zip → Spline.app → export v2 → inbox --file= o POST → approve / reject.

Puntos visuales

Fuente: 05-puntos-visual.md

Punto por punto — visual y movimiento

Capas: Actual / Técnica / No técnica / How-to. Caso: HPlay 13121200 Joker's Diamond vs Axion Horror Circus 1.0.23.

Loader de imágenes (clon): Manifest.json preload.images — el nombre es lo que el motor pide (AA, Bg, reelhose); el archivo es lo que ves.

---

V1. Fondo (escenario)

Actual. Original: teatro dorado (captura /root/hplay-hc.png). Clon: assets/images/BG_Background.webp (171588 bytes en cache). El mismo archivo se registra dos veces como Bg y BaseGame_Bg. Hay Potrait_Background.webp + black_bg_potrait.webp para vertical.

Técnica. Stage names: Bg, BaseGame_Bg, portrait_Bg, portrait_Bg_screen. No es Spine; es textura de fondo a pantalla. Relación 16:9 de Config.json (1920×1080).

No técnica. Es el teatro. Si no lo cambiás, el payaso nuevo parece un sticker pegado en el casino viejo.

How-to (juego). El loader pinta Bg detrás de todo.

How-to (reskin). Generar un 1920×1080 (o el tamaño del webp actual) con Imagine, misma paleta que símbolos. Reemplazar BG_Background.webp sin cambiar el name Bg. Generar también el portrait o el vertical se verá el fondo viejo. No hace falta tocar JSON.

---

V2. Marco / tambor de carretes

Actual. Original: ventana beige-oro. Clon: Reel.webp (name: reelhose), 119368 bytes, cinco fajas azul + sangre + aro violeta.

Técnica. Textura estática bajo los símbolos. Los símbolos se posicionan en Reels.json: x = -546, -278, 0, 277, 546; y = -150; symbol_size 200×190; symbol_above/below = 1 (una celda extra arriba y abajo para el spin). Luces aparte (Spine reelLight, ReelSpinGlow, reelBlure).

No técnica. El mueble de la máquina. En el clon está sucio a propósito. Un marco de joyería con motosierras se siente falso.

How-to (reskin). Medir el Reel.webp actual, generar uno nuevo con cinco columnas alineadas a esos x. Reemplazar archivo, name reelhose intacto. Si el tambor nuevo no calza con 200×190, los símbolos flotan o se recortan: no estirar a ojo, calcar la geometría.

---

V3. Logo

Actual. Original: logo 2D “JOKER’S DIAMOND” en el HTML/canvas del juego. Clon: Spine Logo.json (3 huesos, anim animation), registrado GameLogo1.

Técnica. No es un PNG suelto en preload.images. Vive en preload.spine.anim.assets. Textura del logo está en el atlas de UI (spine.atlas / spine.webp), no en Symbols.atlas.

No técnica. El nombre del espectáculo. En el clon además está escrito en el arco del fondo (CIRCUS OF HORROR), así que hay dos logos: el de UI y el pintado en el escenario.

How-to (reskin). (a) Pintar el texto en el fondo nuevo. (b) Reemplazar attachments del Logo.json / página de spine.atlas. Si solo cambiás el fondo y el logo Spine sigue diciendo otra cosa, hay dos marcas a la vez.

---

V4. Paleta

Actual. Original: oro/beige/uva/rojo7. Clon: púrpura, verde baba, rojo sangre, naranja sierra, rosa cerebro, azul diamante.

Técnica. No hay un palette.json. La paleta está distribuida en cada webp, en luces Spine, en tipografías del ticket y en el cartel del fondo. HUD del original es violeta+oro (captura); el clon usa luces lightFrame (anims stop/play/win/bigWin/hugeWin/megaWin).

No técnica. El clima. Un solo símbolo “horror” sobre oro = disfraz. Todo el set en la misma temperatura = show.

How-to. Extraer 5–7 colores del pedido o de una ref. Pasárselos a todas las generaciones (fondo, marco, 8 símbolos, blurs, HUD). Un prompt suelto por símbolo sin paleta compartida parte el set.

---

V5. HUD (botones, saldo, buy)

Actual. Original: tres círculos violeta-oro a la izquierda, spin verde a la derecha, barra de texto abajo, banner de scatter arriba. Clon: misma disposición lógica; buy feature; skins en Spine box.json (69 huesos, anims AA, BB, … GG, BN y *_P portrait) + Upper_Desktop.json.

Técnica. box.json no es el símbolo: es el marco/caja de UI que puede mostrar estados por símbolo. lightFrame.json sigue la escalera de win (win / big / huge / mega). Textos de reglas en Pays.json con placeholders {%HorrorCircus_1%}. i18n: 191 strings en /opt/translaxion/data/exports/horror-circus.translations.json.

No técnica. Las manos del jugador. Si movés el spin, el cuerpo no reconoce la máquina. Si solo le cambiás el color, sigue siendo “su” slot.

How-to (reskin v1). No rediseñar layout. Recolor / retextura de box + lightFrame + Upper_Desktop alineado a la paleta. No traducir a ciegas: las claves HorrorCircus_* se rellenan por idioma. Buy bonus: no borrar el botón; es parte del producto clon.

---

V6. Casilleros de símbolos (el truco de los nombres)

Actual. El motor habla códigos AA…GG+BN. Los archivos se llaman como la plantilla vieja (Joker, Seal, Juggling, shoes, Ball, Square, Circle, Bonus). El atlas Spine ya usa nombres nuevos: JOKER, MONKEY, SAW, BIKE, BALLOON, BRAIN, TICKET, DIAMOND.

Técnica. Tres capas de nombre que no coinciden:

| Código | Manifest name + webp | Atlas carpeta | Qué se ve | |---|---|---|---| | AA | Joker.webp | JOKER | Payaso terror | | BB | Seal.webp | MONKEY | Mono zombi | | CC | Juggling.webp | SAW | Motosierra | | DD | shoes.webp | BIKE | Triciclo | | EE | Ball.webp | BALLOON | Globo | | FF | Square.webp | BRAIN | Cerebro | | GG | Circle.webp | TICKET | Ticket | | BN | Bonus.webp | DIAMOND | Diamante BONUS |

Symbols.json: cada código tiene idle (spine .symbol_atlas.idle), win (.start, duration 4, reel_layer 1), land (= idle), spin (image AA_Blur…), nowin (image AA…), payline_info (sprite Joker_Small.png…).

No técnica. El cajón se llama “zapatos”, adentro hay un triciclo. El electricista no cambió la etiqueta; el artista cambió el objeto. SpAIne tiene que escribir en el cajón, no inventar cajones nuevos.

How-to. Nunca renombrar AA ni las keys de Symbols.json en v1. Reemplazar:

  1. assets/images/symbols/<webp> (still nowin / fallback).
  2. assets/images/BlurSymbols/<webp>_Blur.
  3. Recortes en Symbols.atlas con los mismos nombres de región (JOKER/..., BIKE/PEDAL, …).
  4. Miniaturas SmallSymbols / *_Small.png.

Si cambiás el name AA en Manifest y no el resto, el carrete queda vacío.

---

V7. AA — Joker / payaso

Actual. Original: joker de marca en el logo, no como celda en esa captura. Clon: Joker.webp; Spine joker.json Spine 4.1.24, 55 huesos, 38 slots, anims idle, start, Static, Static_Blur, win. Aria Win_Joker 3.67 s.

Técnica. Symbols.json AA idle/land → jokerJson.symbol_atlas.idle scale 0.0973 loop; win → jokerJson.symbol_atlas.start duration 4. El scale chico es porque el skeleton está dibujado grande.

No técnica. La mascota. En el clon bajó del letrero al carrete y se volvió de miedo.

How-to. No regenerar 55 huesos. Pintar las partes del atlas carpeta JOKER/ (cara, gorro, cascabeles, cuello) y dejar joker.json igual. El still Joker.webp cubre nowin y mockups. Calzar paleta violeta/rojo/verde del gorro con el fondo o va a “flotar”.

---

V8. BB — Seal / mono

Actual. Seal.webp; seal.json 40 huesos; atlas MONKEY; aria Win_Monkey 4.00 s.

Técnica. Mismo patrón de stages que AA, scale idle 0.0913. Paytable Seal_Small.png.

No técnica. El segundo protagonista. El archivo dice foca; el oído dice mono.

How-to. Reskin carpeta MONKEY/ + still Seal.webp + blur. No renombrar a Monkey.webp en v1 (rompería Manifest BB url) salvo que actualices Manifest y SmallSymbols juntos — mejor no.

---

V9. CC — Juggling / sierra

Actual. Juggling.webp; Juggling.json 12 huesos; atlas SAW; aria Win_Saw 4.00 s.

Técnica. Scale idle 0.1882 (más grande que joker: el skeleton está modelado más chico). Win 4 s.

No técnica. El “objeto agresivo” del show. Antes eran malabares.

How-to. Reskin SAW/ (cuerpo naranja, cadena, cara). 12 huesos = la cadena y la carcasa se pueden mover; si pintás un único PNG y el attachment de la cadena sigue siendo la sierra vieja, se ve un híbrido. Hay que cubrir todas las regiones SAW/ del atlas.

---

V10. DD — shoes / triciclo

Actual. shoes.webp; shoes.json 10 huesos; atlas BIKE (BACK WHEEL, PEDAL, MASA, Slime pedal, …). Sin aria.

Técnica. Scale 0.1929. Paytable shoe_Small.png (singular). Win usa spine igual, pero el audio cae al Payline genérico.

No técnica. Low de personaje. El triciclo de payaso. Silencioso a propósito.

How-to. Reskin BIKE/ pieza a pieza (ruedas, pedal, baba). How-to de audio: no inventar symbolWin_DD en v1 si querés el mismo ritmo; el director no lo espera.

---

V11. EE — Ball / globo

Actual. Ball.webp; Ball.json 2 huesos; atlas BALLOON (incluye BOOM/SAW-idle/boom_##### — hay FX de reventar). Aria Win_Balloon 4.00 s.

Técnica. Scale 0.211. Pocas articulaciones: el “acting” es scale/glow/boom, no marioneta.

No técnica. El objeto simple más caro de pintar (parece foto). Cuando gana, puede reventar.

How-to. Still hiperreal + regiones BALLOON/ (globo, glow, ojos, nariz, frames boom). Si el boom sigue siendo el globo rojo y el idle es azul, el win se ve roto. Tratar boom como parte del símbolo.

---

V12. FF — Square / cerebro

Actual. Square.webp; Square.json 48 huesos (más que la sierra); atlas BRAIN. Sin aria.

Técnica. Muchos huesos = el cerebro está riggeado (baba / pliegues), no es un PNG rígido. El still miente de simple.

No técnica. Parece un low barato; por debajo es un personaje. Silencioso en el oído, vivo en el ojo.

How-to. Obligatorio pasar por atlas BRAIN/, no solo el webp. Si solo cambiás Square.webp, el idle Spine sigue mostrando el cerebro viejo.

---

V13. GG — Circle / ticket

Actual. Circle.webp; circle.json 3 huesos; atlas TICKET. Copy HORROR CIRCUS / ADMIT ONE. Sin aria.

Técnica. Casi sprite. El texto está en la textura, no en i18n. Cambiar idioma del HUD no cambia el ticket.

No técnica. La entrada al show. Es branding metido en un casillero low.

How-to. Si el reskin cambia el nombre del juego, repintar el texto del ticket (y el arco del fondo, y el Logo). Tres sitios. Olvidar uno = dos marcas.

---

V14. BN — Bonus / diamante scatter

Actual. Bonus.webp; diamond.json 9 huesos; atlas DIAMOND; aria Win_Diamond; aterrizaje Bonus_Landing prioridad 1.

Técnica. Symbols.json BN igual patrón, scale 0.2168. Reels.json reelStopSounds.BN. Buy feature HorrorCircus_54. Wild es WD (no hay webp WD en el preload de símbolos — el wild puede ser overlay / otro path).

No técnica. La puerta al extra. En ambos juegos el diamante es el “esto no es una uva”. En el clon está roto y dice BONUS para que se entienda solo.

How-to. Reskin DIAMOND/ + still + blur + Small Bonus_Small.png. No sacar la palabra BONUS si el pedido no pide otro idioma/tema de scatter. No tocar reelStopSounds si querés el sting de aterrizaje.

---

V15. Blurs de giro

Actual. Ocho webp en assets/images/BlurSymbols/*_Blur.webp, Manifest names AA_Blur…BN_Blur. Spine además tiene anims Static_Blur y un reelBlure.json por columna (A–E, play/stop).

Técnica. Symbols.json spin[].type = image stage = AA_Blur. Durante el spin el motor no usa la marioneta; usa la foto corrida. Al stop vuelve idle/land.

No técnica. El whoosh visual. Sin blur, el carrete se siente a trompicones (figuritas nítidas cayendo).

How-to. Generar cada blur a partir del still nuevo (motion blur vertical, misma silueta). Tamaño alineado al still. No reusar el blur del payaso para el cerebro.

---

V16. Miniaturas paytable

Actual. payline_info apunta a Joker_Small.png, Seal_Small.png, Juggling_Small.png, shoe_Small.png, Ball_Small.png, … Bonus_Small.png. Spritesheet SmallSymbols.json.

Técnica. Se ven en info/pays, no en el carrete. Escala ~0.4.

No técnica. La carta del menú de premios. Si el carrete es horror y el paytable sigue con malabares, el jugador cree que hay dos juegos.

How-to. Regenerar small de cada still (fit cuadrado). Actualizar el spritesheet SmallSymbols si es atlas, no dejar PNG huérfanos con el nombre viejo y el dibujo viejo.

---

V17. Atlas Spine de símbolos (el how-to más importante)

Actual. Symbols.atlas 17105 bytes, páginas Symbols.webp + Symbols_2.webp, size 2048², filter Linear. 781 líneas. Carpetas BALLOON, BIKE, BRAIN, DIAMOND, JOKER, MONKEY, SAW, TICKET.

Técnica. Spine 4.1 atlas text. Cada región: bounds, a veces offsets. Los skeletons (joker.json etc.) referencian nombres de attachment, no el webp suelto de Manifest. El still Joker.webp y el atlas JOKER/cara pueden divergir: uno es nowin, el otro es idle.

No técnica. El atlas es la caja de recortes con la que el títere se viste. Cambiar solo la foto de perfil y no los recortes = el muñeco sale medio viejo medio nuevo.

How-to v1 (piel).

  1. Exportar regiones actuales (recorte por bounds).
  2. Pintar cada recorte (Imagine / edición) mismo tamaño de bounds o actualizar bounds.
  3. Repegar en 2048² respetando nombres.
  4. Dejar joker.json / huesos / timelines.
  5. Probar idle y win: si un slot queda vacío, faltó una región.

How-to que no hacer en v1. Nuevo joker.json desde un video de Imagine. Spine 4.1.24, 55 huesos, meshes: no hay herramienta en el stack que lo emita bien.

---

V18. Luces, glow, big win, líneas

Actual.

| Spine | Huesos | Anims (idea) | |---|---|---| | reelLight.json | 41 | luz por carrete 1–6 play/stop | | ReelSpinGlow.json | 1 | glow por carrete 1–5 play/stop | | reelBlure.json | 1 | blur de columna A–E | | lightFrame.json | 10 | stop, play, win, big, huge, mega | | payline.json | 2 | payline1–5 (JSON de reels habla payline0–5: off-by-one a confirmar en play) | | wins.json | 53 | big/huge/mega + End + _P portrait + clearTrack | | winsText.json | 42 | textos de esos wins | | box.json | 69 | cajas AA…BN + portrait |

Técnica. Sounds.json win2+ pide animation: bigwinStyle → enganche con wins.json bigWin. Huge/Mega igual. Portrait = sufijo _P.

No técnica. El marco se enciende cuando la plata es gorda. Las líneas de pago son un numerito de circo, no un subrayado amarillo de Excel.

How-to. v1 tema completo: recolor de estas texturas (atlas spine.atlas / spine.webp, no Symbols.atlas). No borrar anims megaWin. Si el reskin es solo símbolos, igual conviene teñir luces o el oro viejo pelea con el horror nuevo.

---

V19. Geometría de carretes (lo que no se “pinta”)

Actual. 5×3 visibles, 1 above + 1 below, spin_speed 0.015, wild WD, skip_win_turbo true. Wins check: gameActivity.paySteps.length > 0 → payline / freespin.

Técnica. Reels.json. Cambiar a 6×4 es otro juego, no un reskin.

No técnica. El chasis. Es lo “leve” que el clon respetó.

How-to. No tocar en un pedido de tema. SpAIne v1 trata Reels.json como read-only.

---

V20. Tipografías

Actual. Loader: Syifa, SansSerifBldFLF, Roboto Condensed Bold, NotoSans. Preload: Arial Black, Arial.

Técnica. Manifest.loader.fonts + preload.fonts. El ticket y el arco no usan estas fuentes: van pintados.

No técnica. Los números de saldo vs el letrero de feria. Dos familias a propósito.

How-to. v1: no cambiar fonts salvo que el prompt pida otra escritura. El sabor de marca va en texturas (ticket, logo, arco).

Puntos de audio

Fuente: 06-puntos-audio.md

Punto por punto — audio dinámico

Capas: Actual / Técnica / No técnica / How-to. Duraciones: ffprobe 2026-10-28 sobre ogg del CDN Axion. Partitura: Sounds.json. Nombres de archivo: Manifest.json preload.sound.

Ruta de archivos: assets/sounds/Joker_Sounds/<stem> — el loader agrega .ogg en vivo (sin extensión → 404).

---

A0. El director vs los wavs

Actual. El clon tiene 18 stems + un JSON que dice cuándo suenan. Magix/Forge gems tienen 1 sounds.ogg con 3 sprites (bgm loop, big_win, bgm_freespin loop). Arena Zeus: 9 one-shots en Sfx.ts. El original HPlay no entregó stems.

Técnica. Horror Circus = eventos → stage → archivo. Magix = Howler sprite [startMs, durationMs, loop?]. No son intercambiables.

No técnica. Un cantante no es una orquesta. ElevenLabs es el cantante. Sounds.json es el director. Si llenás un motor Magix con cantantes lindos, igual se oye una radio con tres botones.

How-to. Piloto sobre Horror Circus: no empaquetar a sprite Magix. Generar N ogg, mismos Manifest.sound[].name. Dejar Sounds.json intacto salvo que el pedido cambie la escalera a propósito.

---

A1. Cama (BGM)

Actual. Main_BGM.ogg 2 344 889 bytes, 124.88 s, loop. Stage bgm. Tipo bgm. Play: states.basespin.

Técnica. No tiene stop en el JSON. Vive mientras el estado es base. Volumen default 1. No es sound_sprite.

No técnica. La música del circo. Si salta a 0:00 en cada spin, el show se siente de feria.

How-to (juego). El engine entra a basespin → Howler/Pixi sound bgm loop.

How-to (reskin). Pedir a ElevenLabs un bed ~2 min, empalme de loop (crossfade al cortar). Export ogg. Reemplazar Main_BGM.ogg. No acortar a 8 s. Misma tonalidad que las arias o pelean.

---

A2. Gatillo de spin

Actual. Spin_Button.ogg 0.10 s, 4002 bytes. Stage spinButton. Evento button.spin.

Técnica. SFX one-shot. Distinto de menu/UI_Button (0.75 s).

No técnica. El clic del gatillo. Corto a propósito: si durara 0.75 s, cada giro se sentiría “abrir un menú”.

How-to. Generar un transient de ~100 ms, pico al inicio, silencio al final. No reusar el click de UI.

---

A3. Click de menú (familia)

Actual. Un solo archivo UI_Button.ogg 0.75 s. En Sounds.json muchas keys (menu, buy, bet, betClose, setting, turbo, betMax, autoPage, autoPageClose, info, info_close, history, history_close, sound_off, replayclose, replaystart, betDown, betUp) todas con stage: "menu" y distintos call: button.*.

Técnica. Un wav, muchos interruptores. Mute: button.sound_music_off.

No técnica. Todos los paneles suenan igual; el spin no. Dos familias.

How-to. Un ogg de click “plástico” ~0.6–0.8 s. Reemplazar UI_Button.ogg. No hace falta 15 archivos. No apuntar spinButton a este stage.

---

A4. Motor de carrete (loop de giro)

Actual. Reel_Spin.ogg 4.20 s, loop. Stage reelSpin. Play reels.start_spin, stop reels.stop_spin.

Técnica. El largo del file no es el largo del spin: es un grano que se repite hasta el evento stop. Turbo corto = menos loops.

No técnica. El zumbido de la máquina mientras las columnas corren. Atado al movimiento, no a un cronómetro.

How-to. Loop empalmable (whoosh/rumble), 3–5 s de grano. Probar que al cortar en cualquier beat no haga click. Reemplazar Reel_Spin.ogg.

---

A5. Clack de parada

Actual. Reel_Stop.ogg 0.22 s. Stage reelStop. Default de reelStopSounds.

Técnica. One-shot por columna. Cinco disparos en cascada. skip_win_turbo no elimina el stop, acorta el spin.

No técnica. El trancazo mecánico izquierda → derecha. Le dice al oído “esto es una máquina”, aunque el dibujo sea un circo.

How-to. Impacto de ~200 ms, cola corta. Cinco veces seguidas no deben distorsionar (headroom). No durar 1 s: se pisan entre carretes.

---

A6. Aterrizaje del scatter (prioridad)

Actual. Bonus_Landing.ogg 1.34 s. Stage bonusLanding. reelStopSounds.BN = { priority: 1, sound: "bonusLanding" }.

Técnica. Override por contenido de celda, no por tamaño de premio. Si BN cae en el carrete 3, ese stop no usa reelStop. Los otros carretes sí.

No técnica. El diamante anuncia que cayó, aunque el resto siga girando. Es el truco de “pasó algo importante”.

How-to (juego). Al resolver el símbolo visible del stop, si id == BN → play bonusLanding, else reelStop.

How-to (reskin). Sting 1.2–1.5 s, mismo personaje que Win_Diamond pero más corto (es aterrizaje, no aria de línea). No borrar la entrada BN de reelStopSounds. No usar este file para win de diamante (hay Win_Diamond aparte).

---

A7. Aria AA — Joker

Actual. Win_Joker.ogg 3.67 s. Keys: Manifest symWinAA, Sounds symbolWin_AA stage symWinAA.

Técnica. Sin events.play en Sounds.json: el engine lo dispara cuando el pay step es AA. Calza con win spine 4 s (el audio es 0.33 s más corto: hay un aire al final de la cara).

No técnica. El payaso tiene voz cuando paga. No es el jingle genérico.

How-to. Clip ~3.7–4.0 s, carácter (risa/órgano/cadenas, lo que pida el tema). Misma duración ±200 ms que Symbols.json AA win duration: 4. Export Win_Joker.ogg. No meterlo en win0.

---

A8. Aria BB — Mono

Actual. Win_Monkey.ogg 4.00 s. symbolWin_BB / symWinBB.

Técnica. Igual patrón. Nombre de archivo = criatura real; nombre de webp = Seal.

No técnica. El zombi grita cuando gana.

How-to. 4.00 s exactos si se puede. Carácter distinto del joker (si los dos son “risa de payaso”, se pisan en memoria). Win_Monkey.ogg.

---

A9. Aria CC — Sierra

Actual. Win_Saw.ogg 4.00 s. symbolWin_CC / symWinCC.

Técnica. Igual. El oído espera motor de sierra, no malabares.

No técnica. La motosierra canta el win. Es el cue más “objeto”.

How-to. Diseñar con componente de máquina (buzz) + sting tonal 4 s. Win_Saw.ogg.

---

A10. Aria EE — Globo

Actual. Win_Balloon.ogg 4.00 s. symbolWin_EE. El Spine del globo tiene frames BOOM: el audio debería soportar reventar.

Técnica. 4 s = idle-to-win, no un pop de 200 ms. El pop puede ir dentro de esos 4 s.

No técnica. El globo no “habla”; revienta / chilla en el tiempo de la cara de win.

How-to. 4 s con el acento del boom alineado a la anim win/start (aprox. si no se mide frame-exact, poner el boom en el primer tercio y cola tonal).

---

A11. Aria BN — Diamante

Actual. Win_Diamond.ogg 4.00 s. Distinto de Bonus_Landing (1.34 s).

Técnica. Landing = stop de carrete. Aria = la línea/símbolo pagó. Pueden sonar en la misma tirada (aterriza y después paga).

No técnica. Primero “cayó el tesoro”, después “el tesoro paga”. Dos frases.

How-to. No reusar el landing. Aria más “joya / fanfarria corta” 4 s. Win_Diamond.ogg.

---

A12. Low sin aria (DD, FF, GG)

Actual. No hay symbolWin_DD, _FF, _GG en Sounds.json ni stems Win_Bike / Win_Brain / Win_Ticket.

Técnica. Esos wins usan solo la escalera win0/win1… (Payline / Big / …). El Spine igual corre 4 s de start.

No técnica. El triciclo, el cerebro y el ticket se ven ganar y se oyen como línea. El oído reserva “personaje” para el cartel.

How-to v1. No agregar arias. Si un pedido pide “que el cerebro también tenga sonido”, hay que añadir key symbolWin_FF + stage nuevo + stem + cable en engine — eso ya no es reskin, es parchar el director. Fuera del piloto mínimo.

---

A13. Escalera win0 (0–1×)

Actual. Stage win0 → Payline_Win.ogg 4.00 s. type: normal, coins: false, rollup: false, sound_sprite: false, start: 0, end: 1.

Técnica. Múltiplo de apuesta en [0, 1). Sin recuento audible, sin lluvia, sin bigwinStyle. El file entero se puede pitar.

No técnica. Propina. El juego no monta número de circo por dos centavos.

How-to. Un sting de línea 4 s (el mismo que win1). No generar un “mini mega”. Respetar end: 1.

---

A14. Escalera win1 (1–15×)

Actual. Mismo Payline_Win.ogg. rollup: true, sound_sprite: true, start: 1, end: 15.

Técnica. El archivo es idéntico a win0; cambia el comportamiento: recorte sprite + contador. Por eso win0/win1 no necesitan dos melodías.

No técnica. Misma cancioncita, pero ahora la máquina cuenta la plata.

How-to. Un solo Payline_Win.ogg de 4 s que aguante ser recortado. No hacer un fade largo al final: el sprite puede cortar antes. El recuento lo pone counterLoop, no este file.

---

A15. Escalera win2 Big (15–30×)

Actual. Big_Win.ogg 8.00 s. type: big, coins: true, rollup: true, sound_sprite: true, animation: bigwinStyle, start: 15, end: 30.

Técnica. Prende wins.json bigWin + CoinSettings (max 52 partículas, gravity y 1000). 8 s de cama de celebración.

No técnica. Acá empieza el número de circo: oís gordo, ves monedas, el marco se enciende.

How-to. Bed de 8 s, loopable-ish porque sound_sprite puede recortar. Más energía que Payline. No 30 s: el engine espera ~8. Alinear paleta tímbrica con BGM.

---

A16. Escalera win3 Huge (30–45×)

Actual. Huge_Win.ogg 8.03 s. Igual que Big + pre_win: 3.

Técnica. pre_win: 3 = 3 s de anticipación antes del cartel. El archivo Huge cubre la celebración; el pre puede ser el mismo sprite o un recorte inicial.

No técnica. Te avisan “se viene” tres segundos. El cuerpo se tensa. El original no hace esto.

How-to. 8 s con un build-up en los primeros 3 s (o aceptar que el engine usa pre_win sobre el mismo stage). Más grande que Big, menos que Mega. Huge_Win.ogg.

---

A17. Escalera win4 Mega (45×+)

Actual. Mega_Win.ogg 8.00 s. end: -1 (sin techo). pre_win: 3. Resto como Huge.

Técnica. Cualquier múltiplo absurdo sigue acá. No hay win5.

No técnica. El techo del show. Si el Mega suena igual que el Big, la escalera miente.

How-to. Distinto de Huge (más densos, más graves, o coral). 8 s + pre 3 s. Mega_Win.ogg. Tres archivos Big/Huge/Mega tienen que distinguirse a ciegas.

---

A18. Cierre de premio

Actual. Win_Stop.ogg 2.00 s. Manifest name winEnd.

Técnica. Cadencia post-rollup. No está en el bloque winSounds como tramo; es el cierre del sistema de win.

No técnica. El director baja las manos. Sin esto, el Big se cae a un pozo de silencio o se pisa con el próximo spin.

How-to. 1.5–2.5 s de resolución (cymbal/lock). Win_Stop.ogg. No un click.

---

A19. Contador (loop + stop)

Actual. Counterloop.ogg 4.82 s, volume 0.3, loop. Counterloop_Stop.ogg 0.89 s.

Técnica. Keys counterloop / counterloopStop. El 0.3 es el único volumen explícito en Sounds.json. Loop cubre recuentos de cualquier largo.

No técnica. El tic-tic de la caja registradora, bajito, para no matar al payaso ni al Mega. El stop dice “llegó el número”.

How-to. Loop empalmable, poco espectacular, mid/high tick. Mixear a ~-10 dB vs arias. Stop corto < 1 s. No ponerle melody; pelearía con win2+.

---

A20. Lluvia de monedas

Actual. No es un ogg propio. coins: true en win2+ + CoinSettings.json (partículas). El audio de “coins” va dentro de Big/Huge/Mega o del recuento.

Técnica. Emitter: lifetime 0–5, max 52, accel y 1000, scale ~1.5. animatedSingle textures null en el JSON (las llena el loader de coins.json sprites).

No técnica. Las monedas que ves en Big. El sonido no es un archivo “Coins.ogg” en el Manifest.

How-to. Meter textura de coins en el bed de Big/Huge/Mega, o dejar que el loop del contador sea el “dinero”. No crear un cue extra si el director no lo llama.

---

A21. Timeline de un spin (how-to de mezcla)

Actual. Orden observado por cableado (no por grabación de play, el headless no terminó el tablero):

  1. spinButton (0.10 s)
  2. reelSpin loop ON (cama BGM sigue)
  3. stops: reelStop × n, o bonusLanding si BN
  4. reelSpin loop OFF
  5. si pay: symbolWin_* (si aplica) en paralelo con win0|1|2|3|4
  6. si rollup: counterloop a 0.3 hasta que el número llega → counterloopStop y/o winEnd
  7. BGM nunca se cortó

Técnica. Capas: BGM (bus música) + SFX one-shots + loop de spin (mute al stop) + win stem + counter (low). Mute global: sound_off.

No técnica. Como un número de circo: entrada, tambores, golpe, aria, aplauso, cierre, y la orquesta de foso nunca se calló.

How-to (QA). Grabar una tirada real en el deploy. Tildar la checklist de 02-audio-dinamico.md. Si el BGM reinicia, el Apply rompió el tipo bgm o reemplazó el engine por Magix.

---

A22. Empaque Magix (anti-how-to)

Actual. Gems Forge: sounds.json Howler + sounds.ogg ~1.1 MB, header S3 elevenlabs-audio-sprite-manifest.

Técnica.

"sprite": {
  "bgm": [0, 19619, true],
  "big_win": [19679, 20991],
  "bgm_freespin": [40730, 19619, true]
}

Tiempos en ms. Tres botones. No hay per-símbolo, no hay reelStop, no hay pre_win, no hay counter 0.3.

No técnica. Una radio con tres teclas. Sirve para un gem rápido. No es Horror Circus.

How-to. Si el destino es Magix lines5x3, este formato es el correcto para ese engine — y el techo de calidad de oído es ese. Si el destino es Axion Horror Circus, prohibido colapsar a 3 cortes. Elegir engine antes de generar audio.

How-to del piloto

Fuente: 07-howto-piloto.md

How-to — piloto “como Horror Circus”

Procedimiento de punta a punta para lograr ese nivel (tema completo + director de audio) sobre un slot que ya tiene partitura.

Base: árbol Axion Horror Circus 1.0.23. Runtime: /opt/forge/spaine. Receta y comandos que ya corren.

---

0b. Comandos que ya están (2026-10-28)

node /opt/forge/spaine/cli.mjs hydrate
node /opt/forge/spaine/cli.mjs inventory
node /opt/forge/spaine/cli.mjs validate
node /opt/forge/spaine/cli.mjs mockup
node /opt/forge/spaine/cli.mjs catalog
node /opt/forge/spaine/cli.mjs select --codes=AA --how='neon clown, keep silhouette'
node /opt/forge/spaine/cli.mjs spline-pack
node /opt/forge/spaine/cli.mjs spline-zip --code=AA
node /opt/forge/spaine/cli.mjs inbox --code=AA --file=/path/v2.png
node /opt/forge/spaine/cli.mjs approve --code=AA   # o reject --note='…'
node /opt/forge/spaine/cli.mjs recompile
node /opt/forge/spaine/cli.mjs gen-stills --codes=AA --prompt='…'
node /opt/forge/spaine/cli.mjs gen-sfx --stems=UI_Button
node /opt/forge/spaine/cli.mjs atlas-repack
node /opt/forge/spaine/cli.mjs apply
node /opt/forge/spaine/cli.mjs zip

Grabbr tab SpAIne hace catalog / select / pack / approve via /v1/spaine/*. Detalle puente Mac: 13-pipeline.md.

---

0. Condición de éxito

Jugás el deploy en Forge y se cumple:

  • tablero 5×3 con piel nueva (fondo, marco, 8 símbolos, blurs);
  • marionetas viejas, caras nuevas (idle/win ~4 s);
  • cama que no salta al spin;
  • motor de carrete on/off con el movimiento;
  • clack ×5, diamante canta al aterrizar;
  • arias AA/BB/CC/EE/BN calzadas;
  • win0 ≠ ópera; 15/30/45 cambian de pista;
  • contador bajito + cierre;
  • mute corta todo;
  • original del job intacto; bundle id nuevo;
  • zip Grabbr + (si aplica) gem.

Si solo hay PNG lindos en una galería: no está hecho.

---

1. Congelar el árbol fuente

  1. Copiar /tmp/hc-cmp/axion-live/ (o el capture Grabbr futuro) a un workdir src/.
  2. Verificar:
assets/json/Sounds.json
assets/json/Symbols.json
assets/json/Reels.json
assets/json/Manifest.json   # o game/Manifest.json en plantilla
assets/images/BG_Background.webp
assets/images/Reel.webp
assets/images/symbols/{Joker,Seal,Juggling,shoes,Ball,Square,Circle,Bonus}.webp
assets/images/BlurSymbols/*_Blur.webp
assets/spine/{joker,seal,Juggling,shoes,Ball,Square,circle,diamond}.json
assets/spine/Symbols.atlas
assets/spine/Symbols.webp
assets/spine/Symbols_2.webp
assets/sounds/Joker_Sounds/*.ogg
  1. Read-only: Sounds.json (eventos), Reels.json, Symbols.json (stages), *.json Spine (huesos), nombres Manifest AA…BN, Bg, reelhose.

---

2. Inventario (lo que SpAIne lista solo)

cli.mjs inventory y cli.mjs catalog. Por cada grupo: código, archivo, atlas folder, cues, aria, class Spline.

Tablas: 05-puntos-visual.md V6 y 06-puntos-audio.md.

El LLM del plan no inventa casilleros. Solo llena “nueva piel / nuevo ogg” contra catalog.json.

---

3. Pedido

QUÉ = chips / --codes. CÓMO = textarea / --how. Tema completo = default de producto; el corte Spline trabaja los códigos marcados.

N variaciones en UI: hueco. Refs: inbox Forge + archivos en el pack outbox.

---

4. Mockups (antes de generar atlas y ogg)

  1. Componer tablero: fondo + reelhose + 5×3 stills a 200×190.
  2. N variantes si las pidió.
  3. Pick.
  4. Recién ahí Imagine en lote (8 stills + 8 blurs + fondo + marco + ticket/logo).

Paleta: 5–7 colores extraídos de la pick, los mismos en todos los prompts.

---

5. Piel de marioneta (atlas)

  1. Parsear Symbols.atlas → regiones por carpeta JOKER|MONKEY|SAW|BIKE|BALLOON|BRAIN|TICKET|DIAMOND.
  2. Recortar Symbols.webp / _2.webp por bounds.
  3. Regenerar cada recorte (mismo w×h o actualizar bounds).
  4. Repack 2048², mismos nombres de región.
  5. Dejar joker.json etc.

Prueba seca: visor Spine 4.1 (o el propio juego) anim idle y start por skeleton. Slot vacío = región faltante.

Stills Manifest (Joker.webp…) y SmallSymbols en paralelo, misma cara, o nowin ≠ idle.

---

6. Audio (un cue = un ogg)

Tabla de consigna para ElevenLabs (copiar duraciones):

| Stem | Segundos | Loop | Notas | |---|---|---|---| | Main_BGM | ~125 | sí | empalme; no reset por spin | | Spin_Button | 0.10 | no | gatillo | | UI_Button | 0.75 | no | toda la familia menu | | Reel_Spin | ~4.2 | sí | empalme | | Reel_Stop | 0.22 | no | headroom ×5 | | Bonus_Landing | ~1.34 | no | ≠ Win_Diamond | | Win_Joker | ~3.67–4.0 | no | = win AA | | Win_Monkey | 4.0 | no | | | Win_Saw | 4.0 | no | | | Win_Balloon | 4.0 | no | boom adentro | | Win_Diamond | 4.0 | no | | | Payline_Win | 4.0 | sprite | win0 y win1 | | Big_Win | 8.0 | sprite | 15–30× | | Huge_Win | 8.0 | sprite | 30–45×, pre 3 s | | Mega_Win | 8.0 | sprite | 45×+, distinto a Huge | | Win_Stop | 2.0 | no | cierre | | Counterloop | ~4.8 | sí | mix -10 dB, “volume 0.3” | | Counterloop_Stop | ~0.9 | no | |

Export ogg. Nombres de archivo exactos. El loader no perdona Main_BGM.mp3.

No generar Win_Brain / Win_Bike / Win_Ticket en v1.

---

7. Textos de marca (tres sitios)

Si el tema cambia de nombre:

  1. arco en BG_Background.webp;
  2. textura TICKET/ + Circle.webp;
  3. Logo.json / spine.atlas.

i18n HorrorCircus_* solo si el pedido cambia reglas, no por un reskin visual.

---

8. Empaque

  1. Workdir dst/ = copy de src/.
  2. Overwrite solo binarios de piel y ogg (y atlas).
  3. Sounds.json / Reels.json / huesos Spine = diff vacío.
  4. Bundle id nuevo. src/ se conserva.

---

9. Deploy y QA

Servir dst/ como el template Horror Circus ya se sirve (Forge temporal, mismo patrón de host). Jugar:

Checklist visual: fondo nuevo, marco calzado a las 5 columnas, 8 stills, idle se mueve, win ~4 s, blur en spin, paytable small alineado, ticket/logo/arco misma marca.

Checklist oído: 02-audio-dinamico.md / 06 A21.

Fallo típico: se oyen 3 cortes Magix → se empacó al engine equivocado.

---

10. Descarga

Después del QA:

  • zip estilo Grabbr (árbol + unpacked);
  • gem Magix no para este piloto (engine distinto). Si más adelante hay un segundo piloto Magix, ahí sí sounds.json de 3 sprites.

---

Qué no hacer

  • Renombrar AA o Juggling.webp “para que coincida” sin actualizar Manifest + Symbols + Small + sonidos.
  • Regenerar joker.json desde un mp4.
  • Un único win.mp3 para todos los múltiplos.
  • Sprite Magix de 3 cortes sobre este árbol.
  • Apply sin mockup pick.
  • Zip antes de jugarlo.
  • Matar Chrome Grabbr :9336.
  • Pisar serve.mjs / Caddy Host / originales del job.

Pack ha-spaine

Fuente: 08-pack.md

Pack SpAIne — plugin + runtime para automatizar

La idea del operador: un pack con plugin y todo lo requerido para que estas tareas (inventario → mockups → piel + audio → jugar → zip) anden solas y anden bien.

Esto cierra la forma del pack. En disco (2026-10-28): plugin + runtime + hydrate/inventory/validate/mockup/apply/gen-stills/gen-sfx/atlas-repack/zip y pipeline 13 (catalog/select/outbox/inbox/approve/recompile). Imagine paint GO. ElevenLabs por cue GO. Grabbr tab SpAIne GO. SAM slice HOLD. Deploy jugable HOLD.

---

Respuesta corta: ¿falta algo antes?

No. No hace falta otra ronda de “qué es SpAIne”. No hace falta paleta, nombre de juego ni prompt creativo para empezar el pack.

El primer corte automático ni siquiera reskinea a emojis: ingiere el árbol Horror Circus, clasifica cada casillero/cue, valida que el árbol es jugable, y deja el pipeline listo para Apply. El reskin creativo es el corte siguiente, con el director intacto.

Defaults que se usan si no hay contraorden:

| Default | Valor | |---|---| | Nombre plugin HA | ha-spaine | | Runtime | /opt/forge/spaine/ (ampliar Forge, no pisar serve.mjs) | | Cliente | Grabbr, delgado | | Piloto | árbol Horror Circus 1.0.23 | | v1 | piel + ogg; Sounds.json / huesos Spine / Reels.json read-only | | Auth | hall_sala | | Pintor | Imagine Lab (suscripción Grok) | | Cantante | ElevenLabs (secrets/elevenlabs.env) | | Plan | Grok + Claude suscripción | | Engine Magix 3 cortes | no en este piloto |

---

Qué es el pack (tres capas, una fábrica)

No es un team AML de 10 agentes. No es un segundo Forge. Es un plugin que orquesta + un runtime en Forge que hace el trabajo sucio + botones en Grabbr.

Grabbr  --jobId, prompt, pick-->  ha-spaine (plugin)
                                      |
                                      v
                               /opt/forge/spaine
                                      |
              +-----------------------+----------------------+
              |                       |                      |
           Imagine                ElevenLabs            deploy Forge
           (stills)               (1 cue = 1 ogg)       (jugar)
                                      |
                                      v
                              zip Grabbr + árbol nuevo

Capa A — plugin ha-spaine (~/.grok/plugins/ha-spaine)

Para que Grok/Claude automatice desde TUI/chat: /ha-spaine, ctl.sh.

Incluye:

  • plugin.json + PLUGIN.md
  • NORTHSTAR.md / CONTRACT.md (éxito = checklist jugable, no “hay PNG”)
  • skill ha-spaine
  • command /ha-spaine
  • scripts/ctl.sh — pasa el subcomando a /opt/forge/spaine/cli.mjs
  • libs reales en runtime (no teatro):

- inventory.mjs / catalog.mjs — casilleros + class Spline - validate-tree.mjs — fail-closed ogg/atlas - compose-mockup.mjs — tablero fondo+marco+5×3 - gen-stills.mjs / gen-sfx.mjs — Imagine / ElevenLabs - atlas-repack.mjs / zip-pack.mjs / apply.mjs - pipeline.mjs / select.mjs / spline-bridge.mjs / review.mjs — QUÉ/CÓMO → Mac → v2

Agentes: pocos. Conductor + (opcional) stills / sfx / atlas. No clonar ha-hackers.

Capa B — runtime Forge /opt/forge/spaine

Donde se ejecuta y se sirve el resultado. Amplía Forge:

  • workdirs spaine/jobs/<bundleId>/src|dst|mockups
  • HTTP interno (mismo :8766 o ruta nueva) para Grabbr: inventory, mockup, apply, play URL
  • deploy temporal del dst/ con el mismo engine Axion, no Magix lines5x3
  • no reescribe local/serve.mjs de raíz: se engancha (require/router extra o spaine/routes.mjs montado)

Capa C — Grabbr cliente

Tab SpAIne: health Forge/Genie, mockup, zip, chips QUÉ, CÓMO, Send to Spline, outbox zip por código, approve/reject. Proxy /v1/spaine/* → Forge :8766. Cookie hall_sala. Cero lógica Spine/ElevenLabs en Grabbr.

---

Qué automatiza el pack (las tareas)

Las de 07-howto-piloto.md + 13-pipeline.md, fail-closed:

  1. Ingest árbol (hydrate dump o ingest --capture=).
  2. Inventory + catalog AA–BN + class Spline.
  3. Validate (ogg HTML 404 → HOLD).
  4. Select QUÉ + CÓMO (humano en Grabbr).
  5. Spline pack outbox (classify, original, brief MCP).
  6. Edit en Spline Mac → inbox v2.
  7. Approve o reject (loop).
  8. Stills Imagine / ogg ElevenLabs / atlas-repack cuando el pedido no va a Spline.
  9. Apply copy-on-write.
  10. Recompile zip.
  11. Play URL Forge — hueco de este corte.
  12. Gem Magix: no en este piloto.

---

Qué no mete el pack en v1

  • Regenerar joker.json desde video.
  • Arias para DD/FF/GG.
  • Sprite Magix de 3 cortes sobre este árbol.
  • Adobe mode.
  • Renombrar AA / Juggling.webp “para que coincida”.
  • 10 agentes de team-forge.

---

Criterio “anda bárbaro”

No es “el plugin existe”. Es:

  • ctl.sh inventory / catalog sobre Horror Circus: 8 códigos + 18 stems + 8 carpetas de atlas.
  • ctl.sh validate PASS.
  • spline-pack deja classify+brief+original por código seleccionado.
  • Un Apply/recompile de recolor/tema se juega en Forge (hueco de este corte) con cama que no salta y diamante que canta al aterrizar.
  • Original src/ bit-idéntico. Zip en gen/zip/ medido.

---

Orden de build (qué ya PASS)

  1. Plugin + inventory/validate — PASS.
  2. Mockup tablero real — PASS (board-current.png).
  3. Forge handleSpaine — PASS (:8766).
  4. gen-stills / gen-sfx — PASS (AA Imagine, UI_Button ogg).
  5. atlas-repack 38 placements — PASS.
  6. Grabbr tab + pipeline 13 — PASS (catalog 8, outbox AA, recompile zip).
  7. Play URL Forge + Spline.app en Darwin — siguiente.

El inventario ya no se hace a mano: catalog.json sale del árbol.

Provenance Horror Circus

Fuente: 09-provenance-horrorcircus.md

09 — Provenance Horror Circus 1.0.23 (arte)

Fecha: 2026-10-28. Fuentes: job src, template translaxion, dump axion-live, SerpAPI Google Lens, grep/XMP/C2PA. No secretos.

Pregunta

¿El arte es diseño único de este slot o un pack bajado de stock (Envato/Craftpix/Freepik/etc.)?

Código / metadatos (medido)

| Señal | Resultado | |-------|-----------| | copyright / artist / license / Envato / Freepik / Craftpix / OpenGameArt / Shutterstock en .json,.atlas,.js,.html,.md,.txt | 0 (salvo TexturePacker URL) | | TexturePacker | SmallSymbols.json + coins.json → app: http://www.codeandweb.com/texturepacker = herramienta, no crédito de stock | | Spine | skeleton.spine = 4.1.24, hash joker 1iibqR/ZjhM, 55 huesos, anims idle/start/Static/Static_Blur/win | | Nombres leftover | archivos Joker/Seal/Juggling/shoes vs carpetas atlas JOKER/MONKEY/SAW/BIKE/BRAIN/TICKET/DIAMOND + dir SFX Joker_Sounds/ | | Copy-paste interno | atlas BALLOON/BOOM/SAW-idle/boom_ | | WebP EXIF autor | no hay dc:creator / Photoshop credit | | WebP C2PA | 21/21 stills del dump llevan sello com.anthropic.claude.provided + origin-confidence: unknown + claim_generator_info: Anthropic Files 1.0.0. Misma huella SHA256 en job/template/axion-live. Eso es sello de archivo servido por Claude Files*, no crédito de stock y no prueba que Claude haya pintado el joker. | | OGG | unos: ENCODER=FL Studio ARTIST/TITLE vacíos. Otros: Lavf60.16.100 + XMP CreatorTool=Adobe Audition 26.3 (Windows) fechas 2026-08-24 / 2026-09-02 tz +03:00 |

Reverse image (SerpAPI google_lens, 2026-10-28)

Probes JPEG desde stills: docs/spaine/probe-joker.jpg probe-saw.jpg probe-bg.jpg. JSON crudo: /tmp/hc-cmp/reverse-lens.json.

| Probe | exact_matches | visual_matches | ¿stock/slot pixel-igual? | |-------|---------------|----------------|--------------------------| | Joker (bufón zombie, gorro púrpura/rojo/verde, campanas) | 0 | 15 genéricos (posters jester, Shutterstock tattoo, Etsy sticker) | no | | Saw (motosierra) | 0 | 15 genéricos (apps chainsaw, Pngtree 3D, Thangs) | no | | BG (carpa) | 0 | 15 genéricos (cortinas Vecteezy, Slotmill Carnival Joker tema distinto, Inkration Sinister Circus otro estudio) | no |

Ningún hit Craftpix / Envato / Freepik / GameArt / Join Games / Unity Asset Store con los mismos píxeles.

Homónimos comerciales (nombre ≠ este pack)

  • GameArt Circus of Horror (2019): vampire / nurse / mummy / electric chair.
  • Join Games Horror Circus (2017): devil / leather girl / bloated clown / 10 lines.
  • Relax Zombie Circus: strongman / knife thrower / acrobat / ringmaster.
  • Hacksaw Klowns: Lester/Jester, globos cluster.

Este Axion: jester zombie, mono slime, sierra, cerebro, globo, bici, ticket, diamante. Cast distinto.

Veredicto (fail-closed)

  • No es un sheet público de stock con crédito en el árbol.
  • Sí es un reskin de plantilla Axion Joker's Diamond (nombres leftover + SFX dir). El puppet/rig no se inventó para horror; el paint sí es del tema horror.
  • Mejor hipótesis soportada: arte 2D Spine de estudio (o casa privada) para este bundle, no un PNG de Envato pegado. Lens 0 exact + rig 55 huesos + Audition/FL Studio en SFX.
  • HOLD: no se puede jurar “nunca existió en un marketplace privado / Discord de assets”. Lens no indexa todo.
  • C2PA Anthropic: no usar como “lo dibujó Claude”. Usar como “estos WebP pasaron por Anthropic Files en algún momento del pipeline de copia”.

Spine animation AI

Fuente: 10-spine-animation-ai.md

10 — Genielabs Spine Animation AI × SpAIne

Fuentes: https://github.com/GenielabsOpenSource/spine-animation-ai (clone /tmp/hc-cmp/spine-animation-ai, 2026-10-28) · 12 principios Disney · piloto Horror Circus Spine 4.1.24.

Qué es el repo (medido, no brochure)

Skill + scripts Python para Claude:

| Script | Hace | |--------|------| | split_character.py | 1 PNG → partes (Gemini + OpenCV) | | position_parts.py | SIFT+RANSAC vs referencia ensamblada | | build_spine_json.py | Skeleton Spine 4.2.0 + presets idle/walk/run/wave/jump/attack | | make_atlas.py | Packer de texturas | | generate_spine_player.py | preview.html (Spine Web Player) | | reskin-app/ | Reskin Studio (upstream: Gemini). Nuestro lab: Imagine pinta, SAM recorta por slot (HOLD), atlas+skin, el rig no se toca |

Ajustes: adjustments.json (offset original / delta / final + draw_order). Preview: demo/sombrero_editor.html.

Licencia: PolyForm Noncommercial 1.0.0. Uso comercial (slots / Forge de pago) = licencia aparte en genielabs.tech. Lab interno: documentar HOLD hasta que el operador firme.

12 principios → anims de slot Axion

Horror Circus ya usa pose-to-pose en Spine (idle, start, Static, Static_Blur, win). No walk/run.

| Principio | En el reel | |-----------|------------| | Squash & stretch | Globos / cerebro / diamante en win; volumen constante (scale X×Y ≈ 1) | | Anticipation | win: 2–4 frames “carga” (sierra atrás, joker inhale) antes del hit | | Staging | Símbolo lee a 80–120 px; no meter secondary que tape el icono | | Pose to pose | Keys en JSON; Pixi interpola. SpAIne no “straight ahead” frame a frame | | Follow through / overlap | Joker: HAT / BELL / TONGUE después de FACE. Sierra: sangre after sawbody | | Slow in / out | Bezier tipo [0.25, 0, 0.75, 1] (el repo); idle lento, win snappy | | Arc | Campanas y sierra en arco, no traslación lineal | | Secondary | Idle: párpados / slime. Win: no competir con el payoff | | Timing | Idle ~2.0s loop (como sombrero). Win ~0.6–1.0s = un beat de SFX | | Exaggeration | Slot: +20–40% vs realismo; no romper el AABB del reel | | Solid drawing | El paint (Imagine/estudio); el rig ya es sólido (55 huesos joker) | | Appeal | Silueta del still; no la skill |

Presets del repo (idle 2.0s, attack 0.6s windup→strike→follow) son humanoid de plataforma. Hay que renombrar/adaptar a idle / win / Static; no inyectar walk en Axion.

Encaje SpAIne (fail-closed)

Lab instalado: ver 11-reskin-app.md (ctl.sh, proyecto genie/joker). Imagine paint GO. SAM/FAL slice HOLD.

GO — Reskin Studio sobre el rig existente

Flujo que sí pega con el piloto:

  1. explode_spine_atlas.py sobre atlas bounds: (Horror Circus es ese dialecto).
  2. Abrir joker.json + atlas en reskin-app (Pixi spine-v8).
  3. Prompt de look (“emerald royal jester, same silhouette”).
  4. Imagine paint (grok-imagine-image-2.0) → SAM por slot (HOLD sin servidor) → atlas nuevo + skin extra.
  5. Export al dst/ de SpAIne sin tocar Sounds.json / Reels.json / hashes de huesos.

Eso es exactamente “stills premium animados”: el motion ya está; cambia el paint.

HOLD — build_spine_json.py from scratch

  • Emite "spine": "4.2.0". Axion runtime del pack es 4.1.24. Pixi puede tragar 4.2 o no: probar, no asumir.
  • Jerarquía humanoid 10–16 huesos ≠ joker 55 (HAT CONTROL, BELL*, EYE CONTROL).
  • Anim names walk/attack ≠ contrato Axion Static / Static_Blur / win.
  • Inventar un rig 55 huesos desde Imagine stills = el HOLD de gen-stills que ya teníamos.

HOLD — split_character + auto-rig para el elenco

Sirve para un símbolo nuevo de 8–12 partes (ticket, diamante). No para reemplazar joker.json.

Versión JSON

Si se usa el builder: bajar "spine" a 4.1.24 y validar timelines (el repo convierte a wire 4.2: bezier por propiedad, no por key). Diff contra joker.json real antes de apply.

Prompting (adaptado al pack)

No pedir walk. Adjuntar JSON+atlas. Spine version explícita.

HARD ALLOW lab. Spine 4.1.24, Pixi Axion, NOT Unity.

Attached: joker.json + Symbols.atlas + Symbols.webp.
Bones already exist (55). Do NOT rebuild hierarchy.

Keep animations: idle, start, Static, Static_Blur, win.
Apply 12 principles only inside those clips:
- idle: moving hold, overlapping HAT/BELL, 2.0s, low amplitude (reel-safe AABB)
- win: anticipation 0.1s → strike → follow-through blood/bells, ~0.8s

If you emit adjustments.json, use the Genielabs format
(original_offset / user_offset dx,dy,drot / final_offset + draw_order).
Y-up, +rot CCW. Output Spine 4.1.24 JSON, not 4.2.0.

Fix de layout: mismo contrato adjustments.json que pegó el usuario.

Deps extra (si se instala el lab)

  • Python: opencv, Pillow, numpy
  • Reskin-app: GEMINI_API_KEY, SAM_SERVER_URL (SAM-3 HTTP), Node 18, FastAPI :8765 + Vite :5173
  • No pegar esto en forge.service :8766 (ampliar Forge, no pisar)

Veredicto

El repo es el co-piloto de motion + reskin de slots, no un store de assets. Para SpAIne v1: Reskin Studio sobre el puppet Axion + 12 principios en idle/win. Builder from-scratch: solo símbolos chicos, y con pin de versión 4.1.24. Licencia NC: lab sí; ship comercial HOLD hasta licencia Genielabs.

Genie Reskin

Fuente: 11-reskin-app.md

11 — Genie Spine Reskin (reskin-app) × Horror Circus

Fuente: https://github.com/GenielabsOpenSource/spine-animation-ai/tree/main/reskin-app Vendor lab: /opt/forge/spaine/vendor/genie-reskin (PolyForm NC — lab interno; comercial HOLD). No está en forge.service. Puertos 8765 / 5173. Forge sigue en 8766. Chrome headed 9336 no se toca.

Qué es (el README, en términos SpAIne)

No reconstruye huesos. Carga un rig Spine existente, lo pinta en spine-pixi-v8, Imagine (grok-imagine-image-2.0, SuperGrok OAuth) reskinea el frame montado, SAM recorta por slot (sin bleed rectangular), reescribe atlas + Spine-{skin}.json, recarga el mismo títere.

| Botón README | En el piloto | |--------------|----------------| | Open project | carpeta con Spine.json + .atlas + .png | | + New skin | prompt de look → snapshot canvas → pad Imagine → crop → bboxes toggling slots → SAM-3 HTTP → repack | | Mask editor | brush / eraser / lasso / Magic Select (magic_cut.onnx opcional) | | AI Terminal | inpaint de un slot vía Imagine, silueta fija | | Per-slot edits | HSL/RGB/contrast/transform no destructivo | | Export | atlas + JSON al lado del proyecto (nosotros: genie/joker/, nunca src/) |

Por qué el explode del repo no alcanza

Horror Circus no es {name}.json + {name}.png + {name}.atlas:

| Pieza | Real | |-------|------| | Rig | joker.json Spine 4.1.24, 55 huesos, 38 slots, anims idle/start/Static/Static_Blur/win | | Atlas | Symbols.atlas dialecto bounds: (spine-pixi-v8 no lo parsea) | | Hojas | Symbols.webp 2048² + Symbols_2.webp (2 páginas). FACE vive en _2 | | Attachments | path: "JOKER/FACE" (no name) | | Job src | el unpack no traía las WebP (solo json/atlas) |

Script nuestro: /opt/forge/spaine/lib/ingest-joker-genie.py

  1. Baja/usa páginas en jobs/horrorcircus-1.0.23/genie/pages/ (CDN Axion stage, 200 medido).
  2. Recorta 37 regiones JOKER/* (0 miss vs attachments).
  3. Sanitiza JOKER/FACE → JOKER_FACE en atlas y en path.
  4. Repack Spine 4.x xy/size/orig/offset + Spine.json/Spine.atlas/Spine.png (el opener de Genie exige el mismo stem).
  5. Escribe jobs/horrorcircus-1.0.23/genie/joker/. src/ bit-idéntico.

Medido: atlas 1024², POST /api/project/open → skins default, 5 anims, slots del joker.

Lab live (2026-10-28)

bash /opt/forge/spaine/vendor/genie-reskin/ctl.sh start|stop|status
UI     http://127.0.0.1:5173/
API    http://127.0.0.1:8765/api/health  → {"ok":true}
open   POST /api/project/open  path=/opt/forge/spaine/jobs/horrorcircus-1.0.23/genie/joker

En la UI: Open → esa carpeta. Play idle / win. Generate pinta con Imagine (OAuth SuperGrok, igual que Lab :8791). Sigue pidiendo FAL_KEY para Bria al rebake.

HOLD (reales)

| Gate | Estado | |------|--------| | Imagine / SuperGrok | GO para paint. ~/.grok/auth.json + grok-voice.mjs. Modelo grok-imagine-image-2.0. GEMINI_API_KEY no se usa. | | SAM_SERVER_URL | vacío. Pipeline paso SAM y Magic Select HOLD. Brush/lasso siguen. Generate pinta; el slice por slot HOLD sin SAM/FAL. | | FAL_KEY | Bria bg-remove opcional. Generate/Retouch ya no piden FAL. Vacío = slice SAM/Bria HOLD; Imagine paint sigue. | | magic_cut.onnx | no copiado a app/frontend/public/. | | spine-pixi-v8 4.2.114 vs JSON 4.1.24 | abrir PASS; deform/mesh en canvas = validar a ojo en idle/win. | | PolyForm NC | no empaquetar Genie dentro de un producto de pago. | | has_part_png: false | list_part_pngs busca {slot}.png; nosotros tenemos JOKER_{SLOT}.png. Canvas usa atlas packed. Método exploded del generate puede fallar; usar atlas. |

Flujo SpAIne (Imagine GO; SAM slice HOLD)

  1. Generate skin horror-v2 (o el prompt de tema).
  2. Refinar máscaras / HSL.
  3. Export dentro de genie/joker/.
  4. SpAIne apply: copiar atlas+skin al dst/ del job, bundle id nuevo, Forge deploy temporal. No tocar Sounds.json / Reels.json / hashes de huesos.

No hacer

  • Meter Vite/uvicorn en forge.service ni Caddy de forge.jailbroken.tech sin pedido.
  • Escribir skins encima de src/.
  • Explode de todo Symbols.atlas (305 regiones, 8 personajes) en el mismo proyecto Genie — un rig por carpeta.
  • Inyectar presets walk/run del builder 4.2.

Spline MCP

Fuente: 12-spline-mcp.md

Spline MCP (Mac app + hosted)

Spline.design = editor 3D / Hana 2D. Distinto de Spine 2D (Esoteric). SpAIne sigue en atlas Spine 4.1; este MCP es otra superficie (mockups 3D, HUD Hana, refs).

Darwin = el núcleo de macOS (uname en una Mac imprime Darwin). Spline.app se instala en /Applications de esa Mac. El MCP de escritorio arranca el binario de Electron (ELECTRON_RUN_AS_NODE=1) y habla por 127.0.0.1 con las pestañas abiertas de Spline en esa misma máquina.

Esta caja Arena es Linux (nl30347.ispiria.net). Acá corre el MCP hosted (https://mcp.spline.design/mcp, OAuth). SSH a la Mac no hace falta para SpAIne ni para el MCP hosted.

Qué hay en disco (2026-10-28)

| Dónde | Qué | |---|---| | Arena Grok ~/.grok/config.toml | [mcp_servers.spline] hosted https://mcp.spline.design/mcp enabled | | Arena Grok | [mcp_servers.spline-desktop] stdio Mac paths, enabled=false (no hay /Applications/Spline.app en este Linux) | | Claude Arena ~/.claude/settings.json | mcpServers.spline hosted | | Cursor Arena ~/.cursor/mcp.json | hosted + desktop paste | | Canonical JSON | /opt/forge/spaine/mcp/spline-desktop.mcp.json · spline-hosted.mcp.json | | Skill | ~/.grok/skills/spline/SKILL.md (oficial splinetool) | | Installer Mac | /opt/forge/spaine/mcp/install-spline-mcp-mac.sh |

JSON de la app Mac (el que pegaste):

{
  "mcpServers": {
    "Spline": {
      "type": "stdio",
      "command": "/Applications/Spline.app/Contents/MacOS/Spline",
      "args": ["/Applications/Spline.app/Contents/Resources/spline-mcp.cjs"],
      "env": { "ELECTRON_RUN_AS_NODE": "1" }
    }
  }
}

Cómo dejar el desktop MCP vivo

El stdio tiene que correr en la Mac: el servidor va por 127.0.0.1 a las tabs abiertas de Spline.app.

  1. Spline.app instalado y abierto al menos una vez.
  2. En la Mac: bash /opt/forge/spaine/mcp/install-spline-mcp-mac.sh (o copiá el JSON a ~/.claude.json / Cursor / Grok).
  3. Reiniciá Grok / Claude / Cursor en esa Mac.
  4. Settings → MCP en Spline: el cliente que uses en on.

Esta sesión Arena no puede spawn Spline.app. Hosted MCP sí: primera llamada pide OAuth Spline en el browser (grok mcp doctor spline o Settings MCP).

Relación con SpAIne

  • Horror Circus piloto = Spine 4.1 atlas + oggs. Genie Reskin :8765/:5173.
  • Spline MCP = editor visual de los QUE seleccionados. El puente Arena→Mac es el outbox (13-pipeline.md): classify + original + brief + mcp-request.json.
  • v2 vuelve por inbox; Forge recompila. Spline no pisa joker.json ni src/.
  • Contrato y smoke: 13-pipeline.md. Outbox medido: jobs/horrorcircus-1.0.23/bridge/outbox/AA/ (webp + brief + mcp-request).