Edit path is now pure Python: an English keyword parser maps the instruction to
a catalog part plus count/scale/anchor/rotation/color, and the assembler snaps it
on deterministically (symmetric pairs first, overflow to rear; float scale rounded
to the grid; exact 90deg integer-grid rotation). Instant, no GPU. Gemma 12B stays
only for full generation, hatch fusion, and the freeform-edit safety valve.
Removes select_part, the MiniCPM selector constants/preflight/warmup bench, and
SELECT_SCHEMA/build_select_messages.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Consolidate the throwaway scratch/voxel-spike/ exploration (11 scripts,
scattered HTML viewers) into a tracked, reusable tool so the next model
test does not start from zero.
tools/voxel-model-eval/:
- core.py: pure base (SYS prompt, 8 themes, BOX_SCHEMA, extract_json,
voxelize, metrics); no model loading, llama_cpp never imported here.
- models.py: the editable (label, repo) list.
- exemplars.py: few-shot reference layouts for --fewshot.
- eval.py: single CLI; one model at a time (download -> grammar-enforced
test -> optional --delete-after -> merge); llama_cpp imported lazily so
the pytest suite runs without the sibling venv.
- report.html: Three.js viewer with a theme filter; live WebGL contexts
are reconciled by distance-to-viewport-center on scroll (fixes the
evict-furthest blanking bug where still-visible cards never re-mounted).
- report_data.js: committed 19-model x 8-theme sweep so the report opens
populated.
Align voxelize() to JS Math.round (round half up) so P…
Add an opt-in freeform path where the model draws raw box-layout geometry
({name, boxes:[{x,y,z,w,h,d,color}]}) instead of the recipe, so creatures can
take cross-form shapes (five arms, a house on the head) the closed recipe
vocabulary cannot express. Gemma 4 12B (the model-selection spike winner),
grammar-enforced, seeded with a hand-authored reference exemplar.
Freeform creatures are first-class: they enter the family tree and breed. A
splice routes to a Gemma "merge two creatures" call when either parent carries
boxes (freeform x freeform and freeform x recipe both yield a box child);
otherwise the recipe fuse runs. Fallbacks (fake runtime / model failure) use a
reference exemplar or a deterministic box merge, so the app never renders empty.
- genome: optional Genome.boxes + freeform_genome(); round-trips, recipe
creatures stay box-free
- prompts: BOX_SCHEMA, build_freeform_messages, build_freeform_fuse_messages
- runtime: generate_creature / fuse_creatures on Gemma via per-cal…