| # 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 `<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=30`→`60` (`_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_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 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 (`dark` → `light`) 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/`. |
|
|