# 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_open` → `freeland_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_genome` → `Lineage` 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.Button`s went dark-on-dark in OS-dark — pin all `--button-secondary-*` tokens; (2) raw `