LearnNewsExamplesServices
Frontmatter
id8464
titleFix Blog List Rendering Artifact in Release View
stateClosed
labels
bug
assigneestobiu
createdAtJan 9, 2026, 1:42 PM
updatedAtJan 9, 2026, 2:50 PM
githubUrlhttps://github.com/neomjs/neo/issues/8464
authortobiu
commentsCount2
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJan 9, 2026, 2:13 PM

Fix Blog List Rendering Artifact in Release View

Closed v11.19.1 bug
tobiu
tobiu commented on Jan 9, 2026, 1:42 PM

A rendering artifact has been observed in the Portal App where the Blog (News) List occasionally renders inside the Release Notes view, specifically taking over the Splitter component's DOM node.

Symptoms:

  • The Splitter in Portal.view.news.release.MainContainer (neo-splitter-1) acquires the class names of the Blog List Wrapper (portal-blog-list-wrapper).
  • The Splitter contains the Blog List (neo-list-2) as a child node in the VDOM/VNode tree.
  • This occurs during navigation between the News (Blog) and Release Notes tabs.

Theory (Potential Race Condition): This may be caused by a race condition rather than a direct VDOM diffing error.

  1. The News (Blog) List initiates a large content update or roundtrip.
  2. The user switches the tab to Release Notes before the update completes.
  3. The pending update arrives and targets the same parent index (Item 1), which is now occupied by the Splitter in the new view.
  4. The VDOM engine applies the update to the current occupant of that index, resulting in the "zombie" node state.

Fix: We will enforce VDOM node distinction by adding unique key properties to:

  1. The Splitter in apps/portal/view/shared/content/Container.mjs.
  2. The List in apps/portal/view/news/blog/Container.mjs.

This will force the VDOM engine to treat these as distinct nodes, tearing down the old one and creating the new one, regardless of timing or index collisions.

tobiu added the bug label on Jan 9, 2026, 1:42 PM
tobiu referenced in commit c454339 - "fix: Blog List Rendering Artifact in Release View (#8464)" on Jan 9, 2026, 2:12 PM
tobiu assigned to @tobiu on Jan 9, 2026, 2:12 PM
tobiu
tobiu Jan 9, 2026, 2:12 PM

Input from Gemini 3 Pro:

✦ I have implemented the fix by enforcing unique, deterministic VDOM IDs for the conflicting components (Splitter and Blog List). This ensures the VDOM engine treats them as distinct nodes during view switching, preventing the race condition where one view's update "zombies" into the other.

Implementation Detail: Used onConstructed to dynamically set IDs based on the parent container's ID (${me.id}__splitter / ${me.id}__list). This avoids modifying the class construct logic and preserves extensibility.

Note: While this fixes the immediate artifact, the fact that manual IDs were required suggests a deeper issue in how the VDOM engine handles auto-generated ID syncing during rapid state transitions (race conditions). This should be investigated further in a separate initiative.

Commit: c4543396d (#8464)

tobiu closed this issue on Jan 9, 2026, 2:13 PM
tobiu cross-referenced by #8465 on Jan 9, 2026, 2:32 PM
tobiu
tobiu Jan 9, 2026, 2:50 PM

Input from Gemini 3 Pro:

✦ ✦ Follow-up: The permanent architectural fix for this issue has been implemented and verified in #8465. The manual ID assignments previously added to the Portal app have been removed as they are no longer necessary.