A newer version of the Gradio SDK is available: 6.22.0
Wiki Change Log
2026-06-16
Bench input goes fully model-free; landing has Quick Start + Build from scratch
- Supersedes the entry below ("Start absorbs the from-scratch entry"). Direction
reversed:
Startis renamedQuick Start →and restored to landing → Lab (seeded parents). The separate✏️ Build from scratchlanding button is back, but now routes landing → Lab → bench (the Lab mount is load-bearing — see below). - Empty-screen bug fixed. The reveal's
← Back(next_btn) targets the lazily-mountedscreen_lab; when the flow reached a splice without ever showing the Lab, do_fuse's writes to itsslots_view/tree_viewhalf-mounted it and Back landed on a blank screen. Fix: every entry (Quick Start and Build-from-scratch) mounts the Lab before a splice can happen. - Bench input box is now model-free in both runtimes.
LlamaCppBuddyRuntime'sgenerate_creature(nowpick_exemplaronly) andedit_creature(keyword →assemble_part, no_freeform_edit_creaturefallback) dropped their model calls to matchMockRuntime. The only model call left in the app isfuse_creatures(Splice). README hook + "How it works" + this page reframed accordingly — the "tiny model draws from text" pitch was retired; the AI moment is the splice. - Reveal Share/Back hidden during the fuse via CSS, not
gr.update(visible=). See gradio-embed-integration for the lazy-mount visible-toggle race and the.screen:has(.buddy-reveal-row) .buddy-reveal-actionsworkaround. - Verified locally (fake runtime, Playwright): both landing entries → splice →
reveal (actions appear) → Back → populated Lab tree; bench tweak adds catalog
parts model-free.
116 passed.
Landing Start absorbs the from-scratch entry; docs follow the code
- Code: the landing
✏️ Build from scratchbutton (freeland_btn) was removed;Start →now runs the FreeLand chain (freeland_open→freeland_fill), so it opens the Splice Bench with both slots empty instead of the Lab pick screen. Dead#buddy-freeland-btnCSS dropped. The in-Lab✏️ Build from scratchis unchanged. - README: rewrote "How to play" —
Startopens the from-scratch bench; removed the stale🪄 Freeform Lab/Draw it/Send to the Lab →step (that screen no longer exists in code — drawing-from-text moved into the bench's per-side box). - Wiki: corrected
system-overview(thefusion_ui.pycomponent note, the data-flow step 1, and the "Draw (freeform) flow" paragraph) and theindexflow summary to drop the nonexistent Freeform Lab and reflectStart → bench → reveal → Lab. - Verified locally (fake runtime, Playwright): landing shows only
Start, clicking it opens the bench with two empty build-from-scratch slots,← Backreturns to the landing, console clean.
Single-model (Gemma 4 12B) cleanup: docs follow the code
- Code: removed the Qwen2.5-3B recipe default and SmolLM2-1.7B download fallback
from
runtime.py(constants,LlamaRuntimeConfigfallback fields, the per-callmodel_repo/model_fileoverride in_chat_json/_resolve_model_path); the one configured model is now Gemma 4 12B. Collapsedscripts/start-local-real-model.shto that single model (dropped the SmolLM2/Llama presets).model-selection-spikeand thevoxel-model-evaltool were left untouched on purpose. - README: rewrote "How it works" to the actual flow — two AI moments on Gemma 4
12B (Draw / Splice) and a model-free Tweak; dropped the stale recipe-level
framing. (The
tags:block is locked and unchanged.) - Wiki: brought
system-overview,deployment-strategy,hackathon-context,local-dev-runtimes,voice-input-asr, andindexin line with the single-model / all-freeform reality and the renamed project (Hatchimera — Voxel Pet Fusion). Fixed two facts the wiki had drifted on regardless of this change: the wheel pin isllama-cpp-python 0.3.29(Gemma 4's chat template, not 0.3.19) and the voice / faster-whisper deps are removed. Recipe-path mentions are reframed as legacy/dead; the Qwen model-ranking is kept as history.
voxel-rendering + system-overview: dot-grid multiply fix + the two bench hint vocabularies
- voxel-rendering: recorded that the scissor
canvas[data-tree-gl]occludes the.buddy-canvasdot-grid on real Chrome (a full-size transparent WebGL layer composites opaque-white; even a solid bg on the GL canvas never shows, buffer reads [0,0,0,0]) and the fix ismix-blend-mode:multiplyon that canvas. Cross- linked from the "place the shared canvas BEHIND content" gotcha. - system-overview: added a gotcha that bench hint text has TWO vocabularies —
chips/tweak run the edit path (
match_part→ parts catalog) and empty-slot input/placeholder run the generate path (pick_exemplar, 6 shapes, quadruped fallback). Verify hint/example text against the matching function or it silently degrades (the "make it tall" → tophat and "jellyfish" → quadruped bugs).
gradio-embed-integration: client-side selection badge + the FAB parent-Column reset
- Recorded the no-re-render-on-select rule:
on_selectreturns state + slots + the FAB only, never the tree. The A/B badge is applied client-side (buddySelect/buddyApplyBadges) so selecting never rebuilds the canvas — rebuilding would reset the Figma pan offset and reboot every live-3D node (visible flash/jump). The DOM is the selection source of truth. - Added a Failure Mode for the bench FAB resurrecting on reveal/share
← Back: re-showing the parentscreen_labColumn resets a child's default visibility, so avisible=Falsebundled into that same response is dropped. Fix is a chained.then(... [open_bench_btn])— the parent-visibility cousin of the lazy-mount reveal trap. Found and fixed while merging the FreeLand branch.
voxel-rendering: one shared WebGL context via scissor (tree + report pages)
- Rewrote the context-cap strategy: many-cell live 3D now uses ONE renderer drawn
via the scissor test (the tree's
installTreeScissor, and the Tools report pages viatools/shared/voxel-cards.js+ the sync-generatedvoxel-rig.js) — one context regardless of card count, superseding the tree's viewport-pooled per-node contexts and the Compendium's static thumbnails. - Recorded three load-bearing gotchas: place the shared canvas BEHIND content
(a transparent on-top WebGL layer occludes page text on real Chrome though it
composites fine in DevTools); full transparent clear each frame (else stale
pixels ghost after scroll/pan); re-key on the real canvas child + self-dispose on
detach (Gradio reuses
.buddy-canvasand swaps its innerHTML on re-render). - Tree node thumbs are now transparent windows; A/B badge moved to the footer and selection shows as a card ring so the behind-content canvas can't occlude them.
system-overview: box-edit path is model-free (keyword + parametric assembler)
edit_creaturenow runsparse_edit(English keyword → PlacementSpec over the ~100-part catalog) +assemble_part; the MiniCPM selector is removed. Gemma 12B stays for full generation, hatch fusion, and the no-match freeform fallback.- Parts now fuse, not stack: placed boxes carry
_part/_pctags that survive thefreeform_genome→Lineageround-trip (norepair_boxeson that path), so re-adding a part accumulates its count and re-distributes the set evenly across the anchor face. Symmetric parts straddle the body (mirror across the body centre, not within the part) so they hug both faces instead of drifting to one side.
2026-06-15
gradio-theme-locking: record the recurring low-contrast button rule
- Added a "RULE: every clickable needs BOTH a pinned background and text" section.
Root cause of the repeated dark-on-dark button bug (bench bubbles, Compendium
chips, Compendium Back): (1)
FUSION_HEADpinned only--button-secondary-text-color, never the secondary background, so unstyled secondarygr.Buttons went dark-on-dark in OS-dark — pin all--button-secondary-*tokens; (2) raw<button>ingr.HTMLmust forcebackground+colorwith!importantor.dark-scoped Gradio rules repaint it. Noted why it slips through (local verify runs light) and to always emulateprefers-color-scheme: dark.
deployment-strategy: Freeform 12B timing measured on the Space
- Added a "Freeform 12B timing" subsection: Gemma-4-12B Q4 on ZeroGPU reloads
~3s and decodes ~17–22 tok/s with the grammar (25–41s per generate/fuse/edit);
the wait is essentially all
gen. warmup correctly pays the one-time ~73s JIT. - Grammar costs ~2× (16.7 → 35.9 tok/s on/off, identical 400-token bench) and the
cost is intrinsic to grammar-constrained decode —
BOX_SCHEMAis already lean (no regex/enum), so the lever is dropping the grammar on the freeform box path (keep it on the recipeGENOME_*path) + leaning onrepair_boxes. Even unconstrained, 35.9 tok/s is ~3× under the Blackwell ceiling (iSWA/flash_attn). - Documented the
duration=30→60(_run_freeform_completion) fix for theggml_cuda_mul_mat_qmid-decode abort, the residual 1500-token > 60s edge, and that ZeroGPU aborts a 3rd GPU acquisition stacked in onedemo.loadhandler (GPU task aborted). Updated the "Runtime shape" wrapper list to three.
voxel-rendering + deployment-strategy: Figma canvas (pan + pooled live 3D) and one-call bench tweak
voxel-rendering.md: added "Lab canvas: pan + viewport-pooled live 3D" — tree nodes are live rotating 3D (not thumbnails), kept under the WebGL context cap bycullCanvasNodes()(boot on-view / teardown off-view; verified dispose→reboot). Documented thesetPointerCapture-swallows-clicks trap (use window move/up +__buddyPanned), the cached pan offset + dot-grid background-position shift, and JS bench-× centering. Updated the context-cap failure mode (Compendium = shared thumbnail renderer; Lab = pooled live), added the 0×0 size-guard fix (blank Splice Bench root) and the culled-stage disposal path, and retired the obsolete inspect-modal "purple chicken" bullet (modal removed; nodes are live now).deployment-strategy.md: added "A bench tweak is ONE GPU call, not two" —edit_creaturenow returns{name, boxes, tweaks[4]}from a single completion (combinedEDIT_SCHEMA), removing the per-tweaksuggest_tweaksGPU call (the likely "Running on ZERO" stuck-indicator cause). Notes the fallback top-up and the revert path.
voice-input-asr: documented the English-only exception for fallback.py CJK match tables
voice-input-asr.md: added "English-only exception: keep the CJK match tables in fallback.py". The deterministic offline interpreter (voice_edit_genome/edit_boxes_fallback) matches input against_ARCH_WORDS/_PART_WORDS/_COLOR_WORDS/_NUM_WORDS, which hold CJK synonyms alongside English as load-bearing match data — stripping them silently breaks Chinese command recognition. Addedfallback.pyto sources. Context: commitb27ae7ctranslated all cosmetic Chinese (docstrings, comments, report title, spec mockup) to English while keeping these functional tables.
voxel-rendering + gradio-css-scoping: live render rig unified with the share GIF; the stuck .generating border
voxel-rendering.md: updated the camera bullet (now the near-frontal "hero" poseaim + radius·(0.46,0.40,1.16), not the old 3/4 isometric — adopted so the head crown is no longer the dark focal top). Added "Live render rig = the share-GIF rig" (HemisphereLight 1.5 / key 3.6 casting a real shadow / fill 1.1 / exposure 1.4,solid=truebuild mesh) and "Shadows: real high-res PCFSoft map +ShadowMaterialcatcher for live, blob for thumbnails". Added the inspect-modal "purple chicken" failure mode (must passboxesthrough or freeform falls back to the archetype voxelizer). Rewrote the reveal-animation bullet (child uses the cube-by-cube build, not the scale pop).gradio-css-scoping.md: added "The stuck orange.generatingborder — a keyframe animation beats!important". Gradio's processing border gets stuck around a whole screen via our heavygr.HTMLswaps; its colour is driven by apulsekeyframe animation, so suppressing it needsanimation:none!important(a staticborder-coloroverride is repainted by the animation). General rule: an ignored!important→ checkgetComputedStyle().animationName.
voxel-rendering + model-selection-spike: freeform granularity + Gemma breadth
voxel-rendering.md: added "Freeform path (box-layout) — granularity is fixed, composition is the AI's". Records that the AI emits rectangular boxes (not voxels), the resolution is system-fixed (integer grid, unit0.96³cubes, no sub-voxel detail), and the two distinct size limits — per-box hard 1–8 (boxes.repair_boxes_MAX=8) vs whole-creature soft ~16 cells (prompt guidance, not enforced) — with the LEGO brick-vs-model analogy. AI sets composition/detail, never resolution; how to make it finer + the trade-off. Addedboxes.py/prompts.pyto sources, cross-linked the spike.model-selection-spike.md: added "Breadth validation" — Gemma 4 12B run through the production code path passed all three AI features (20/20 species, 5/5 freeform fusions, 5/5 mainline genome-edit tweaks on Gemma).
model-selection-spike: two report views (Gallery + Matrix)
- Updated the Reusable tooling section: the report now has a View dropdown — Gallery (live rotatable contexts + Theme filter) and Matrix (model × theme comparison table). Corrected the rendering-strategy note: Gallery uses live WebGL contexts (capped + distance-reconciled); Matrix uses static snapshots from one shared offscreen renderer (the app's thumbnail strategy), so all 152 cells render without hitting the context cap. Sweep is now 20 models (MiniCPM4.1-8B added).
model-selection-spike: point at the tracked eval tool
- Added a Reusable tooling section: the spike's 11 throwaway
scratch/voxel-spike/scripts were consolidated into the trackedtools/voxel-model-eval/(core/models/exemplars/eval/report + committed 19×8 sweep) plus the/voxel-model-evalskill. Updatedsourcesto list the tool ahead of the gitignored scratch. - Recorded the viewer's WebGL context-cap gotcha: a grid of many live contexts
capped + reconciled by distance-to-center on scroll; the naive "evict furthest
- rely on IntersectionObserver to re-mount" permanently blanks still-visible
cards (IO doesn't re-fire for already-intersecting elements). Distinct from the
app's single-shared-renderer strategy in
voxel-rendering.
- rely on IntersectionObserver to re-mount" permanently blanks still-visible
cards (IO doesn't re-fire for already-intersecting elements). Distinct from the
app's single-shared-renderer strategy in
system-overview: freeform generation + breeding subsystem (built & verified)
- Rewrote "Core design bet" into two generation paths: recipe (Qwen2.5-3B,
closed vocabulary — can't do five arms / house-on-head / cross-form) vs freeform
(Gemma 4 12B emits raw box-layout, grammar-enforced, exemplar-seeded, opt-in via
BUDDY_FREEFORM_MODEL_REPO/_FILE; needs llama-cpp-python > 0.3.19 to deploy). - Documented that a creature is freeform iff
Genome.boxesis non-empty, that freeform creatures are first-class (enter the tree and breed), and the splice routing rule: either parent has boxes → freeform merge (own Gemma call: body from one, feature from the other, + one mutation) → box child; else recipe fuse. - Updated Components for the new/changed modules:
runtime.generate_creature/fuse_creatures+ per-call model override;genome.boxes+freeform_genome; newboxes.py(repair_boxes) andexemplars.py(EXEMPLARS/pick_exemplar);fallback.fuse_boxes_fallback;fusion.fuserouting to_fuse_freeform;prompts.BOX_SCHEMA+ freeform message builders;voxel_embed.voxelsFromBoxesvoxel_htmlreadinggenome.boxes;fusion_uiFreeform Lab screen.
- Added the freeform sub-flow to Data flow. Built per
docs/superpowers/specs/2026-06-15-freeform-voxel-generation-design.md+docs/superpowers/plans/2026-06-15-freeform-voxel-generation.md; 52 tests pass; verified locally fake + real Gemma (chunky_dragon × round_frog → amphibian_dragon_hybrid). Added the spec tosources:and cross-linkedmodel-selection-spike.md.
hackathon-context: official clarification of the Sharing is Caring badge
- Recorded the organizer answer (Discord #help, 2026-06-08): the
Sharing is Caring/ Open Trace badge ideally wants the trace from the model running inside the project at runtime, but any trace is accepted (local dev / coding-agent / runtime) and a runtime agent trace is not required. Shared on the Hugging Face Hub. Added the Discord thread tosources:.
model-selection-spike: new decision page from the 19-model voxel-drawing spike
- Created
model-selection-spike.mdrecording the spike on "can a small model draw voxel buddies freehand?" — 19 models / 9 families / 1B–32B, three modes (constrained / unconstrained / GBNF grammar), 8-theme battery, 4-angle visual judgment. Captures: JSON-failure was a grammar-enforcement artifact; geometry quality tracks neither size nor family; Gemma 4 is the only family that draws hard forms (cat/snake/dragon); ZeroGPU is now RTX Pro 6000 Blackwell (~96GB, so memory is not a constraint); latency must be measured on ZeroGPU not local M3 Max; consolidated 19-model table; and the templated-vs-template-guided-freeform direction (chosen experiment: Gemma 4 12B + few-shot template priors). - Added the interactive report at
docs/voxel-model-spike-report.htmland linked it from the page. - Indexed under Decisions in
index.md. - Folded in the few-shot validation result (
spike_fewshot.py, BASE vs REF on Gemma 4 12B): a single hand-authored quadruped exemplar in the system prompt flips freeform cat from an upright grey lump (no legs/tail) to a clean brown quadruped (4 grounded legs, head, ears, tail); same lift on dragon. Confirms the template-guided-freeform direction — one exemplar is enough, the model adapts rather than copies. Addedspike_fewshot.pyto the pagesources:.
hackathon-context: consolidate official award info verbatim (no eligibility analysis)
- Per request, this page records official Field Guide wording only for awards — no judgment about which badges/prizes the project can or cannot earn.
- Rewrote
Bonus Quest Targetsto the official verbatim badge descriptions (Off the Grid/Well-Tuned/Off-Brand/Llama Champion/Sharing is Caring/Field Notes). - Added a
Sponsor prizessubsection with the named awards, amounts, and their official one-line requirements verbatim (Best MiniCPM Build $2,500 / Best Use of Codex $5,000 / Nemotron Hardware Prize RTX 5080 / Best Use of Modal 10,000 credits); noted these are Field Guide per-award figures vs the 2026-06-05 sponsor-pool totals. - Removed the earlier "Achievement status" section (3/6 badges earned, 0/4 sponsor prizes, Tiny Titan conditional, deadline-grab advice) — that was project-side eligibility analysis, not official information.
hackathon-context: verified submission cutoff against official Field Guide
- Confirmed the timeline against the official Field Guide app
(
build-small-hackathon-field-guide.hf.space), whose live countdown reads "Jun 15 · 23:59 UTC" — authoritatively backing the23:59 UTCsubmission cutoff already recorded (= Taipei 2026-06-16 07:59). No data changed; added the Field Guide URL tosources:and bumpedlast_updated.
2026-06-14
gradio-embed-integration + system-overview: two-page splice flow & lazy-column reveal
- Recorded the lazy-mounted
visible=Falsecolumn gotcha: a never-yet-mounted column'svisible=Trueis dropped unless the response touches only the screen columns (no other screen's HTML children, not via.then). Documented the dedicated#buddy-adv-submitbridge (adv_open+.then(adv_fill)) and thedata-ready/buddyAutoAdvanceclient trigger that work around it. - Added the chip bridge (
buddyChip/on_chip) and moved the AI tweak boxes (now + Apply buttons) onto the new Splice Bench in the bridges section. - Updated
system-overview.mdto a four-screen flow (landing → pick → bench → reveal) with matching data-flow steps and a new gotcha bullet.
deployment-strategy: response_format bug, Qwen2.5-3B default, ZeroGPU quota
- Recorded the root-cause fix:
response_formatmust be{"type":"json_object","schema":...}; the OpenAI-style"json_schema"is silently ignored by llama-cpp-python, so fuse/tweak ran unconstrained and every edit fell to the keyword editor. Added a "Schema enforcement" subsection. - Updated Model strategy: default is now
Qwen2.5-3B-Instruct(6/7 schema, incl. Chinese; Llama-3.2-3B scored 0/7 even after the fix — truncated JSON). Recorded the local 0.3.19 measurements and the 3B-vs-7B trade-off. - Corrected the chat-template ceiling: Qwen2.5 (3B–32B) runs on the Space-pinned
0.3.19, so adopting it needs no llama-cpp-python upgrade; noted the new
py3-none-manylinux0.3.29 wheel as a future option. - Added ZeroGPU quota-exhaustion symptoms (warmup failures, CPU drop to ~1.9
tok/s) to the operational constraints. Verified against live Space run logs;
fix is committed (
d9eb5a7) and deployed.
Theme: switched from light-redirect lock to theme-independence
- Rewrote
gradio-theme-locking.md(and itsindex.mdline): the app no longer redirects to?__theme=light(that caused a two-flash FOUC — the HF wrapper loads the iframe with?__theme=system, so the first paint followed the OS, dark → white text, then the redirect re-loaded light). The redirect script was removed;FUSION_HEADis now<style>-only and pins Gradio's theme tokens to light values onhtml, .gradio-container, .dark(+color-scheme:light) so the UI renders identically in light and OS-dark. Kept thereplaceStatetrap as a general lesson and thehead=-delivery / Gradio-6 note (still needed so the.darkoverrides bypass the CSS scoper). - Also fixed a regression noted here for future readers:
.screen-landingsetdisplay:flexfor vertical centering, which overrode Gradio's.hide(display:none) when the column wentvisible=False, so the landing never hid and its fixed full-bleed backdrop covered the next screen. Scope the flex to.screen-landing:not(.hide).
Landing backdrop: corrected to fixed full-bleed; copy-centering trap
- Corrected
voxel-rendering.md: the earlier "collapse to a top strip" entry documented an interim fix (screen-landingmin-height:100vh+ hostposition:absolute) that has since been superseded and was contradicting the code. Rewrote it to the final design — hostposition:fixed; inset:0full-bleed (covers the iframe viewport, no gutters/bottom gap, out of flow so no height feedback; footer lifted withz-index) — and kept the two earlier broken attempts as cautionary history: the 20px.blockcollapse, and themin-height:100vhrunaway inside the HF auto-resizing iframe (≈1400px/s; only reproduces through the wrapper, not the iframe origin → landing uses a fixed px height, never a viewport unit). - Added a copy-centering gotcha:
width:auto+max-width+margin:autoleft the landing question/paragraph flush-left in Gradio prose (auto margins → 0, ~140px off-center); fix is full-width + inheritedtext-align:center, like the h1. - Added the gated-reveal note:
.screen-landingstartsopacity:0and fades in once the backdrop's first frame is laid out (so it appears as one piece, not staggered); the fade must use opacity, not transform/filter, to preserve the fixed backdrop's full-bleed. All HF-verified (iframe stable 750px; h1/q/p center at viewport center; bgfield fills 0,0 → full viewport; reveal fades 0→1 over ~0.4s).
Real-environment fixes: landing backdrop collapse, AI-tweak no-op, HF Playwright
- Updated
voxel-rendering.md: new failure mode — the landing drifting backdrop collapsed to a ~20px top strip because.buddy-bgfield(position:absolute; inset:0) anchored to its hostgr.HTML.block(relative), which collapsed around its absolutely positioned children;overflow:hiddenclipped the grid. Fix:screen-landing100vh flex-centered positioned column + full-bleed host. Recorded that this Gradio build has no.gradio-containerelement (root is.main.fillable.app). HF-verified (field 20px → 881px). - Updated
system-overview.mdgotchas: the AI tweak silently kept the original genome when the real model returned a valid-but-empty edit (fallback only fired on exception); fix surfaces the deterministic keyword editor when the model leaves the look unchanged (runtime._same_look). Plus the Playwright-vs-Space technique: drive the cross-origin*.hf.spaceiframe origin directly; a private Space 404s unauthenticated. Both HF-verified. - Updated
gradio-embed-integration.md: corrected the stale claim that the AI tweak uses a hidden#buddy-tweak-in/#buddy-tweak-submitbridge from the detail modal. It is now a plain inlinegr.Textbox.submitper staged slot; the modal is inspect-only. The old bridge +buddyTweakJS were removed (the modal refresh's fixedsetTimeoutwas too short for the slow ZeroGPU model).
Game-flow redesign: screens, pedigree hub, landing backdrop, LFS
- Updated
system-overview.md: data flow +fusion_ui.py/voxel_embed.pycomponent descriptions now reflect the three-screen state machine (landing → lab pedigree hub → reveal), tap-to-stage selection, the detail modal, and the landing backdrop. Removed stale voice/asr.pyreferences; added the mount-race and Git-LFS gotchas; linked related pages. - Updated
gradio-embed-integration.md: documented the selection/tweak JS→Python bridges (same hidden-textbox+button pattern as the old voice bridge) and the new failure mode — writing a component's value in the same response that first makes its container visible leaves it stuck inpending; fix is a visibility event then.then(populate). - Updated
voxel-rendering.md: added the offline transparent-PNG export (window.voxelsFromGenome/voxelBuildMesh+ alpha renderer, no sky background) and the landing infinite drifting grid (torus + per-cell wrap re-randomise, replacingbackground-repeat). All verified locally via Playwright (full splice loop, modal AI-tweak, infinite backdrop, 0 console errors). 50 baked buddy PNGs added underassets/buddies/(Git LFS).
Voice input removed → text command box; asr.py deleted
- Rewrote
voice-input-asr.md(now "Command Input — Text"): the browser Web Speech voice path was removed and replaced by a visible text box + Apply button infusion_ui.py, reusing the LLM handler (on_voice→on_command). Verified locally via Playwright (Enter/Apply reshape left parent, box clears, empty submit no-ops, 0 console errors). - Deleted
src/buddy_fusion/asr.py(never imported; dead code). Its deps were already dropped inedbaf97. - Updated
index.mdentry accordingly.
Theme lock reversed: dark → light
- Updated
gradio-theme-locking.md. The app's deliberate dark lock was reversed to a light lock to support a daytime Crossy-Road voxel diorama (light page chrome + sky/grass stage). The hard-redirect mechanism is unchanged; only the?__theme=target flipped (dark→light) and the pre-paintdocumentElement.classList.add('dark')flash-guard was removed (light is the default paint). Verified locally via Playwright:?__theme=lightredirect fires, Gradio tokens resolve light, 0 console errors.
Voice input ASR page (corrected)
- Added
voice-input-asr.md. Initial draft wrongly claimed the Space runs faster-whisper (inferred fromasr.pydefaults +requirements.txt). Strict verification corrected this:grep -rn "import asr"returns zero matches andgit log -S "import asr"showsfusion_uinever imported it —asr.pyis unwired dead code. The live voice path is browser Web Speech (window.SpeechRecognitioninfusion_ui.BROWSER_VOICE_JS); the app only ever handles the plain-text transcript.faster-whisper/ctranslate2are installed but never exercised;BUDDY_ASR_*env vars have no effect. - Linked it into
index.mdIntegrations.
Voxel rendering page + turntable centering fix
- Added
voxel-rendering.mddocumenting the voxelizer, bounds-driven camera, the thumbnail shared-renderer context cap, and the turntable pivot rule. - Recorded the fix where the turntable rotated about the world origin instead of the creature's centroid, sliding asymmetric archetypes (horse) off-frame.
Ported AI/dev tooling from build-a-buddy-hf
- Added
CLAUDE.md(workflow rules: English-only, never-auto-push to the Space, brainstorm→plan→worktree→execute→verify, local launch scripts),AGENTS.md, andtemplates/wiki-page.md. - Added five reusable wiki pages, adapted to this project's
buddy_fusionpackage and files:hackathon-context,local-dev-runtimes,deployment-strategy,gradio-embed-integration,gradio-css-scoping,gradio-theme-locking. - Linked the new pages into
index.md's Context / Architecture / Integrations / Debugging sections.
2026-05-16
Initial template
- Created starter wiki structure.
- Added
index.md,README.md,log.md, andsystem-overview.md. - Added Claude hook workflow under
.claude/.