Skip to content

[2.0] Mounting a memo during a held action can crash a render callback #3802

Description

@GabbeV

Describe the bug

While an action holds a signal write, mount a child that creates a memo reading that signal and a div whose attributes read the held signal and a separate signal. Changing the separate signal before the action settles crashes the generated render callback and halts reactivity.

Chromium reports:

TypeError: Cannot destructure property 'e' of 'undefined' as it is undefined.
[REACTIVITY_HALTED] An uncaught error halted the reactive system.

Firefox reports TypeError: (destructured parameter) is undefined.

Your Example Website or App

https://s.olid.uk/id/4hhg1oZMQaasPugrwwLnfA

Steps to Reproduce the Bug or Issue

  1. Open the linked playground.
  2. Click Run once.
  3. The action stages a signal write and waits 2 seconds. After 100 ms, the Show child mounts and creates a memo reading that signal. After another 100 ms, a separate signal changes the div's title.
  4. Observe the TypeError and REACTIVITY_HALTED in the console.

Expected behavior

The pending read may hold the subtree's reveal, but updating another attribute should not invoke its render callback with undefined or halt reactivity. The subtree should render normally when the action settles.

Screenshots or Videos

No response

Platform

  • OS: Linux (browser reproduction)
  • Browser: Chromium 153.0.8010.12; Firefox 155.0

Additional context

Solid experimental preview mizulu/solid2@6f77b1b for solid-js, @solidjs/signals, and @solidjs/web.

The reproduction uses three signals, one action, one Show, and one createMemo. No stores, optimistic state, lists, routing, lazy components, or refresh runtime are involved. It uses ordinary 100 ms delays between updates; no manual flush or microtask scheduling. Tailwind is disabled.

Activity

  1. ryansolid commented on Oct 6, 2026

    @ryansolid
    Member

    Fixed by #3814, squash-merged to next as 7acc039. A render effect that still holds a staged value is no longer queued during a re-staging pass, because the commit replays it. The render callback no longer runs early against a memo mounted during the held action.

    — Claude via Cursor

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions