how this works — firefly tic-tac-toe
Table of Contents
hello world — firefly avatars + express mcp
firefly tic-tac-toe is the 2d successor to sumerian squares — same 3×3 engine, new firefly-generated hosts, 2d canvas/dom (no babylon). this page is the hello world: nine firefly avatars idle, a playable preview, and the express add-on prototypes that generated them.
bryanchasko.com / firefly-tic-tac-toe — hello world
Nine Firefly hosts · 3×3 · Express MCP prototypes
Static hello world — real game is /firefly-tic-tac-toe/. Frames below are from docs/asl-concept-guide/assets/frame-01..06.png + static/firefly-tic-tac-toe/ (1440×400) — ever-improving reference, not yet a live 3×3 engine.
HELLO
WORLD
FIREFLY
STYLE ref
STRUCT ref
SEED 4219Sources: static/firefly-tic-tac-toe/frame-01..06.png (1440×400) — also docs/asl-concept-guide/assets/. Board below reuses assets/asl-prototype/{sumerian,firefly}/animation-mixer.ts (copy/fork, not inline) for ASL gloss → hands 74–115 brows 18–26 isolation.
play the preview on /firefly-tic-tac-toe/ — 3×3 div grid, X amber/gold glow, O violet glow, same win detection as sumerian squares (8 lines). hello world above is static; real engine is assets/firefly-tic-tac-toe/src/app.ts (esbuild) forked from assets/sumerian-squares/src/game.ts 9-tuple Player|null, GamePhase select|answering|deciding|stealing|result|gameover (see spec/firefly-tic-tac-toe/spec.md FT-ENGINE-01..03).
how this works — 2d, firefly, express mcp
1. 2d not 3d — same engine, different render
- Sumerian squares: BabylonJS 9.3.4 UMD, single
Engineper cell, 9 Draco.glbhosts (5–28M), 6 animation layers (stand_idle,lipsync18 groups,gesture14,emote3,face_micro,blink3 variants,poi.glb27 groups),camera.tsmeasured-geometry framing,host-pool.tsLRU cap 6 phone / 9 desktop,AudioManager+ Polly Brian enlil. - Firefly tic-tac-toe: 2d canvas/dom + esbuild, no babylon/three/audiocontext. grid is 3×3 divs
aspect-ratio:1, glow via cssbox-shadow/linear-gradient, board stateArray(9).fill(null), win check 8 lines — sameengine.tslogic verbatim, forked toassets/firefly-tic-tac-toe/src/engine.ts. Hosts are 1024×1024 webp + optional mp4 loops, not.glb. Seespec/firefly-tic-tac-toe/spec.mdFT-BUILD-01..03.
2. firefly avatars — nine hosts, style + structure refs
| capability | where it lives | what it does for 9 hosts |
|---|---|---|
| Text-to-Image Image Model 4/5 | POST https://firefly-api.adobe.io/v2/images/generate | base portraits — prompt + size + seed per cell |
| Structure Reference | structureReference / styleReference | same pose wireframe → 9 outputs, varying god/palette |
| Style Reference | styleReference asset + strength 60–85 | lock clay/lapis/nebula palette across hosts |
| Generative Fill/Expand | Photoshop API POST /v2/images/fill | fix cropped wing/hand without regen |
| Text-to-Vector | Illustrator API | clean X/O svg glyphs, recolor via fill |
| Firefly Custom Model | sumerianHost <id> class token | 72 PNGs per host → contact sheet → datasets/<host>.zip → custom model (see below) |
Generation spec: spec/firefly-tic-tac-toe/spec.md FT-HOST-01..05 (1024×1024 hero, 4 poses idle/hover/selected/win, 2 loops idle/win ≤3s ≤1MB, manifest static/firefly-tic-tac-toe/hosts/manifest.json). Style tokens from cloud-del-norte-website/src/styles/tokens.css — --cdn-navy #00002a → --cdn-purple-deep #30006a, --cdn-violet #9060f0, --cdn-lavender #d7c7ee, --cdn-gold #c9a23f, --cdn-orange #ff9900 (gradient 120deg #00002a→#30006a + dust rgba(215,199,238,.06)).
3. asl prototype — gloss → hands, forked not inline
the universal 6-frame storyboard (landing → board empty → host turn → question → X/O → win fanfare) drives both pipelines — sumerian (babylon .glb) and firefly (firefly 2d) plus a universal track where they diverge. see docs/firefly-tic-tac-toe/storyboard.md + docs/assets/firefly-vs-sumerian-storyboard.svg.
- Glimmer gloss:
http://127.0.0.1:8181/v1/chat/completionsmuse-glimmer-30bQ4_K_M NGL13 ctx4096, Valkeygpu_lock NX EX900— prompts P1 English→gloss / P2 VTT→gloss / P3 warfare casting, outputsdocs/asl/gloss.jsonG01–G72 (12/frame, 420ms) +docs/asl/cast.json+docs/asl/fixtures/vtt-sample.json+docs/asl/prompts/gloss.md. - Blender rig: fork
latrodectus-bishopi.blend→latrodectus-bishopi-hand.blend42 joints HOST_SCORECARD 74–115 (21/hand),asl-actions.blend72 actions NLA additive,fixtures/asl/<gloss>.glbviascripts/export-asl-glb.py. - Contact sheet → Firefly dataset:
scripts/blender-contact-sheet.shblender -b …8 views×9=72 PNGs →comfy-workflows/workflow-api.jsoncaptionsHOST_ACCENT+hometownsumerianHost <id>→renders/captioned/→datasets/<host>.zip1024px. - Mixer:
assets/asl-prototype/sumerian/animation-mixer.ts+assets/asl-prototype/firefly/animation-mixer.ts(copy/fork, not inline —sumerian-squaresstays pristine) —ASL_HANDS_RANGE [74,115]BROWS [18,26]LIPSYNC [44,58]MIXER_LERP 0.12MIXER_FPS 60, priorityASL hands+brows > lipsync jaw > emote, 24 tests (12 per stack),vitest.config.tsincludesassets/asl-prototype/**/*.test.ts.
sumerian squares owns
assets/sumerian-squares/and can touch it for shipped work — for ASL, only copy/fork, never inline.fix/asl-fork-stacks(#294 →18bee2b) forkedanimation-mixertoassets/asl-prototype/{sumerian,firefly}/and restoredassets/sumerian-squares/src/camera.ts/game-controller.tsto421dc58pre-mixer.
4. express add-on prototypes — manifest v2 + iframe ↔ sandbox
ground truth @adobe/express-developer-mcp@1.0.0 via npx -y @adobe/express-developer-mcp@latest --yes stdio, manifestVersion: 2, express-document-sdk, Communication APIs runtime.exposeApi/getApi.
| add-on | manifest | iframe | sandbox |
|---|---|---|---|
| asl-concept (universal 6-frame mock, ever-improving reference) | addons/asl-concept/manifest.json V2 panel asl-concept documentSandbox:code.js | index.html addOnUISdk.ready + theme pills Sumerian/Firefly/Universal + host Babylon.js/Express + gloss/play toggles 420ms + exposeApi/getApi('sandbox') | code.js editor.createRectangle/makeColorFill/makeImageFill 6 cards 180×220 pill 48×18 + renderASLConcept/varyCard/clearArtboard |
| asl-lab | addons/asl-lab/manifest.json V2 panel asl-lab | index.html 4 controls theme data-theme×3 host data-host×2 #gloss #play 420ms gold rgb(201,162,63) + Generate Firefly Twin fetch https://firefly-api.adobe.io/v2/images/generate seed:4219 styleReference+structureReference → createImageBitmap → api.generateFireflyTwin | code.js editor.createRectangle(10x) makeColorFill(6x) makeImageFill(8x) + generateFireflyTwin({imageBitmap,seed=4219}) via createRectangle 1024×1024 + makeImageFill |
firefly-tic-tac-toe (standalone, spec/firefly-tic-tac-toe/spec.md FT-ADDON-01..06) | addons/firefly-tic-tac-toe/manifest.json V2 panel panel1 documentSandbox:code.js permissions:{sandbox:["allow-popups"]} | index.html addOnUISdk.ready 4 controls theme/headline/subhead/tagline, Firefly fetch in iframe only (fetch → proxy via runtime.exposeApi/getApi) | code.js import { editor } from "express-document-sdk" + editor.createRectangle + makeColorFill/makeImageFill → insertionParent.children.append(node) — hallucinated adobe.addOn.createShape absent, verified by MCP semantic search |
Lab assets: docs/firefly-tic-tac-toe/features.md (image4/style/structure/custom model), docs/firefly-tic-tac-toe/sumerian-squares-teardown.md (9 hosts 134–137 joints), docs/assets/firefly-tic-tac-toe-hero.svg 1440×400 + firefly-vs-sumerian-storyboard.svg 2×6, spec/asl/spec.md ASL-ROUTE/CONTENT/RIG/DATA/MIX/ADDON/STYLE/BUILD/GLIM.
5. routes + builds
- Hugo siblings, no s3-prefix-registry:
content/firefly-tic-tac-toe/index.md(layout: firefly-tic-tac-toe,type: page) →public/firefly-tic-tac-toe/index.htmlatbryanchasko.com/firefly-tic-tac-toe/;content/firefly-tic-tac-toe-how-this-works/index.md→…/firefly-tic-tac-toe/how-this-works/;content/firefly-tic-tac-toe/asl-demo.md→…/asl-demo/;content/firefly-tic-tac-toe/asl-guide.md→…/asl-guide/— all under Hugo roots3://bryanchasko.comtwo-pass sync (--delete+--exclude "mom/*" "listen/*" "bench/*" "design/*" "chat/*" "news/*" "aws/*"), no new bucket. - Builds:
hugo --minify188 pagesStatic 806;npx vitest run24 tests (2 suitesassets/asl-prototype/{sumerian,firefly}/animation-mixer.test.ts12 each)MIXER_LERP 0.12 MIXER_FPS 60;npx biome check8 warnings (non-null!+ unusedvi/beforeEachonly). - Living guide:
docs/asl-concept-guide/README.md233 lines +assets/frame-01..06.pngever-improving — mirrored to…/asl-guide/viacontent/firefly-tic-tac-toe/asl-guide.md.docs/firefly-tic-tac-toe/asl.mdcites prior results 1–7 (must cite G01–G72 420ms,muse-glimmer-30bgpu_lock, 42 joints 74–115, 72 PNGs, mixer mask, seed 4219).
links
- Play: /firefly-tic-tac-toe/ · How this works: /firefly-tic-tac-toe/how-this-works/ (you are here) · Sumerian Squares: /sumerian-squares/ · How that works: /sumerian-squares/how-this-works/
- Demos: /firefly-tic-tac-toe/asl-demo/ (Hugo 6-frame preview) · /firefly-tic-tac-toe/asl-guide/ (living guide) · Lab at
/tmp/adobe-express-mcp-lab(asl-concept + asl-lab + firefly-tic-tac-toe add-ons) - Specs:
spec/firefly-tic-tac-toe/spec.mdFT-·spec/asl/spec.mdASL- · Docs:docs/firefly-tic-tac-toe/features.md·docs/firefly-tic-tac-toe/sumerian-squares-teardown.md·docs/firefly-tic-tac-toe/asl.md·docs/asl-concept-guide/README.md·docs/asl/gloss.json+docs/asl/prompts/gloss.md(muse-glimmer-30b) - Prototypes:
assets/asl-prototype/sumerian/+firefly/(animation-mixer.tsHAND_JOINTS 74–115MIXER_LERP 0.12) — copy/fork, never inline intoassets/sumerian-squares/src/(team owns that)