Award emoji / notes added via API not reflected live on open MR page (requires page reload)
### Summary
When an MR page is open in the browser, award emoji reactions (and other note-level changes) added by external services via the REST API are not reflected in real-time. The UI only updates after a full page reload. The backend persists the change correctly and ActionCable events are published, but the frontend store does not update.
This is a regression introduced in 17.10 by !181396 ("Improve syncWithVuex plugin performance"), confirmed working in 18.7.2 and broken from 18.8.x onward.
### Steps to reproduce
1. Open a merge request page in the browser as user A
2. As a separate service account / via `curl`, call:
`POST /api/v4/projects/:id/merge_requests/:iid/notes/:note_id/award_emoji?name=thumbsup`
3. Observe the MR page — the award emoji does **not** appear without a page reload
4. Reload the page — the emoji is now visible, confirming it was persisted
### Example Project
Any project with an MR. Reproduced via Atlantis automation on a Self-Managed instance running 18.10.5.
### What is the current *bug* behavior?
Award emoji reactions (and other note-level changes) added via the API by external services do not appear on an already-open MR page. The browser refetches `/noteable/merge_request/:id/notes` and `/merge_requests/:iid/discussions.json` (triggered by ActionCable), but the UI is not updated. A full page reload is required to see the changes.
Changes made by the **currently logged-in user** are unaffected.
### What is the expected *correct* behavior?
Award emoji reactions and note updates added via the API should appear in real-time on open MR pages, consistent with behaviour prior to 17.10.
### Relevant logs and/or screenshots
Log timeline showing the full sequence:
- `POST /award_emoji` → `status=201`, `redis_action_cable_calls=2` ✅ (backend correct)
- Browser refetches `/noteable/.../notes` → `status=200` ✅
- Browser refetches `/discussions.json` → `status=304` then `200` ✅
- MR page does **not** render the new emoji ❌
- Full page reload → emoji visible ✅
### Output of checks
<details>
<summary>Expand for output related to GitLab environment info</summary>
<pre>
Self-Managed, Linux package (Omnibus), GitLab 18.10.5 (Premium)
</pre>
</details>
<details>
<summary>Expand for output related to the GitLab application check</summary>
<pre>
Not provided
</pre>
</details>
### Possible fixes
The regression was introduced by !181396 ("Improve syncWithVuex plugin performance", 17.10), which changed the `syncWithVuex` Pinia plugin from syncing the entire Vuex state on every mutation to only replaying named mutations that exist in both stores.
For externally-triggered note updates, `updateOrCreateNotes()` calls `UPDATE_NOTE` / `ADD_NEW_NOTE` on the Pinia `useNotes` store, but the corresponding mutation name (e.g. `notes/UPDATE_NOTE`) is not registered in `vuexStore._mutations`. Because MR page Vue components still read from the Vuex store during the migration, the UI never receives the update — it is silently dropped.
The fix should ensure that note mutations triggered by `fetchUpdatedNotes()` (the ActionCable real-time path) are correctly propagated back to the Vuex store, or that the consuming components read from Pinia directly.
Related:
- !181396 — breaking change (17.10)
- !178302 — prerequisite change (17.9)
### Patch release information for backports
If the bug fix needs to be backported in a [patch release](https://handbook.gitlab.com/handbook/engineering/releases/patch-releases) to a version under [the maintenance policy](https://docs.gitlab.com/policy/maintenance/), please follow the steps on the [patch release runbook for GitLab engineers](https://gitlab.com/gitlab-org/release/docs/-/blob/master/general/patch/engineers.md).
Refer to the [internal "Release Information" dashboard](https://dashboards.gitlab.net/d/delivery-release_info/delivery3a-release-information?orgId=1) for information about the next patch release, including the targeted versions, expected release date, and current status.
issue