hatchimera / wiki /log.md
arkai2025's picture
feat: model-free bench, Quick Start + Build-from-scratch landing, fix blank-Lab
3076240
|
Raw
History Blame Contribute Delete
29.9 kB

A newer version of the Gradio SDK is available: 6.22.0

Upgrade

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: Start is renamed Quick Start → and restored to landing → Lab (seeded parents). The separate ✏️ Build from scratch landing 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-mounted screen_lab; when the flow reached a splice without ever showing the Lab, do_fuse's writes to its slots_view/tree_view half-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's generate_creature (now pick_exemplar only) and edit_creature (keyword → assemble_part, no _freeform_edit_creature fallback) dropped their model calls to match MockRuntime. The only model call left in the app is fuse_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-actions workaround.
  • 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 scratch button (freeland_btn) was removed; Start → now runs the FreeLand chain (freeland_openfreeland_fill), so it opens the Splice Bench with both slots empty instead of the Lab pick screen. Dead #buddy-freeland-btn CSS dropped. The in-Lab ✏️ Build from scratch is unchanged.
  • README: rewrote "How to play" — Start opens 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 (the fusion_ui.py component note, the data-flow step 1, and the "Draw (freeform) flow" paragraph) and the index flow summary to drop the nonexistent Freeform Lab and reflect Start → bench → reveal → Lab.
  • Verified locally (fake runtime, Playwright): landing shows only Start, clicking it opens the bench with two empty build-from-scratch slots, ← Back returns 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, LlamaRuntimeConfig fallback fields, the per-call model_repo/model_file override in _chat_json/_resolve_model_path); the one configured model is now Gemma 4 12B. Collapsed scripts/start-local-real-model.sh to that single model (dropped the SmolLM2/Llama presets). model-selection-spike and the voxel-model-eval tool 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, and index in 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 is llama-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-canvas dot-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 is mix-blend-mode:multiply on 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_select returns 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 parent screen_lab Column resets a child's default visibility, so a visible=False bundled 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 via tools/shared/voxel-cards.js + the sync-generated voxel-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-canvas and 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_creature now runs parse_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/_pc tags that survive the freeform_genomeLineage round-trip (no repair_boxes on 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_HEAD pinned only --button-secondary-text-color, never the secondary background, so unstyled secondary gr.Buttons went dark-on-dark in OS-dark — pin all --button-secondary-* tokens; (2) raw <button> in gr.HTML must force background+color with !important or .dark-scoped Gradio rules repaint it. Noted why it slips through (local verify runs light) and to always emulate prefers-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_SCHEMA is already lean (no regex/enum), so the lever is dropping the grammar on the freeform box path (keep it on the recipe GENOME_* path) + leaning on repair_boxes. Even unconstrained, 35.9 tok/s is ~3× under the Blackwell ceiling (iSWA/flash_attn).
  • Documented the duration=3060 (_run_freeform_completion) fix for the ggml_cuda_mul_mat_q mid-decode abort, the residual 1500-token > 60s edge, and that ZeroGPU aborts a 3rd GPU acquisition stacked in one demo.load handler (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 by cullCanvasNodes() (boot on-view / teardown off-view; verified dispose→reboot). Documented the setPointerCapture-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_creature now returns {name, boxes, tweaks[4]} from a single completion (combined EDIT_SCHEMA), removing the per-tweak suggest_tweaks GPU 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. Added fallback.py to sources. Context: commit b27ae7c translated 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" pose aim + 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=true build mesh) and "Shadows: real high-res PCFSoft map + ShadowMaterial catcher for live, blob for thumbnails". Added the inspect-modal "purple chicken" failure mode (must pass boxes through 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 .generating border — a keyframe animation beats !important". Gradio's processing border gets stuck around a whole screen via our heavy gr.HTML swaps; its colour is driven by a pulse keyframe animation, so suppressing it needs animation:none!important (a static border-color override is repainted by the animation). General rule: an ignored !important → check getComputedStyle().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, unit 0.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. Added boxes.py/prompts.py to 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 tracked tools/voxel-model-eval/ (core/models/exemplars/eval/report + committed 19×8 sweep) plus the /voxel-model-eval skill. Updated sources to 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.

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.boxes is 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; new boxes.py (repair_boxes) and exemplars.py (EXEMPLARS/pick_exemplar); fallback.fuse_boxes_fallback; fusion.fuse routing to _fuse_freeform; prompts.BOX_SCHEMA + freeform message builders; voxel_embed.voxelsFromBoxes
    • voxel_html reading genome.boxes; fusion_ui Freeform 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 to sources: and cross-linked model-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 to sources:.

model-selection-spike: new decision page from the 19-model voxel-drawing spike

  • Created model-selection-spike.md recording 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.html and 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. Added spike_fewshot.py to the page sources:.

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 Targets to the official verbatim badge descriptions (Off the Grid / Well-Tuned / Off-Brand / Llama Champion / Sharing is Caring / Field Notes).
  • Added a Sponsor prizes subsection 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 the 23:59 UTC submission cutoff already recorded (= Taipei 2026-06-16 07:59). No data changed; added the Field Guide URL to sources: and bumped last_updated.

2026-06-14

gradio-embed-integration + system-overview: two-page splice flow & lazy-column reveal

  • Recorded the lazy-mounted visible=False column gotcha: a never-yet-mounted column's visible=True is dropped unless the response touches only the screen columns (no other screen's HTML children, not via .then). Documented the dedicated #buddy-adv-submit bridge (adv_open + .then(adv_fill)) and the data-ready / buddyAutoAdvance client 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.md to 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_format must 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-manylinux 0.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 its index.md line): 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_HEAD is now <style>-only and pins Gradio's theme tokens to light values on html, .gradio-container, .dark (+ color-scheme:light) so the UI renders identically in light and OS-dark. Kept the replaceState trap as a general lesson and the head=-delivery / Gradio-6 note (still needed so the .dark overrides bypass the CSS scoper).
  • Also fixed a regression noted here for future readers: .screen-landing set display:flex for vertical centering, which overrode Gradio's .hide (display:none) when the column went visible=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-landing min-height:100vh + host position:absolute) that has since been superseded and was contradicting the code. Rewrote it to the final design — host position:fixed; inset:0 full-bleed (covers the iframe viewport, no gutters/bottom gap, out of flow so no height feedback; footer lifted with z-index) — and kept the two earlier broken attempts as cautionary history: the 20px .block collapse, and the min-height:100vh runaway 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:auto left the landing question/paragraph flush-left in Gradio prose (auto margins → 0, ~140px off-center); fix is full-width + inherited text-align:center, like the h1.
  • Added the gated-reveal note: .screen-landing starts opacity:0 and 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 host gr.HTML .block (relative), which collapsed around its absolutely positioned children; overflow:hidden clipped the grid. Fix: screen-landing 100vh flex-centered positioned column + full-bleed host. Recorded that this Gradio build has no .gradio-container element (root is .main.fillable.app). HF-verified (field 20px → 881px).
  • Updated system-overview.md gotchas: 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.space iframe 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-submit bridge from the detail modal. It is now a plain inline gr.Textbox.submit per staged slot; the modal is inspect-only. The old bridge + buddyTweak JS were removed (the modal refresh's fixed setTimeout was 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.py component 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.py references; 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 in pending; 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, replacing background-repeat). All verified locally via Playwright (full splice loop, modal AI-tweak, infinite backdrop, 0 console errors). 50 baked buddy PNGs added under assets/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 in fusion_ui.py, reusing the LLM handler (on_voiceon_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 in edbaf97.
  • Updated index.md entry 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 (darklight) and the pre-paint documentElement.classList.add('dark') flash-guard was removed (light is the default paint). Verified locally via Playwright: ?__theme=light redirect 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 from asr.py defaults + requirements.txt). Strict verification corrected this: grep -rn "import asr" returns zero matches and git log -S "import asr" shows fusion_ui never imported it — asr.py is unwired dead code. The live voice path is browser Web Speech (window.SpeechRecognition in fusion_ui.BROWSER_VOICE_JS); the app only ever handles the plain-text transcript. faster-whisper/ctranslate2 are installed but never exercised; BUDDY_ASR_* env vars have no effect.
  • Linked it into index.md Integrations.

Voxel rendering page + turntable centering fix

  • Added voxel-rendering.md documenting 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, and templates/wiki-page.md.
  • Added five reusable wiki pages, adapted to this project's buddy_fusion package 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, and system-overview.md.
  • Added Claude hook workflow under .claude/.