Go to file
type-two 624caf08da fix(editor): stop the workshop destroying the user's work
Seven hardening fixes on the lane-J editor, several sharing one root cause.

- The demo ran against the LIVE database. Opening demos/lane-j.html deleted
  every saved model (pruneOrphans treats anything the demo's manifest omits as
  garbage) and an interrupted run left a fake machine.boot override the real
  game would load. The database name is now a variable, the demo uses a
  throwaway one, deletes it in a finally, and fingerprints the real store
  before/after so the run FAILS if it moved.
- A .glb with no mesh was accepted on every non-paintable slot: original hidden,
  nothing in its place, cheerful success message, savable. The mesh check now
  runs for every slot, before anything is written.
- Multi-object slots (nine puddles, every cannon barrel) hid all instances and
  added one replacement. One fit node per instance now, each at its own pose and
  its own footprint scale — the same contract the runtime's per-instance
  attachSlot already implements.
- Storage failures rejected into void-discarded promises, freezing the UI on
  "Reading…". Nothing leaves Workshop as a rejection any more: failures come
  back as results carrying a sentence a person can read, and every DOM handler
  goes through one guard.
- idbAvailable() was a typeof check, so private windows passed it and then blew
  up, replacing the whole built UI with a raw error string. It now probes open()
  once and caches the boolean; failure means a labelled read-only editor.
- An override whose GLB failed to reload was dropped from the manifest, after
  which the next save deleted its bytes for good. Failed entries are kept,
  flagged unloadable, surfaced in the slot list, and never pruned.
- The editor kept its own slot list, which disagreed with the runtime's in both
  directions. It now imports SLOT_IDS/SLOT_LABELS from src/assets/slots and
  keeps only presentation data, keyed by SlotId so describing a slot the runtime
  lacks is a compile error.

Also fixes a cross-lane mismatch found on the way: the editor stored GLBs as a
{name,bytes,savedAt} wrapper while the game's reader feeds the record straight
into new Blob([buf]). Writes are raw ArrayBuffer now (reads stay tolerant of the
old shape), so a saved swap can actually load in the game.

Build passes; 312 assertions across 9 headless test files, 49 of them new.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 12:13:07 +10:00
.claude Foundation: vite+ts+three+rapier scaffold, frozen contracts, lane docs A-E 2026-07-17 19:55:43 +10:00
assets M0 playable slice: lanes integrated, machine chain staged, hidden-tab hardening 2026-07-17 20:50:16 +10:00
demos fix(editor): stop the workshop destroying the user's work 2026-07-19 12:13:07 +10:00
docs Lane I: asset runtime — manifest, registry, slot hooks, IndexedDB overrides 2026-07-19 11:37:08 +10:00
lanes Workshop plan + lane docs I (asset runtime) and J (editor) 2026-07-18 15:30:09 +10:00
public/assets Lane I: asset runtime — manifest, registry, slot hooks, IndexedDB overrides 2026-07-19 11:37:08 +10:00
scripts Lane I: asset runtime — manifest, registry, slot hooks, IndexedDB overrides 2026-07-19 11:37:08 +10:00
src fix(editor): stop the workshop destroying the user's work 2026-07-19 12:13:07 +10:00
tools M0 playable slice: lanes integrated, machine chain staged, hidden-tab hardening 2026-07-17 20:50:16 +10:00
.gitignore Lane I: asset runtime — manifest, registry, slot hooks, IndexedDB overrides 2026-07-19 11:37:08 +10:00
deploy.sh Deploy to partly.party/blobbo: vite base + deploy.sh (games-doctrine pattern) 2026-07-17 21:32:00 +10:00
editor.html fix(editor): stop the workshop destroying the user's work 2026-07-19 12:13:07 +10:00
GDD.md GDD v0.1: full design doc, idea capture, MODELBEAST farm client + concept wave 1 2026-07-17 18:15:56 +10:00
index.html Foundation: vite+ts+three+rapier scaffold, frozen contracts, lane docs A-E 2026-07-17 19:55:43 +10:00
package-lock.json Foundation: vite+ts+three+rapier scaffold, frozen contracts, lane docs A-E 2026-07-17 19:55:43 +10:00
package.json Foundation: vite+ts+three+rapier scaffold, frozen contracts, lane docs A-E 2026-07-17 19:55:43 +10:00
README.md GDD v0.1: full design doc, idea capture, MODELBEAST farm client + concept wave 1 2026-07-17 18:15:56 +10:00
tsconfig.json Foundation: vite+ts+three+rapier scaffold, frozen contracts, lane docs A-E 2026-07-17 19:55:43 +10:00
vite.config.ts Wave 2 integration: zones staged, fork machines own the district, tuning pass 2026-07-18 12:18:30 +10:00

BLOBBO

Fall Guys × Splatoon × Micro Machines: wobbly blob racers on giant Rube-Goldberg courses where the paint that lands on you is your loadout — relative % coverage per colour = your buffs, weight, and size.

  • GDD.md — the design document (v0.1, in review). Start here.
  • docs/IDEA.md — the original raw idea capture (2026-07-17).
  • tools/mb.py — MODELBEAST farm client (concept art / mesh gen on the local render farm). tools/concept-wave-1.json = first asset wave.
  • assets/concepts/ — generated concept art (review gate for the mesh wave).

Status: pre-production. GDD under review; next step is per-lane execution instructions (see GDD §11) once features are signed off.