Adversarial review of ee2c0d5 (the parsed.scenes crash fix) found the crash
fix's own side effect: stopping the crash meant "Sync scenes from preview"
became clickable for the first time during the tour. That button calls
syncFromPreview() -> scheduleSave() -> a 5s-debounced closure-scoped
commit() -> a real PUT /funpack/api/projects/<id>. patchStore() already
blocks "commit", but only as the exported Store.commit property --
scheduleSave()'s internal setTimeout calls the closure-scoped commit
function directly, bypassing that patch entirely. This directly
contradicts the tour's own welcome copy ("nothing here touches your real
files"). Fixed by blocking syncFromPreview itself, the same way every
other mutating entry point (generate/save/delete/import/...) is already
blocked -- consistent with the existing pattern rather than trying to
patch scheduleSave's internals.
Also fixed a cosmetic mismatch the review caught: the demo preview's
middle scene had prose text while its actual timeline clip (tour-s2, a
video clip) has none -- now both agree.
Verified live: clicked "Sync scenes from preview" mid-tour, confirmed the
block toast fires and no PUT request is made (watched network across the
full 5s+ debounce window), then re-ran the full tour sequence to
completion with zero thrown errors.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>