Goal: the studio never lies — failed writes and failed reloads are visible, and a render panic cannot poison the shared model.
Evidence: 4× let _ = std::fs::write (editor/inspector.rs:667-695); watcher drops parse errors (app/mod.rs:131); asset handler renders under lock with .expect() (editor/view.rs:51-54); the debounce from commit 2f75369 is gone from the reworked inspector.
Invariants: every user edit either persists or shows an error; a broken scenario file shows the existing error banner instead of stale frames.
Acceptance: manual + unit checks — invalid JSON on disk shows the error banner; a write failure surfaces in the topbar; rapid slider drags produce batched writes.
Files:crates/rustmotion-studio/src/editor/inspector.rs, app/mod.rs, editor/view.rs, scenario/*.
Verify:cargo test --workspace && cargo check -p rustmotion-studio
Goal: the studio never lies — failed writes and failed reloads are visible, and a render panic cannot poison the shared model.
Evidence: 4×
let _ = std::fs::write(editor/inspector.rs:667-695); watcher drops parse errors (app/mod.rs:131); asset handler renders under lock with.expect()(editor/view.rs:51-54); the debounce from commit 2f75369 is gone from the reworked inspector.Invariants: every user edit either persists or shows an error; a broken scenario file shows the existing error banner instead of stale frames.
Acceptance: manual + unit checks — invalid JSON on disk shows the error banner; a write failure surfaces in the topbar; rapid slider drags produce batched writes.
Files:
crates/rustmotion-studio/src/editor/inspector.rs,app/mod.rs,editor/view.rs,scenario/*.Verify:
cargo test --workspace && cargo check -p rustmotion-studio