close
Skip to content

RTC: Fix divergence when two offline users reconnect#77980

Merged
alecgeatches merged 4 commits into
trunkfrom
fix/2-way-compation-merge
May 5, 2026
Merged

RTC: Fix divergence when two offline users reconnect#77980
alecgeatches merged 4 commits into
trunkfrom
fix/2-way-compation-merge

Conversation

@alecgeatches
Copy link
Copy Markdown
Contributor

@alecgeatches alecgeatches commented May 5, 2026

What?

In the "Edit Anyway" PR, we discovered a way to get a user into a divergent state after reconnecting to the sync server:

chaos-merge.mov

Above, the left user stays online and makes some typo fixes, while offline user 1 adds content and offline user 2 replaces the whole paragraph. The purpose of the video was to show that a complex merge would have a weird result, but what I found was that the second user to re-connect (bottom-right in the video) got stuck in a non-convergent state.

"Edit Anyway" mode makes this situation easier to reproduce, but the core issue is reproduceable with tighter timings in core. This will happen when two users who have made changes reconnect to a sync server on the same polling cycle.

This PR stops the RTC sync server from silently dropping a client's compaction when another client has already pushed one for the same room.

Why?

When two users edit the same post offline (via the near-future "Edit Anyway" flow or in the window of time before a disconnect dialog appears) and reconnect at roughly the same time, the second reconnecter's changes silently disappear from the server. Their local state still shows their changes, but no other client ever sees it, and the server-side document is the first reconnecter's state.

The root cause is in process_sync_update()'s compaction handling. Both clients push with the same cursor, the last position they saw before disconnecting. The server applies the first one and then sees has_newer_compaction=true for the second, and drops the second compaction. Because the polling provider resets its queue to a single compaction when updates are present on every poll failure, the second user to reconnect has their local changes dropped and becomes divergent.

How?

The fix is pretty simple. Instead of discarding the bytes when a newer compaction already exists, store them as a regular Yjs update. Y.js's applyUpdateV2 merges state-as-update blobs idempotently, so there is no conflict with the operations the first compaction already encoded. We cannot safely call remove_updates_before_cursor in this branch (the newer compaction has already advanced the cursor), so we skip that and store only.

