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
# 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/`.