Solid 2: reconcile repeats unchanged presence and holds unrelated updates
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 68/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- typescript
- Domain
- frontend
Research direction
Start with packages/signals/src/store/next/store.ts, especially notifyFold and notifyFoldTail, then run the linked playground reproduction. Add an isolated regression test for the unchanged-absence case and verify that Value: 1 renders while the deletion action remains pending, while actual presence changes still notify.
Written by the indexing model from the issue text.
Description
Describe the bug
Reconciling a plain store can hold an unrelated field's rendered update behind a pending action when a separate in expression observes a property that the action deleted. The incoming snapshot leaves that property absent, matching its already-staged presence.
Reproduction
One-button playground — preview 3ed3810, Tailwind disabled.
Click Build, then Run reproduction. The sequence is:
// Initial store: { a: { value: 0 }, b: { failed: true } }
const removeFlag = action(function* () {
setState(draft => { delete draft.b.failed; });
yield gate;
});
// In a later event, while removeFlag is pending:
setState(reconcile({ a: { value: 1 }, b: {} }));
The component separately renders state.a.value and "failed" in state.b; no memo combines them. The playground releases the action after 2.5 seconds.
Expected: Value: 1 appears while the deletion action remains pending.
Actual: Value: 0 remains until that action finishes, then becomes 1.
Controls and investigation
Verified in Chromium and Firefox, in development and production builds:
- Removing the separate presence expression allows the value to update immediately.
- Assigning
failed = falseinstead of deleting it, and reconciling the samefalse, allows it to update immediately. - Writing
a.value = 1directly instead of reconciling allows it to update immediately.
The suspected cause is the presence notification in notifyFold and notifyFoldTail. Value notifications compare old/new values, but the presence loops call setSignal for every observed key without comparing presence. The core joins the node's holding transaction before rejecting an equal value, so repeating false can entangle the reconciliation with the deletion action.
Adding an old/new presence comparison to both loops in an isolated test bundle prevents the hold. This is diagnostic evidence, not a fully validated patch.
Actual presence changes must still notify: deleting a prop override can select another merge source even when the resulting value is equal. This reproduction has no merge or provider switch; the suspected problem is the repeated absence-to-absence notification.
Version
solid-js and @solidjs/web from https://pkg.pr.new/mizulu/solid2/...@3ed3810 (Solid commit 3ed3810097bfc5e5d15829277b40315bbd2b5f74).
- Dominant language
- TypeScript
- Stars
- 36.1k
- Forks
- 1.1k
- Avg merge
- 9h 56m
- Merged PRs (30d)
- 268
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from solidjs/solid
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 35/100
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 55/100
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 45/100
solidjs/solid#3739 · 1 comment ·
Maintainers usually reply within 1 day
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
Maintainers usually reply within 1 day
-
📕documentation
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
db-ux-design-system/core-web#8343 ·
Maintainers usually reply within 1 day
-
enhancement triage/needs-triage
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
heygen-com/hyperframes#4944 ·
Maintainers usually reply within 1 day
-
ai-driven-qa bug claude
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
linagora/twake-calendar-frontend#1493 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
material-extensions/vscode-material-icon-theme#3610 ·
Maintainers usually reply within 2 days