The hardest part of building a visual builder is not adding features.

by

It is making every action feel predictable.

Over the past week, we have continued working on the stability update we shared earlier.

The first major milestone is now complete: the view restoration and Layers synchronization issues passed repeated browser validation.

We confirmed that:

  • One wake-up transaction creates only one valid generation

  • Duplicate responses cannot trigger the same update twice

  • Inactive views restore into the correct page and view

  • Stale or mismatched responses are rejected

  • The correct view instance and editor frame are created during normal loading

  • Boot locks are released without leaving the builder stuck

  • The normal builder flow works without test-only recovery paths

We also found and corrected an issue in our own test runner.

The runner was accidentally replacing a read-only diagnostic channel with an empty array. That made a correct Settings transaction appear to fail, even though the product had processed it correctly.

This was an important reminder: validation tools need the same level of scrutiny as production code. A broken test can send development in the wrong direction just as easily as a broken feature.

After correcting the runner, we confirmed that Settings changes now produce:

  • One canonical Settings transaction

  • One correctly owned history command

  • The correct page and view identity

  • No duplicate Settings or text-edit commands

The remaining issue is now much smaller and more specific.

After a Settings transaction completed, an already-fired debounce timer could leave its old timer ID behind. When Undo was pressed later, the history system interpreted that stale ID as a pending text edit and created an unnecessary “Updated content” command.

The visible result could be:

  • Undo targeting an unexpected action

  • An extra history entry appearing

  • Settings Undo feeling unreliable

  • Redo no longer matching the exact original sequence

We traced this to a callback that exited early without clearing its completed timer state.

The new fix now:

  • Clears the timer state as soon as the callback runs

  • Rejects pending history work when there is no real active text or page edit

  • Preserves genuine text edits that still need to be committed before Undo

  • Prevents empty pending mutations from becoming history commands

We are currently validating two very focused scenarios in fully isolated browser profiles:

  1. Change a Setting, wait, then Undo
    No extra text command may appear.

  2. Edit real text, then press Undo before the normal debounce finishes
    The real text edit must still be preserved and undone correctly.

We are deliberately testing these separately before reopening the broader suite.

The update is not finished yet, but the uncertainty is getting smaller:

  • View restoration: passed

  • Layers synchronization: passed

  • Normal builder boot: passed

  • Settings transactions: passed

  • Settings history ownership: passed

  • Settings-only Undo cleanup: in final validation

  • Real pending text Undo: in final validation

  • Broader Undo/Redo and multi-view regression tests: next

We could ship sooner by accepting “mostly correct.”

But Undo, saving, and view isolation are trust features. They need to behave correctly every time, not only during the happy path.

Which kind of progress update is most useful to you: technical root causes, visible user impact, or a simpler shipped-versus-in-progress checklist?

6 views

Add a comment

Replies

Be the first to comment