2.0.0-rc.14: until() through a synchronous memo misses optimistic confirmation
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 35/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Active
- Tech stack
- typescript
- Domain
- frontend
Research direction
Start by reproducing with the playground component in the issue, then swap the predicate between doubled() and count() to confirm the memo is the difference. The payload names no source files, so you will need to find where until() subscribes and how a synchronous createMemo propagates optimistic values on confirmation. Done when yield until(() => doubled() === 2) completes after setSource(1), matching the direct-read control.
Written by the indexing model from the issue text.
Description
Describe the bug
On 2.0.0-rc.14, an action waiting with until() through a synchronous memo remains pending when the actual source confirms its optimistic prediction. Reading the optimistic accessor directly in the predicate completes the same action.
The predicate subscribes before confirmation arrives. The prediction alone correctly does not satisfy the wait, but confirming it does not resolve the wait through the memo either.
Your Example Website or App
https://s.olid.uk/?id=d1d1a3ee-70c8-4afe-966d-258809cb4f06
The playground uses published 2.0.0-rc.14. Here is the full component, including the actual source update in the Confirm button:
import { action, createMemo, createOptimistic, createSignal, until } from "solid-js";
import { render } from "solid-js/web";
function App() {
const [source, setSource] = createSignal(0);
const [count, guess] = createOptimistic(() => source());
const doubled = createMemo(() => count() * 2);
const [completed, setCompleted] = createSignal(false);
const save = action(function* () {
guess(1);
yield Promise.resolve();
// Direct-read control: yield until(() => count() === 1);
yield until(() => doubled() === 2);
});
return (
<main>
<button onClick={() => save().then(() => setCompleted(true))}>1. Start</button>
<button onClick={() => setSource(1)}>2. Confirm</button>
<p>Displayed count: {count()}</p>
<p>Doubled memo: {doubled()}</p>
<p>Action completed: {String(completed())}</p>
</main>
);
}
render(() => <App />, document.getElementById("app")!);
Steps to Reproduce the Bug or Issue
- Open the playground and click 1. Start.
- The displayed count becomes
1and the doubled memo becomes2. Action completion remainsfalse, as expected while the prediction is unconfirmed. - Click 2. Confirm to set the actual source to
1. - Action completion still remains
false. - Change the wait to
yield until(() => count() === 1), rebuild, and repeat. Action completion becomestrueafter confirmation.
Both the failing memo case and the successful direct-read control were verified in the browser.
Expected behavior
The optimistic prediction alone should not satisfy until(). Once the actual source confirms the prediction, the predicate through the synchronous memo should resolve and the action should complete, just as the direct-read predicate does.
Platform
- OS: Linux (WSL)
- Browser: Chrome for Testing 153.0.8010.12, tested with Playwright
- Solid:
2.0.0-rc.14
- Dominant language
- TypeScript
- Stars
- 36.1k
- Forks
- 1.1k
- Avg merge
- 11h 34m
- Merged PRs (30d)
- 341
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 2/5 1-3 hours Newbie friendliness 66/100
Maintainers usually reply within 1 day
-
[diagnostics rc.14 / next] Browser bridge drops shared references, so `expectNoSilentHolds` throws on any capture with a `LONG_HOLD`Possibly taken A pull request linked to this issue is open or already merged. Open
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
Difficulty 5/5 Over a week Newbie friendliness 12/100
Maintainers usually reply within 1 day
-
Difficulty 3/5 Half a day Newbie friendliness 32/100
Maintainers usually reply within 1 day
-
[2.0 rc.14 / next] SSR: async memo retries run under another concurrent render's contextPossibly taken A pull request linked to this issue is open or already merged. Open
Difficulty 3/5 1-2 days Newbie friendliness 52/100
Maintainers usually reply within 1 day
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 82/100
homarr-labs/dashboard-icons#2939 ·
Maintainers usually reply within 1 day
-
Agent/category reasoning variants are still checked against the stale model cache in chat.paramsOpenopencode
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
code-yeongyu/oh-my-openagent#10003 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
Maintainers usually reply within 1 day
-
Actions on ToastsOpen
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
nextcloud-libraries/nextcloud-dialogs#2669 ·
Maintainers usually reply within 1 day