The tricky part is testing, because class-wp-http-polling-sync-server.php already ships in core WordPress, so this is difficult to test in WordPress 7+. The matching change in core, along with a unit test, will land via a core PR (along with an update to the in-progress WordPress/wordpress-develop#11599 table update, which will work the same). The instructions below use a hacky method for patching wp-env core WordPress files to test the fix.

Testing Instructions

First, in trunk, try a manual reproduction:

  1. Enable RTC via Settings -> Writing -> "Enable real-time collaboration" checkbox.

  2. Manual reproduction is possible with some quick timing and DevTools offline mode:

    1. Create a post with the content: "Our team gathers every Teusday morning. We share progres on thier projects."

    2. Open the post in three browser sessions logged in as three different users.

    3. Disconnect two of them by going on offline mode in DevTools.

    4. In the first offline user's browser, add the sentence "Mondays are quiet." to the beginning of the paragraph.

    5. In the second offline user's browser, replace the whole paragraph with "Weekly team check-in."

    6. In the online browser, fix the three typos in the original text ("Teusday", "progres", "thier").

    7. Reconnect the first offline user, and then the second:

      chaos-merge-manual-reproduction.mov
  3. You should see that the second offline user, on reconnection, has changes from the other two users but their changes ("Weekly team check-in.") are not sent to the first two online users. Changes in the divergent user's document may not show up for other users, depending on the update location (shown above).

To test the fix, we'll need to patch core WordPress files:

  1. Patch the wp-env core class so the fix is actually live (since core overrides the Gutenberg copy). Note that this requires a wp-env destroy to undo.

    npm run wp-env -- run wordpress perl -i -pe 'BEGIN{undef $/;} s|// Reaching this point means there.s a newer compaction, so we can\n\s*// silently ignore this one\.\n\s*return true;|return \$this->add_update( \$room, \$client_id, self::UPDATE_TYPE_UPDATE, \$data );|' /var/www/html/wp-includes/collaboration/class-wp-http-polling-sync-server.php
    

    To revert core changes, you'll need do destroy wp-env via:

    npx wp-env destroy && npx wp-env start
    
  2. Retry the manual reproduction above. See the users converge correctly:

    chaos-merge-patched.mov

    Note that users converge to a nonsense result (WMondays are quiet. eekly team chesick-in.), but that's okay because the changes made offline were purposefully incompatible. This exercise isn't to show that the merge result is ideal, just that each user sees the same replicated state.

Use of AI Tools

AI assistance: Yes
Tool(s): Claude Code
Used for: Diagnosing the silent-drop branch, drafting the fix.

@alecgeatches alecgeatches self-assigned this May 5, 2026
@alecgeatches alecgeatches requested a review from spacedmonkey as a code owner May 5, 2026 18:18
@alecgeatches alecgeatches added the [Feature] Real-time Collaboration Phase 3 of the Gutenberg roadmap around real-time collaboration label May 5, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 5, 2026

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: alecgeatches <[email protected]>
Co-authored-by: maxschmeling <[email protected]>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.

@alecgeatches alecgeatches added [Type] Bug An existing feature does not function as intended Backport to WP 7.0 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta labels May 5, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 5, 2026

Flaky tests detected in a33d8a0.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/25399388024
📝 Reported issues:

@alecgeatches alecgeatches merged commit 02bfdaa into trunk May 5, 2026
40 checks passed
@alecgeatches alecgeatches deleted the fix/2-way-compation-merge branch May 5, 2026 22:11
@github-actions github-actions Bot added this to the Gutenberg 23.2 milestone May 5, 2026
@github-actions github-actions Bot removed the Backport to WP 7.0 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label May 5, 2026
gutenbergplugin pushed a commit that referenced this pull request May 5, 2026
* Keep overlapping compaction updates to avoid YDoc divergence

* Add backport file

---------

Co-authored-by: alecgeatches <[email protected]>
Co-authored-by: maxschmeling <[email protected]>
@github-actions github-actions Bot added the Backported to WP Core Pull request that has been successfully merged into WP Core label May 5, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 5, 2026

I just cherry-picked this PR to the wp/7.0 branch to get it included in the next release: f2a4bfa

tyxla pushed a commit that referenced this pull request May 6, 2026
* Keep overlapping compaction updates to avoid YDoc divergence

* Add backport file

---------

Co-authored-by: alecgeatches <[email protected]>
Co-authored-by: maxschmeling <[email protected]>
@tyxla
Copy link
Copy Markdown
Member

tyxla commented May 6, 2026

I just cherry-picked this PR to the release/23.1 branch to get it included in the next release: d037dc8

@tyxla tyxla removed the Backport to Gutenberg RC Pull request that needs to be backported to a Gutenberg release candidate (RC) label May 6, 2026
pento pushed a commit to WordPress/wordpress-develop that referenced this pull request May 8, 2026
This updates the pinned hash from the `gutenberg` from `e2970ba736edb99e08fb369d4fb0c378189468ee ` to `c15cef1d6b07f666df28dac0383bafb0edfe0914`.

The following changes are included:

- RTC: Predefined retry schedules for disconnect dialog, make more lenient (WordPress/gutenberg#76966)
- Block Editor: Prevent Enter key from inserting paragraphs in contentOnly sections (WordPress/gutenberg#76989)
- Cover block: fix embed video background Error 153 in editor (WordPress/gutenberg#76904)
- Restore original template registration tests alongside activation variants (WordPress/gutenberg#77068)
- Avoid stale values in core/cover block for RTC compatibility (WordPress/gutenberg#76916)
- Bump oras-project/setup-oras (WordPress/gutenberg#77096) (WordPress/gutenberg#77110)
- RTC: Change SyncConnectionModal to isSyncConnectionErrorHandled filter and drop IS_GUTENBERG_PLUGIN check (WordPress/gutenberg#76853)
- contentOnly template lock: Fix block insertion and removal rules (WordPress/gutenberg#77119)
- Global Styles Revisions: Fix footer overflow (WordPress/gutenberg#77103)
- Revision: Fix 'Show changes' button reset state (WordPress/gutenberg#77122)
- Link picker: Decode HTML entities in link preview title (WordPress/gutenberg#77170)
- Connectors: don't clobber third-party custom render in registerDefaultConnectors (WordPress/gutenberg#77116)
- Connectors: Replace speak() with notice store for state changes (WordPress/gutenberg#77174)
- Core Data: Fix 'useEntityProp' for raw attributes (WordPress/gutenberg#77120)
- Fix PatternsActions prop name from postType to type (WordPress/gutenberg#77251)
- Fix: restore editor canvas padding in classic themes (WordPress/gutenberg#76864)
- RTC: Add filterable flag for meta box RTC compatibility (WordPress/gutenberg#76939)
- Fix failing 'WP_HTTP_Polling_Sync_Server' unit test (WordPress/gutenberg#77025) (WordPress/gutenberg#77325)
- Edit Post: Fix warning in 'useMetaBoxInitialization' hook (WordPress/gutenberg#77311)
- Update the page slug we link to for the AI plugin after the plugin has been installed and activated (WordPress/gutenberg#77336)
- Test: Connectors Point to the righ page. (WordPress/gutenberg#77272)
- Post Editor: Store metaboxes RTC-compatible flag on location entries (WordPress/gutenberg#77361)
- Core Abilities: Export initialization promise as `ready` (WordPress/gutenberg#77254)
- Block Editor: Strip per-block custom CSS on save for users without edit_css (WordPress/gutenberg#76650)
- Add heading level 1 for the fonts page (WordPress/gutenberg#77482)
- Connectors: Treat network-active plugins as active in plugin status check (WordPress/gutenberg#77661)
- RTC: Fix disconnect dialog due to uneditable entity (WordPress/gutenberg#77242)
- RTC: Fix "Connection Lost" dialog when too many entities are loaded (WordPress/gutenberg#77631)
- RTC: Fix "Edit as HTML" content reset during collaboration (WordPress/gutenberg#77043)
- RTC: Add optional `shouldSync` function to entity sync config (WordPress/gutenberg#76947)
- RTC: Fixed orphaned meta causing dirty editor state (WordPress/gutenberg#77529)
- Ensure "Retry" button is stable during retries (WordPress/gutenberg#77234)
- Patterns: add confirmation dialog before disconnecting/detaching (WordPress/gutenberg#75713)
- Template parts: make 'Detach' context menu item consistent across patterns and template parts (WordPress/gutenberg#77581)
- Remove sandbox `allow-same-origin` for core/html blocks (Merge WordPress/gutenberg#77212 to `wp/7.0`) (WordPress/gutenberg#77699)
- Added Context for Next/Prev Enlarge Image (WordPress/gutenberg#76967)
- Backport: Writing Flow: fix arrow keys skipping paragraph containing link (WordPress/gutenberg#77478)
- Revisions: Improve screen reader accessibility for diff markers region and slider (WordPress/gutenberg#77660)
- Connectors: Add role="list" wrapper to connector cards for valid ARIA structure (WordPress/gutenberg#77689)
- Command Palette: Fix macOs label for sites unable to determine UA via PHP (WordPress/gutenberg#77638)
- RTC: Fix inline inserter reset on update sync (WordPress/gutenberg#76980) (WordPress/gutenberg#77706)
- Connectors: keep focus on action Button during install (WordPress/gutenberg#77544)
- Added Translator Context for Reply (WordPress/gutenberg#77891)
- Editor: Improve revisions diff pairing performance (WordPress/gutenberg#77126)
- Core Data: Treat single-item responses specially (WordPress/gutenberg#76318)
- Site editor: preserve non-global styles in pattern previews (WordPress/gutenberg#77957)
- RTC: Fix divergence when two offline users reconnect (WordPress/gutenberg#77980)
- RTC: Fix compaction unit test (WordPress/gutenberg#77986)
- Connectors: Stop e2e capability restriction from leaking across specs (WordPress/gutenberg#77857)
- Connectors: Clarify AI plugin callout copy (WordPress/gutenberg#78043)
- Fix: Only auto register settings if the plugin the connector references is installed and active. (WordPress/gutenberg#77273)
- Connectors: Add is_active callback support to plugin registration (WordPress/gutenberg#77897)
- RTC: Fix race condition on room creation which can cause a split update log (WordPress/gutenberg#77675)
- RTC: Fix find_canonical_storage_post_id() always returning null (WordPress/gutenberg#78053)
- i18n: add context to scale (WordPress/gutenberg#76917)
- Revisions: Simplify fetching (WordPress/gutenberg#77086)
- e2e: Add e2e tests for template and template part revisions (WordPress/gutenberg#76923)
- Editor: Paginate revisions slider by 100 per page (WordPress/gutenberg#77200) (WordPress/gutenberg#78070)
- Revisions: Add diagonal stripe patterns to diff markers to avoid color-only distinction (WordPress/gutenberg#77904)
- Revision: Fix failing e2e test (WordPress/gutenberg#78079)
- Real-time collaboration: Bundle @wordpress/sync instead of exposing as wp.sync (WordPress/gutenberg#78085)

A full list of changes can be found on GitHub: https://github.com/WordPress/gutenberg/compare/e2970ba736edb99e08fb369d4fb0c378189468ee…c15cef1d6b07f666df28dac0383bafb0edfe0914.

Log created with:

git log --reverse --format="- %s" e2970ba736edb99e08fb369d4fb0c378189468ee..c15cef1d6b07f666df28dac0383bafb0edfe0914 | sed 's|#\([0-9][0-9]*\)|https://github.com/WordPress/gutenberg/pull/\1|g; /github\.com\/WordPress\/gutenberg\/pull/!d' | pbcopy

See #64595.

git-svn-id: https://develop.svn.wordpress.org/trunk@62333 602fd350-edb4-49c9-b593-d223f7449a82
markjaquith pushed a commit to markjaquith/WordPress that referenced this pull request May 8, 2026
This updates the pinned hash from the `gutenberg` from `e2970ba736edb99e08fb369d4fb0c378189468ee ` to `c15cef1d6b07f666df28dac0383bafb0edfe0914`.

The following changes are included:

- RTC: Predefined retry schedules for disconnect dialog, make more lenient (WordPress/gutenberg#76966)
- Block Editor: Prevent Enter key from inserting paragraphs in contentOnly sections (WordPress/gutenberg#76989)
- Cover block: fix embed video background Error 153 in editor (WordPress/gutenberg#76904)
- Restore original template registration tests alongside activation variants (WordPress/gutenberg#77068)
- Avoid stale values in core/cover block for RTC compatibility (WordPress/gutenberg#76916)
- Bump oras-project/setup-oras (WordPress/gutenberg#77096) (WordPress/gutenberg#77110)
- RTC: Change SyncConnectionModal to isSyncConnectionErrorHandled filter and drop IS_GUTENBERG_PLUGIN check (WordPress/gutenberg#76853)
- contentOnly template lock: Fix block insertion and removal rules (WordPress/gutenberg#77119)
- Global Styles Revisions: Fix footer overflow (WordPress/gutenberg#77103)
- Revision: Fix 'Show changes' button reset state (WordPress/gutenberg#77122)
- Link picker: Decode HTML entities in link preview title (WordPress/gutenberg#77170)
- Connectors: don't clobber third-party custom render in registerDefaultConnectors (WordPress/gutenberg#77116)
- Connectors: Replace speak() with notice store for state changes (WordPress/gutenberg#77174)
- Core Data: Fix 'useEntityProp' for raw attributes (WordPress/gutenberg#77120)
- Fix PatternsActions prop name from postType to type (WordPress/gutenberg#77251)
- Fix: restore editor canvas padding in classic themes (WordPress/gutenberg#76864)
- RTC: Add filterable flag for meta box RTC compatibility (WordPress/gutenberg#76939)
- Fix failing 'WP_HTTP_Polling_Sync_Server' unit test (WordPress/gutenberg#77025) (WordPress/gutenberg#77325)
- Edit Post: Fix warning in 'useMetaBoxInitialization' hook (WordPress/gutenberg#77311)
- Update the page slug we link to for the AI plugin after the plugin has been installed and activated (WordPress/gutenberg#77336)
- Test: Connectors Point to the righ page. (WordPress/gutenberg#77272)
- Post Editor: Store metaboxes RTC-compatible flag on location entries (WordPress/gutenberg#77361)
- Core Abilities: Export initialization promise as `ready` (WordPress/gutenberg#77254)
- Block Editor: Strip per-block custom CSS on save for users without edit_css (WordPress/gutenberg#76650)
- Add heading level 1 for the fonts page (WordPress/gutenberg#77482)
- Connectors: Treat network-active plugins as active in plugin status check (WordPress/gutenberg#77661)
- RTC: Fix disconnect dialog due to uneditable entity (WordPress/gutenberg#77242)
- RTC: Fix "Connection Lost" dialog when too many entities are loaded (WordPress/gutenberg#77631)
- RTC: Fix "Edit as HTML" content reset during collaboration (WordPress/gutenberg#77043)
- RTC: Add optional `shouldSync` function to entity sync config (WordPress/gutenberg#76947)
- RTC: Fixed orphaned meta causing dirty editor state (WordPress/gutenberg#77529)
- Ensure "Retry" button is stable during retries (WordPress/gutenberg#77234)
- Patterns: add confirmation dialog before disconnecting/detaching (WordPress/gutenberg#75713)
- Template parts: make 'Detach' context menu item consistent across patterns and template parts (WordPress/gutenberg#77581)
- Remove sandbox `allow-same-origin` for core/html blocks (Merge WordPress/gutenberg#77212 to `wp/7.0`) (WordPress/gutenberg#77699)
- Added Context for Next/Prev Enlarge Image (WordPress/gutenberg#76967)
- Backport: Writing Flow: fix arrow keys skipping paragraph containing link (WordPress/gutenberg#77478)
- Revisions: Improve screen reader accessibility for diff markers region and slider (WordPress/gutenberg#77660)
- Connectors: Add role="list" wrapper to connector cards for valid ARIA structure (WordPress/gutenberg#77689)
- Command Palette: Fix macOs label for sites unable to determine UA via PHP (WordPress/gutenberg#77638)
- RTC: Fix inline inserter reset on update sync (WordPress/gutenberg#76980) (WordPress/gutenberg#77706)
- Connectors: keep focus on action Button during install (WordPress/gutenberg#77544)
- Added Translator Context for Reply (WordPress/gutenberg#77891)
- Editor: Improve revisions diff pairing performance (WordPress/gutenberg#77126)
- Core Data: Treat single-item responses specially (WordPress/gutenberg#76318)
- Site editor: preserve non-global styles in pattern previews (WordPress/gutenberg#77957)
- RTC: Fix divergence when two offline users reconnect (WordPress/gutenberg#77980)
- RTC: Fix compaction unit test (WordPress/gutenberg#77986)
- Connectors: Stop e2e capability restriction from leaking across specs (WordPress/gutenberg#77857)
- Connectors: Clarify AI plugin callout copy (WordPress/gutenberg#78043)
- Fix: Only auto register settings if the plugin the connector references is installed and active. (WordPress/gutenberg#77273)
- Connectors: Add is_active callback support to plugin registration (WordPress/gutenberg#77897)
- RTC: Fix race condition on room creation which can cause a split update log (WordPress/gutenberg#77675)
- RTC: Fix find_canonical_storage_post_id() always returning null (WordPress/gutenberg#78053)
- i18n: add context to scale (WordPress/gutenberg#76917)
- Revisions: Simplify fetching (WordPress/gutenberg#77086)
- e2e: Add e2e tests for template and template part revisions (WordPress/gutenberg#76923)
- Editor: Paginate revisions slider by 100 per page (WordPress/gutenberg#77200) (WordPress/gutenberg#78070)
- Revisions: Add diagonal stripe patterns to diff markers to avoid color-only distinction (WordPress/gutenberg#77904)
- Revision: Fix failing e2e test (WordPress/gutenberg#78079)
- Real-time collaboration: Bundle @wordpress/sync instead of exposing as wp.sync (WordPress/gutenberg#78085)

A full list of changes can be found on GitHub: https://github.com/WordPress/gutenberg/compare/e2970ba736edb99e08fb369d4fb0c378189468ee…c15cef1d6b07f666df28dac0383bafb0edfe0914.

Log created with:

git log --reverse --format="- %s" e2970ba736edb99e08fb369d4fb0c378189468ee..c15cef1d6b07f666df28dac0383bafb0edfe0914 | sed 's|#\([0-9][0-9]*\)|https://github.com/WordPress/gutenberg/pull/\1|g; /github\.com\/WordPress\/gutenberg\/pull/!d' | pbcopy

See #64595.
Built from https://develop.svn.wordpress.org/trunk@62333


git-svn-id: http://core.svn.wordpress.org/trunk@61614 1a063a9b-81f0-0310-95a4-ce76da25c4cd
pento pushed a commit to WordPress/wordpress-develop that referenced this pull request May 8, 2026
This updates the pinned hash from the `gutenberg` from `e2970ba736edb99e08fb369d4fb0c378189468ee ` to `c15cef1d6b07f666df28dac0383bafb0edfe0914`.

The following changes are included:

- RTC: Predefined retry schedules for disconnect dialog, make more lenient (WordPress/gutenberg#76966)
- Block Editor: Prevent Enter key from inserting paragraphs in contentOnly sections (WordPress/gutenberg#76989)
- Cover block: fix embed video background Error 153 in editor (WordPress/gutenberg#76904)
- Restore original template registration tests alongside activation variants (WordPress/gutenberg#77068)
- Avoid stale values in core/cover block for RTC compatibility (WordPress/gutenberg#76916)
- Bump oras-project/setup-oras (WordPress/gutenberg#77096) (WordPress/gutenberg#77110)
- RTC: Change SyncConnectionModal to isSyncConnectionErrorHandled filter and drop IS_GUTENBERG_PLUGIN check (WordPress/gutenberg#76853)
- contentOnly template lock: Fix block insertion and removal rules (WordPress/gutenberg#77119)
- Global Styles Revisions: Fix footer overflow (WordPress/gutenberg#77103)
- Revision: Fix 'Show changes' button reset state (WordPress/gutenberg#77122)
- Link picker: Decode HTML entities in link preview title (WordPress/gutenberg#77170)
- Connectors: don't clobber third-party custom render in registerDefaultConnectors (WordPress/gutenberg#77116)
- Connectors: Replace speak() with notice store for state changes (WordPress/gutenberg#77174)
- Core Data: Fix 'useEntityProp' for raw attributes (WordPress/gutenberg#77120)
- Fix PatternsActions prop name from postType to type (WordPress/gutenberg#77251)
- Fix: restore editor canvas padding in classic themes (WordPress/gutenberg#76864)
- RTC: Add filterable flag for meta box RTC compatibility (WordPress/gutenberg#76939)
- Fix failing 'WP_HTTP_Polling_Sync_Server' unit test (WordPress/gutenberg#77025) (WordPress/gutenberg#77325)
- Edit Post: Fix warning in 'useMetaBoxInitialization' hook (WordPress/gutenberg#77311)
- Update the page slug we link to for the AI plugin after the plugin has been installed and activated (WordPress/gutenberg#77336)
- Test: Connectors Point to the righ page. (WordPress/gutenberg#77272)
- Post Editor: Store metaboxes RTC-compatible flag on location entries (WordPress/gutenberg#77361)
- Core Abilities: Export initialization promise as `ready` (WordPress/gutenberg#77254)
- Block Editor: Strip per-block custom CSS on save for users without edit_css (WordPress/gutenberg#76650)
- Add heading level 1 for the fonts page (WordPress/gutenberg#77482)
- Connectors: Treat network-active plugins as active in plugin status check (WordPress/gutenberg#77661)
- RTC: Fix disconnect dialog due to uneditable entity (WordPress/gutenberg#77242)
- RTC: Fix "Connection Lost" dialog when too many entities are loaded (WordPress/gutenberg#77631)
- RTC: Fix "Edit as HTML" content reset during collaboration (WordPress/gutenberg#77043)
- RTC: Add optional `shouldSync` function to entity sync config (WordPress/gutenberg#76947)
- RTC: Fixed orphaned meta causing dirty editor state (WordPress/gutenberg#77529)
- Ensure "Retry" button is stable during retries (WordPress/gutenberg#77234)
- Patterns: add confirmation dialog before disconnecting/detaching (WordPress/gutenberg#75713)
- Template parts: make 'Detach' context menu item consistent across patterns and template parts (WordPress/gutenberg#77581)
- Remove sandbox `allow-same-origin` for core/html blocks (Merge WordPress/gutenberg#77212 to `wp/7.0`) (WordPress/gutenberg#77699)
- Added Context for Next/Prev Enlarge Image (WordPress/gutenberg#76967)
- Backport: Writing Flow: fix arrow keys skipping paragraph containing link (WordPress/gutenberg#77478)
- Revisions: Improve screen reader accessibility for diff markers region and slider (WordPress/gutenberg#77660)
- Connectors: Add role="list" wrapper to connector cards for valid ARIA structure (WordPress/gutenberg#77689)
- Command Palette: Fix macOs label for sites unable to determine UA via PHP (WordPress/gutenberg#77638)
- RTC: Fix inline inserter reset on update sync (WordPress/gutenberg#76980) (WordPress/gutenberg#77706)
- Connectors: keep focus on action Button during install (WordPress/gutenberg#77544)
- Added Translator Context for Reply (WordPress/gutenberg#77891)
- Editor: Improve revisions diff pairing performance (WordPress/gutenberg#77126)
- Core Data: Treat single-item responses specially (WordPress/gutenberg#76318)
- Site editor: preserve non-global styles in pattern previews (WordPress/gutenberg#77957)
- RTC: Fix divergence when two offline users reconnect (WordPress/gutenberg#77980)
- RTC: Fix compaction unit test (WordPress/gutenberg#77986)
- Connectors: Stop e2e capability restriction from leaking across specs (WordPress/gutenberg#77857)
- Connectors: Clarify AI plugin callout copy (WordPress/gutenberg#78043)
- Fix: Only auto register settings if the plugin the connector references is installed and active. (WordPress/gutenberg#77273)
- Connectors: Add is_active callback support to plugin registration (WordPress/gutenberg#77897)
- RTC: Fix race condition on room creation which can cause a split update log (WordPress/gutenberg#77675)
- RTC: Fix find_canonical_storage_post_id() always returning null (WordPress/gutenberg#78053)
- i18n: add context to scale (WordPress/gutenberg#76917)
- Revisions: Simplify fetching (WordPress/gutenberg#77086)
- e2e: Add e2e tests for template and template part revisions (WordPress/gutenberg#76923)
- Editor: Paginate revisions slider by 100 per page (WordPress/gutenberg#77200) (WordPress/gutenberg#78070)
- Revisions: Add diagonal stripe patterns to diff markers to avoid color-only distinction (WordPress/gutenberg#77904)
- Revision: Fix failing e2e test (WordPress/gutenberg#78079)
- Real-time collaboration: Bundle @wordpress/sync instead of exposing as wp.sync (WordPress/gutenberg#78085)

A full list of changes can be found on GitHub: https://github.com/WordPress/gutenberg/compare/e2970ba736edb99e08fb369d4fb0c378189468ee…c15cef1d6b07f666df28dac0383bafb0edfe0914.

Log created with:

git log --reverse --format="- %s" e2970ba736edb99e08fb369d4fb0c378189468ee..c15cef1d6b07f666df28dac0383bafb0edfe0914 | sed 's|#\([0-9][0-9]*\)|https://github.com/WordPress/gutenberg/pull/\1|g; /github\.com\/WordPress\/gutenberg\/pull/!d' | pbcopy

Reviewed by desrosj.
Merges [62333] to the 7.0 branch.

Props ellatrix, desrosj.
See #64595.

git-svn-id: https://develop.svn.wordpress.org/branches/7.0@62335 602fd350-edb4-49c9-b593-d223f7449a82
markjaquith pushed a commit to markjaquith/WordPress that referenced this pull request May 8, 2026
This updates the pinned hash from the `gutenberg` from `e2970ba736edb99e08fb369d4fb0c378189468ee ` to `c15cef1d6b07f666df28dac0383bafb0edfe0914`.

The following changes are included:

- RTC: Predefined retry schedules for disconnect dialog, make more lenient (WordPress/gutenberg#76966)
- Block Editor: Prevent Enter key from inserting paragraphs in contentOnly sections (WordPress/gutenberg#76989)
- Cover block: fix embed video background Error 153 in editor (WordPress/gutenberg#76904)
- Restore original template registration tests alongside activation variants (WordPress/gutenberg#77068)
- Avoid stale values in core/cover block for RTC compatibility (WordPress/gutenberg#76916)
- Bump oras-project/setup-oras (WordPress/gutenberg#77096) (WordPress/gutenberg#77110)
- RTC: Change SyncConnectionModal to isSyncConnectionErrorHandled filter and drop IS_GUTENBERG_PLUGIN check (WordPress/gutenberg#76853)
- contentOnly template lock: Fix block insertion and removal rules (WordPress/gutenberg#77119)
- Global Styles Revisions: Fix footer overflow (WordPress/gutenberg#77103)
- Revision: Fix 'Show changes' button reset state (WordPress/gutenberg#77122)
- Link picker: Decode HTML entities in link preview title (WordPress/gutenberg#77170)
- Connectors: don't clobber third-party custom render in registerDefaultConnectors (WordPress/gutenberg#77116)
- Connectors: Replace speak() with notice store for state changes (WordPress/gutenberg#77174)
- Core Data: Fix 'useEntityProp' for raw attributes (WordPress/gutenberg#77120)
- Fix PatternsActions prop name from postType to type (WordPress/gutenberg#77251)
- Fix: restore editor canvas padding in classic themes (WordPress/gutenberg#76864)
- RTC: Add filterable flag for meta box RTC compatibility (WordPress/gutenberg#76939)
- Fix failing 'WP_HTTP_Polling_Sync_Server' unit test (WordPress/gutenberg#77025) (WordPress/gutenberg#77325)
- Edit Post: Fix warning in 'useMetaBoxInitialization' hook (WordPress/gutenberg#77311)
- Update the page slug we link to for the AI plugin after the plugin has been installed and activated (WordPress/gutenberg#77336)
- Test: Connectors Point to the righ page. (WordPress/gutenberg#77272)
- Post Editor: Store metaboxes RTC-compatible flag on location entries (WordPress/gutenberg#77361)
- Core Abilities: Export initialization promise as `ready` (WordPress/gutenberg#77254)
- Block Editor: Strip per-block custom CSS on save for users without edit_css (WordPress/gutenberg#76650)
- Add heading level 1 for the fonts page (WordPress/gutenberg#77482)
- Connectors: Treat network-active plugins as active in plugin status check (WordPress/gutenberg#77661)
- RTC: Fix disconnect dialog due to uneditable entity (WordPress/gutenberg#77242)
- RTC: Fix "Connection Lost" dialog when too many entities are loaded (WordPress/gutenberg#77631)
- RTC: Fix "Edit as HTML" content reset during collaboration (WordPress/gutenberg#77043)
- RTC: Add optional `shouldSync` function to entity sync config (WordPress/gutenberg#76947)
- RTC: Fixed orphaned meta causing dirty editor state (WordPress/gutenberg#77529)
- Ensure "Retry" button is stable during retries (WordPress/gutenberg#77234)
- Patterns: add confirmation dialog before disconnecting/detaching (WordPress/gutenberg#75713)
- Template parts: make 'Detach' context menu item consistent across patterns and template parts (WordPress/gutenberg#77581)
- Remove sandbox `allow-same-origin` for core/html blocks (Merge WordPress/gutenberg#77212 to `wp/7.0`) (WordPress/gutenberg#77699)
- Added Context for Next/Prev Enlarge Image (WordPress/gutenberg#76967)
- Backport: Writing Flow: fix arrow keys skipping paragraph containing link (WordPress/gutenberg#77478)
- Revisions: Improve screen reader accessibility for diff markers region and slider (WordPress/gutenberg#77660)
- Connectors: Add role="list" wrapper to connector cards for valid ARIA structure (WordPress/gutenberg#77689)
- Command Palette: Fix macOs label for sites unable to determine UA via PHP (WordPress/gutenberg#77638)
- RTC: Fix inline inserter reset on update sync (WordPress/gutenberg#76980) (WordPress/gutenberg#77706)
- Connectors: keep focus on action Button during install (WordPress/gutenberg#77544)
- Added Translator Context for Reply (WordPress/gutenberg#77891)
- Editor: Improve revisions diff pairing performance (WordPress/gutenberg#77126)
- Core Data: Treat single-item responses specially (WordPress/gutenberg#76318)
- Site editor: preserve non-global styles in pattern previews (WordPress/gutenberg#77957)
- RTC: Fix divergence when two offline users reconnect (WordPress/gutenberg#77980)
- RTC: Fix compaction unit test (WordPress/gutenberg#77986)
- Connectors: Stop e2e capability restriction from leaking across specs (WordPress/gutenberg#77857)
- Connectors: Clarify AI plugin callout copy (WordPress/gutenberg#78043)
- Fix: Only auto register settings if the plugin the connector references is installed and active. (WordPress/gutenberg#77273)
- Connectors: Add is_active callback support to plugin registration (WordPress/gutenberg#77897)
- RTC: Fix race condition on room creation which can cause a split update log (WordPress/gutenberg#77675)
- RTC: Fix find_canonical_storage_post_id() always returning null (WordPress/gutenberg#78053)
- i18n: add context to scale (WordPress/gutenberg#76917)
- Revisions: Simplify fetching (WordPress/gutenberg#77086)
- e2e: Add e2e tests for template and template part revisions (WordPress/gutenberg#76923)
- Editor: Paginate revisions slider by 100 per page (WordPress/gutenberg#77200) (WordPress/gutenberg#78070)
- Revisions: Add diagonal stripe patterns to diff markers to avoid color-only distinction (WordPress/gutenberg#77904)
- Revision: Fix failing e2e test (WordPress/gutenberg#78079)
- Real-time collaboration: Bundle @wordpress/sync instead of exposing as wp.sync (WordPress/gutenberg#78085)

A full list of changes can be found on GitHub: https://github.com/WordPress/gutenberg/compare/e2970ba736edb99e08fb369d4fb0c378189468ee…c15cef1d6b07f666df28dac0383bafb0edfe0914.

Log created with:

git log --reverse --format="- %s" e2970ba736edb99e08fb369d4fb0c378189468ee..c15cef1d6b07f666df28dac0383bafb0edfe0914 | sed 's|#\([0-9][0-9]*\)|https://github.com/WordPress/gutenberg/pull/\1|g; /github\.com\/WordPress\/gutenberg\/pull/!d' | pbcopy

Reviewed by desrosj.
Merges [62333] to the 7.0 branch.

Props ellatrix, desrosj.
See #64595.
Built from https://develop.svn.wordpress.org/branches/7.0@62335


git-svn-id: http://core.svn.wordpress.org/branches/7.0@61616 1a063a9b-81f0-0310-95a4-ce76da25c4cd
adamsilverstein pushed a commit that referenced this pull request May 12, 2026
* Keep overlapping compaction updates to avoid YDoc divergence

* Add backport file

---------

Co-authored-by: alecgeatches <[email protected]>
Co-authored-by: maxschmeling <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Backported to WP Core Pull request that has been successfully merged into WP Core [Feature] Real-time Collaboration Phase 3 of the Gutenberg roadmap around real-time collaboration [Type] Bug An existing feature does not function as intended

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants