Repro (deterministic, builder UI):
- Open builder on a page with a heading. Select the heading, type new text in the inspector
Text control (canvas preview updates immediately).
- Click ANOTHER block (or anywhere that changes the selection) - the inspector remounts.
- Ctrl+S - POST /documents/{id} returns 200; UI shows 'Saved'.
- GET /documents/{id}: the heading still holds the OLD text. Same-session, verified against REST.
Control case: WITHOUT a selection change between step 1 and save, the value persists.
The canvas keeps RENDERING the new text (UI lies) while the store never received the edit. Any human workflow that edits several blocks in a row (i.e. every real workflow) silently loses all but the last-edited field's pending value. Observed during a full ggally.net replica session: multiple headings/texts/CTA reverted while list-editor values (committed with Enter) survived.
Suspect: the inspector control commits on a handler that is dropped when the Inspector subtree remounts on selection change; canvas preview binds to a separate live path.
Expected: commit on every change (or at least on blur); never lose data on selection change; a save that 200s must contain what the UI showed.
Repro (deterministic, builder UI):
Textcontrol (canvas preview updates immediately).Control case: WITHOUT a selection change between step 1 and save, the value persists.
The canvas keeps RENDERING the new text (UI lies) while the store never received the edit. Any human workflow that edits several blocks in a row (i.e. every real workflow) silently loses all but the last-edited field's pending value. Observed during a full ggally.net replica session: multiple headings/texts/CTA reverted while list-editor values (committed with Enter) survived.
Suspect: the inspector control commits on a handler that is dropped when the Inspector subtree remounts on selection change; canvas preview binds to a separate live path.
Expected: commit on every change (or at least on blur); never lose data on selection change; a save that 200s must contain what the UI showed.