Backport useDeferredValue initial values - #33

Draft
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value
Draft

Backport useDeferredValue initial values#33
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value

Conversation

@christopher-buss

@christopher-busschristopher-buss commented Aug 31, 2026

Copy link
Copy Markdown

Summary

Backport React 19.2's optional initialValue argument for useDeferredValue on top of #25.

The first render can commit the supplied preview immediately and then schedule the final value as a distinct deferred task. The port also includes the behavior needed to recover suspended previews, avoid nested deferred waterfalls, and preserve the existing one-argument React 18 contract.

React Debug Tools includes the #28508 correction: inspection logs and returns the committed deferred value so the inspected component follows the committed tree's control flow and every subsequent hook stays aligned.

Dependency and consolidation

Upstream source and test ledger

Pinned stable contract: React v19.2.0.

Upstream source or testReact-Luau targetStatus and deviation
Public hook and dispatcher typeReactHooks.lua; ReactCurrentDispatcher.luaDirect. Luau cannot distinguish an omitted argument from explicit nil.
Hook implementation and seven DEV dispatchersReactFiberHooks.new.luaAdapted to React 17's lane layout. Hidden-tree/Activity prerendering is unavailable and marked at the source site.
Deferred-lane requestReactFiberWorkLoop.new.luaReact 17 has no identity-valued Suspense handler stack. The port reconstructs the exact boundary selected by its canonical throw path using the visibility cursor and shouldCaptureSuspense predicate, including fallback-subtree and unstable_avoidThisFallback semantics.
Deferred lane families and root bookkeepingReactFiberLane.luaReact 17's nine transition bits keep their numeric values. Seven remain update lanes and the two highest form an independently rotating deferred family.
Separate task and entangled render lanesReactFiberLane.luaReact 17 collapses those sets. A constrained reverse selection chooses a pinged deferred task only when its stored entangled parent is also selected and pinged; priority is unchanged.
DidDefer recovery and DidDefer flagReactFiberBeginWork.new.lua; ReactFiberFlags.luaDirect behavior with site-level register-limit and mutually-exclusive flag-reuse deviations. Hydration-only branches are unavailable.
Boundaryless component suspension and HostRoot unwindReactFiberThrow.new.lua; ReactFiberUnwindWork.new.luaAdapted prerequisite for concurrent roots. Interrupted mounted Fibers restore from alternates; new suspended mounts retain hook state.
Concurrent finish and commit readinessReactFiberWorkLoop.new.luaReact 17 folds the modern helpers together and explicitly threads spawnedLane through concurrent and separate sync paths.
Debug Tools implementationReactDebugHooks.luaReturns the committed memoized value. React 19 debugInfo and hookSource schema fields are not available in this React 17 Debug Tools model and are marked at the test site.
Public deferred-value casesReactDeferredValue.spec.luaAll renderer-supported cases remain in upstream order. React 19 sibling-prewarming duplicate logs are omitted because React 17 does not prewarm siblings.
Debug Tools #28508 regressionReactHooksInspectionIntegration.spec.luaPreserves initial, pending, and final rendered output; State; DeferredValue; conditional Context; and both trailing Memo assertions. The slotless renderer read and inspection dispatcher read are inlined so the translation adds no custom-hook frame. React 17 StrictMode replay, synchronous act, Promise construction, one-based IDs, and option naming are marked locally.
React 17 handler reconstructionReactDeferredValue.spec.luaTwo local regressions prove a deferred hook in a fallback marks the outer catcher and an avoided inner boundary selects the desirable outer catcher.
Reserved-lane contractReactFiberLane.roblox.spec.luaSix local cases cover matching, unpinged, unrelated-parent, transition-priority, and multiple-deferred selection.
Fizz, hydration, Activity/Offscreen hidden prerendering, and browser popstate testsNo targetOut of scope because React-Luau exposes none of those renderer contracts on this branch.

Behavior-bearing history includes #27500, #27509, #27512, #27888, #28508, #32821, and #34376.

Test-driven regressions

  • Before deferred-task reverse selection, the boundaryless recovery case retained the suspended preview yield before Final.
  • Before canonical Suspense capture selection, the fallback-subtree case stopped after Primary, Loading, and Outer Fallback instead of attempting Primary and Final again.
  • Before canonical avoided-boundary selection, the desirable-boundary case stopped after Loading and Outer Fallback instead of attempting Final.
  • Before the React 17 StrictMode setter adaptation, the #28508 test dispatched into the abandoned mount queue and never produced the pending tree.

Each failing state was reproduced before its corresponding implementation and the assertions were retained.

Verification

Exact candidate:

  • Commit: 015ecda
  • Tree: 6eef706509b8354de08fc0c965a17e5e98192f10
  • One commit on dependency head 9626a5b
  • Archived source snapshot SHA-256: D50B88BE6EB1E7D7BB99F68CE146504027CDF1FDED02CF8E13BA194F8EA5619E

Static checks:

  • StyLua 0.18.1 check: passed on all 13 changed Luau files
  • luau-compile: passed on all 13 changed Luau files
  • Selene 0.28.0: 0 errors, 0 warnings, 0 parse errors
  • git diff --check and privacy/debug-residue audit: passed
  • Independent provenance, deviation, ancestry, attribution, and source-link audit: passed

Hardened single-runtime Studio CLI:

  • Package identity: 1/1
  • ReactDeferredValue: 15/15
  • ReactFiberLane: 53/53
  • ReactHooksInspectionIntegration: 17 passed, 3 pre-existing skipped
  • Focused #28508 regression: 1/1
  • Focused nil-useMemo regression: 1/1
  • Focused fallback-subtree handler regression: 1/1
  • Focused desirable-boundary regression: 1/1

Generated with Codex.

christopher-bussand others added 2 commits August 12, 2026 00:14
Adds startTransition, useTransition, and useDeferredValue with transition lane scheduling, queue entanglement, debug inspection, and upstream-derived coverage.
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Backport React 19.2's initial-value contract, reserved deferred tasks, suspended-preview recovery, and committed Debug Tools inspection.
Co-authored-by: Codex <noreply@openai.com>
@christopher-buss
christopher-bussforce-pushed the backport-react-19-deferred-initial-value branch from 55818df to 015ecdaCompareSeptember 1, 2026 04:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@christopher-buss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Backport useDeferredValue initial values - #33

Draft
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value
Draft

Backport useDeferredValue initial values#33
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value

Conversation

@christopher-buss

@christopher-busschristopher-buss commented Aug 31, 2026

Copy link
Copy Markdown

Summary

Backport React 19.2's optional initialValue argument for useDeferredValue on top of #25.

The first render can commit the supplied preview immediately and then schedule the final value as a distinct deferred task. The port also includes the behavior needed to recover suspended previews, avoid nested deferred waterfalls, and preserve the existing one-argument React 18 contract.

React Debug Tools includes the #28508 correction: inspection logs and returns the committed deferred value so the inspected component follows the committed tree's control flow and every subsequent hook stays aligned.

Dependency and consolidation

Upstream source and test ledger

Pinned stable contract: React v19.2.0.

Upstream source or testReact-Luau targetStatus and deviation
Public hook and dispatcher typeReactHooks.lua; ReactCurrentDispatcher.luaDirect. Luau cannot distinguish an omitted argument from explicit nil.
Hook implementation and seven DEV dispatchersReactFiberHooks.new.luaAdapted to React 17's lane layout. Hidden-tree/Activity prerendering is unavailable and marked at the source site.
Deferred-lane requestReactFiberWorkLoop.new.luaReact 17 has no identity-valued Suspense handler stack. The port reconstructs the exact boundary selected by its canonical throw path using the visibility cursor and shouldCaptureSuspense predicate, including fallback-subtree and unstable_avoidThisFallback semantics.
Deferred lane families and root bookkeepingReactFiberLane.luaReact 17's nine transition bits keep their numeric values. Seven remain update lanes and the two highest form an independently rotating deferred family.
Separate task and entangled render lanesReactFiberLane.luaReact 17 collapses those sets. A constrained reverse selection chooses a pinged deferred task only when its stored entangled parent is also selected and pinged; priority is unchanged.
DidDefer recovery and DidDefer flagReactFiberBeginWork.new.lua; ReactFiberFlags.luaDirect behavior with site-level register-limit and mutually-exclusive flag-reuse deviations. Hydration-only branches are unavailable.
Boundaryless component suspension and HostRoot unwindReactFiberThrow.new.lua; ReactFiberUnwindWork.new.luaAdapted prerequisite for concurrent roots. Interrupted mounted Fibers restore from alternates; new suspended mounts retain hook state.
Concurrent finish and commit readinessReactFiberWorkLoop.new.luaReact 17 folds the modern helpers together and explicitly threads spawnedLane through concurrent and separate sync paths.
Debug Tools implementationReactDebugHooks.luaReturns the committed memoized value. React 19 debugInfo and hookSource schema fields are not available in this React 17 Debug Tools model and are marked at the test site.
Public deferred-value casesReactDeferredValue.spec.luaAll renderer-supported cases remain in upstream order. React 19 sibling-prewarming duplicate logs are omitted because React 17 does not prewarm siblings.
Debug Tools #28508 regressionReactHooksInspectionIntegration.spec.luaPreserves initial, pending, and final rendered output; State; DeferredValue; conditional Context; and both trailing Memo assertions. The slotless renderer read and inspection dispatcher read are inlined so the translation adds no custom-hook frame. React 17 StrictMode replay, synchronous act, Promise construction, one-based IDs, and option naming are marked locally.
React 17 handler reconstructionReactDeferredValue.spec.luaTwo local regressions prove a deferred hook in a fallback marks the outer catcher and an avoided inner boundary selects the desirable outer catcher.
Reserved-lane contractReactFiberLane.roblox.spec.luaSix local cases cover matching, unpinged, unrelated-parent, transition-priority, and multiple-deferred selection.
Fizz, hydration, Activity/Offscreen hidden prerendering, and browser popstate testsNo targetOut of scope because React-Luau exposes none of those renderer contracts on this branch.

Behavior-bearing history includes #27500, #27509, #27512, #27888, #28508, #32821, and #34376.

Test-driven regressions

  • Before deferred-task reverse selection, the boundaryless recovery case retained the suspended preview yield before Final.
  • Before canonical Suspense capture selection, the fallback-subtree case stopped after Primary, Loading, and Outer Fallback instead of attempting Primary and Final again.
  • Before canonical avoided-boundary selection, the desirable-boundary case stopped after Loading and Outer Fallback instead of attempting Final.
  • Before the React 17 StrictMode setter adaptation, the #28508 test dispatched into the abandoned mount queue and never produced the pending tree.

Each failing state was reproduced before its corresponding implementation and the assertions were retained.

Verification

Exact candidate:

  • Commit: 015ecda
  • Tree: 6eef706509b8354de08fc0c965a17e5e98192f10
  • One commit on dependency head 9626a5b
  • Archived source snapshot SHA-256: D50B88BE6EB1E7D7BB99F68CE146504027CDF1FDED02CF8E13BA194F8EA5619E

Static checks:

  • StyLua 0.18.1 check: passed on all 13 changed Luau files
  • luau-compile: passed on all 13 changed Luau files
  • Selene 0.28.0: 0 errors, 0 warnings, 0 parse errors
  • git diff --check and privacy/debug-residue audit: passed
  • Independent provenance, deviation, ancestry, attribution, and source-link audit: passed

Hardened single-runtime Studio CLI:

  • Package identity: 1/1
  • ReactDeferredValue: 15/15
  • ReactFiberLane: 53/53
  • ReactHooksInspectionIntegration: 17 passed, 3 pre-existing skipped
  • Focused #28508 regression: 1/1
  • Focused nil-useMemo regression: 1/1
  • Focused fallback-subtree handler regression: 1/1
  • Focused desirable-boundary regression: 1/1

Generated with Codex.

christopher-bussand others added 2 commits August 12, 2026 00:14
Adds startTransition, useTransition, and useDeferredValue with transition lane scheduling, queue entanglement, debug inspection, and upstream-derived coverage.
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Backport React 19.2's initial-value contract, reserved deferred tasks, suspended-preview recovery, and committed Debug Tools inspection.
Co-authored-by: Codex <noreply@openai.com>
@christopher-buss
christopher-bussforce-pushed the backport-react-19-deferred-initial-value branch from 55818df to 015ecdaCompareSeptember 1, 2026 04:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@christopher-buss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Backport useDeferredValue initial values - #33

Draft
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value
Draft

Backport useDeferredValue initial values#33
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value

Conversation

@christopher-buss

@christopher-busschristopher-buss commented Aug 31, 2026

Copy link
Copy Markdown

Summary

Backport React 19.2's optional initialValue argument for useDeferredValue on top of #25.

The first render can commit the supplied preview immediately and then schedule the final value as a distinct deferred task. The port also includes the behavior needed to recover suspended previews, avoid nested deferred waterfalls, and preserve the existing one-argument React 18 contract.

React Debug Tools includes the #28508 correction: inspection logs and returns the committed deferred value so the inspected component follows the committed tree's control flow and every subsequent hook stays aligned.

Dependency and consolidation

Upstream source and test ledger

Pinned stable contract: React v19.2.0.

Upstream source or testReact-Luau targetStatus and deviation
Public hook and dispatcher typeReactHooks.lua; ReactCurrentDispatcher.luaDirect. Luau cannot distinguish an omitted argument from explicit nil.
Hook implementation and seven DEV dispatchersReactFiberHooks.new.luaAdapted to React 17's lane layout. Hidden-tree/Activity prerendering is unavailable and marked at the source site.
Deferred-lane requestReactFiberWorkLoop.new.luaReact 17 has no identity-valued Suspense handler stack. The port reconstructs the exact boundary selected by its canonical throw path using the visibility cursor and shouldCaptureSuspense predicate, including fallback-subtree and unstable_avoidThisFallback semantics.
Deferred lane families and root bookkeepingReactFiberLane.luaReact 17's nine transition bits keep their numeric values. Seven remain update lanes and the two highest form an independently rotating deferred family.
Separate task and entangled render lanesReactFiberLane.luaReact 17 collapses those sets. A constrained reverse selection chooses a pinged deferred task only when its stored entangled parent is also selected and pinged; priority is unchanged.
DidDefer recovery and DidDefer flagReactFiberBeginWork.new.lua; ReactFiberFlags.luaDirect behavior with site-level register-limit and mutually-exclusive flag-reuse deviations. Hydration-only branches are unavailable.
Boundaryless component suspension and HostRoot unwindReactFiberThrow.new.lua; ReactFiberUnwindWork.new.luaAdapted prerequisite for concurrent roots. Interrupted mounted Fibers restore from alternates; new suspended mounts retain hook state.
Concurrent finish and commit readinessReactFiberWorkLoop.new.luaReact 17 folds the modern helpers together and explicitly threads spawnedLane through concurrent and separate sync paths.
Debug Tools implementationReactDebugHooks.luaReturns the committed memoized value. React 19 debugInfo and hookSource schema fields are not available in this React 17 Debug Tools model and are marked at the test site.
Public deferred-value casesReactDeferredValue.spec.luaAll renderer-supported cases remain in upstream order. React 19 sibling-prewarming duplicate logs are omitted because React 17 does not prewarm siblings.
Debug Tools #28508 regressionReactHooksInspectionIntegration.spec.luaPreserves initial, pending, and final rendered output; State; DeferredValue; conditional Context; and both trailing Memo assertions. The slotless renderer read and inspection dispatcher read are inlined so the translation adds no custom-hook frame. React 17 StrictMode replay, synchronous act, Promise construction, one-based IDs, and option naming are marked locally.
React 17 handler reconstructionReactDeferredValue.spec.luaTwo local regressions prove a deferred hook in a fallback marks the outer catcher and an avoided inner boundary selects the desirable outer catcher.
Reserved-lane contractReactFiberLane.roblox.spec.luaSix local cases cover matching, unpinged, unrelated-parent, transition-priority, and multiple-deferred selection.
Fizz, hydration, Activity/Offscreen hidden prerendering, and browser popstate testsNo targetOut of scope because React-Luau exposes none of those renderer contracts on this branch.

Behavior-bearing history includes #27500, #27509, #27512, #27888, #28508, #32821, and #34376.

Test-driven regressions

  • Before deferred-task reverse selection, the boundaryless recovery case retained the suspended preview yield before Final.
  • Before canonical Suspense capture selection, the fallback-subtree case stopped after Primary, Loading, and Outer Fallback instead of attempting Primary and Final again.
  • Before canonical avoided-boundary selection, the desirable-boundary case stopped after Loading and Outer Fallback instead of attempting Final.
  • Before the React 17 StrictMode setter adaptation, the #28508 test dispatched into the abandoned mount queue and never produced the pending tree.

Each failing state was reproduced before its corresponding implementation and the assertions were retained.

Verification

Exact candidate:

  • Commit: 015ecda
  • Tree: 6eef706509b8354de08fc0c965a17e5e98192f10
  • One commit on dependency head 9626a5b
  • Archived source snapshot SHA-256: D50B88BE6EB1E7D7BB99F68CE146504027CDF1FDED02CF8E13BA194F8EA5619E

Static checks:

  • StyLua 0.18.1 check: passed on all 13 changed Luau files
  • luau-compile: passed on all 13 changed Luau files
  • Selene 0.28.0: 0 errors, 0 warnings, 0 parse errors
  • git diff --check and privacy/debug-residue audit: passed
  • Independent provenance, deviation, ancestry, attribution, and source-link audit: passed

Hardened single-runtime Studio CLI:

  • Package identity: 1/1
  • ReactDeferredValue: 15/15
  • ReactFiberLane: 53/53
  • ReactHooksInspectionIntegration: 17 passed, 3 pre-existing skipped
  • Focused #28508 regression: 1/1
  • Focused nil-useMemo regression: 1/1
  • Focused fallback-subtree handler regression: 1/1
  • Focused desirable-boundary regression: 1/1

Generated with Codex.

christopher-bussand others added 2 commits August 12, 2026 00:14
Adds startTransition, useTransition, and useDeferredValue with transition lane scheduling, queue entanglement, debug inspection, and upstream-derived coverage.
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Backport React 19.2's initial-value contract, reserved deferred tasks, suspended-preview recovery, and committed Debug Tools inspection.
Co-authored-by: Codex <noreply@openai.com>
@christopher-buss
christopher-bussforce-pushed the backport-react-19-deferred-initial-value branch from 55818df to 015ecdaCompareSeptember 1, 2026 04:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@christopher-buss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Backport useDeferredValue initial values - #33

Draft
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value
Draft

Backport useDeferredValue initial values#33
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value

Conversation

@christopher-buss

@christopher-busschristopher-buss commented Aug 31, 2026

Copy link
Copy Markdown

Summary

Backport React 19.2's optional initialValue argument for useDeferredValue on top of #25.

The first render can commit the supplied preview immediately and then schedule the final value as a distinct deferred task. The port also includes the behavior needed to recover suspended previews, avoid nested deferred waterfalls, and preserve the existing one-argument React 18 contract.

React Debug Tools includes the #28508 correction: inspection logs and returns the committed deferred value so the inspected component follows the committed tree's control flow and every subsequent hook stays aligned.

Dependency and consolidation

Upstream source and test ledger

Pinned stable contract: React v19.2.0.

Upstream source or testReact-Luau targetStatus and deviation
Public hook and dispatcher typeReactHooks.lua; ReactCurrentDispatcher.luaDirect. Luau cannot distinguish an omitted argument from explicit nil.
Hook implementation and seven DEV dispatchersReactFiberHooks.new.luaAdapted to React 17's lane layout. Hidden-tree/Activity prerendering is unavailable and marked at the source site.
Deferred-lane requestReactFiberWorkLoop.new.luaReact 17 has no identity-valued Suspense handler stack. The port reconstructs the exact boundary selected by its canonical throw path using the visibility cursor and shouldCaptureSuspense predicate, including fallback-subtree and unstable_avoidThisFallback semantics.
Deferred lane families and root bookkeepingReactFiberLane.luaReact 17's nine transition bits keep their numeric values. Seven remain update lanes and the two highest form an independently rotating deferred family.
Separate task and entangled render lanesReactFiberLane.luaReact 17 collapses those sets. A constrained reverse selection chooses a pinged deferred task only when its stored entangled parent is also selected and pinged; priority is unchanged.
DidDefer recovery and DidDefer flagReactFiberBeginWork.new.lua; ReactFiberFlags.luaDirect behavior with site-level register-limit and mutually-exclusive flag-reuse deviations. Hydration-only branches are unavailable.
Boundaryless component suspension and HostRoot unwindReactFiberThrow.new.lua; ReactFiberUnwindWork.new.luaAdapted prerequisite for concurrent roots. Interrupted mounted Fibers restore from alternates; new suspended mounts retain hook state.
Concurrent finish and commit readinessReactFiberWorkLoop.new.luaReact 17 folds the modern helpers together and explicitly threads spawnedLane through concurrent and separate sync paths.
Debug Tools implementationReactDebugHooks.luaReturns the committed memoized value. React 19 debugInfo and hookSource schema fields are not available in this React 17 Debug Tools model and are marked at the test site.
Public deferred-value casesReactDeferredValue.spec.luaAll renderer-supported cases remain in upstream order. React 19 sibling-prewarming duplicate logs are omitted because React 17 does not prewarm siblings.
Debug Tools #28508 regressionReactHooksInspectionIntegration.spec.luaPreserves initial, pending, and final rendered output; State; DeferredValue; conditional Context; and both trailing Memo assertions. The slotless renderer read and inspection dispatcher read are inlined so the translation adds no custom-hook frame. React 17 StrictMode replay, synchronous act, Promise construction, one-based IDs, and option naming are marked locally.
React 17 handler reconstructionReactDeferredValue.spec.luaTwo local regressions prove a deferred hook in a fallback marks the outer catcher and an avoided inner boundary selects the desirable outer catcher.
Reserved-lane contractReactFiberLane.roblox.spec.luaSix local cases cover matching, unpinged, unrelated-parent, transition-priority, and multiple-deferred selection.
Fizz, hydration, Activity/Offscreen hidden prerendering, and browser popstate testsNo targetOut of scope because React-Luau exposes none of those renderer contracts on this branch.

Behavior-bearing history includes #27500, #27509, #27512, #27888, #28508, #32821, and #34376.

Test-driven regressions

  • Before deferred-task reverse selection, the boundaryless recovery case retained the suspended preview yield before Final.
  • Before canonical Suspense capture selection, the fallback-subtree case stopped after Primary, Loading, and Outer Fallback instead of attempting Primary and Final again.
  • Before canonical avoided-boundary selection, the desirable-boundary case stopped after Loading and Outer Fallback instead of attempting Final.
  • Before the React 17 StrictMode setter adaptation, the #28508 test dispatched into the abandoned mount queue and never produced the pending tree.

Each failing state was reproduced before its corresponding implementation and the assertions were retained.

Verification

Exact candidate:

  • Commit: 015ecda
  • Tree: 6eef706509b8354de08fc0c965a17e5e98192f10
  • One commit on dependency head 9626a5b
  • Archived source snapshot SHA-256: D50B88BE6EB1E7D7BB99F68CE146504027CDF1FDED02CF8E13BA194F8EA5619E

Static checks:

  • StyLua 0.18.1 check: passed on all 13 changed Luau files
  • luau-compile: passed on all 13 changed Luau files
  • Selene 0.28.0: 0 errors, 0 warnings, 0 parse errors
  • git diff --check and privacy/debug-residue audit: passed
  • Independent provenance, deviation, ancestry, attribution, and source-link audit: passed

Hardened single-runtime Studio CLI:

  • Package identity: 1/1
  • ReactDeferredValue: 15/15
  • ReactFiberLane: 53/53
  • ReactHooksInspectionIntegration: 17 passed, 3 pre-existing skipped
  • Focused #28508 regression: 1/1
  • Focused nil-useMemo regression: 1/1
  • Focused fallback-subtree handler regression: 1/1
  • Focused desirable-boundary regression: 1/1

Generated with Codex.

christopher-bussand others added 2 commits August 12, 2026 00:14
Adds startTransition, useTransition, and useDeferredValue with transition lane scheduling, queue entanglement, debug inspection, and upstream-derived coverage.
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Backport React 19.2's initial-value contract, reserved deferred tasks, suspended-preview recovery, and committed Debug Tools inspection.
Co-authored-by: Codex <noreply@openai.com>
@christopher-buss
christopher-bussforce-pushed the backport-react-19-deferred-initial-value branch from 55818df to 015ecdaCompareSeptember 1, 2026 04:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@christopher-buss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Backport useDeferredValue initial values - #33

Draft
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value
Draft

Backport useDeferredValue initial values#33
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value

Conversation

@christopher-buss

@christopher-busschristopher-buss commented Aug 31, 2026

Copy link
Copy Markdown

Summary

Backport React 19.2's optional initialValue argument for useDeferredValue on top of #25.

The first render can commit the supplied preview immediately and then schedule the final value as a distinct deferred task. The port also includes the behavior needed to recover suspended previews, avoid nested deferred waterfalls, and preserve the existing one-argument React 18 contract.

React Debug Tools includes the #28508 correction: inspection logs and returns the committed deferred value so the inspected component follows the committed tree's control flow and every subsequent hook stays aligned.

Dependency and consolidation

Upstream source and test ledger

Pinned stable contract: React v19.2.0.

Upstream source or testReact-Luau targetStatus and deviation
Public hook and dispatcher typeReactHooks.lua; ReactCurrentDispatcher.luaDirect. Luau cannot distinguish an omitted argument from explicit nil.
Hook implementation and seven DEV dispatchersReactFiberHooks.new.luaAdapted to React 17's lane layout. Hidden-tree/Activity prerendering is unavailable and marked at the source site.
Deferred-lane requestReactFiberWorkLoop.new.luaReact 17 has no identity-valued Suspense handler stack. The port reconstructs the exact boundary selected by its canonical throw path using the visibility cursor and shouldCaptureSuspense predicate, including fallback-subtree and unstable_avoidThisFallback semantics.
Deferred lane families and root bookkeepingReactFiberLane.luaReact 17's nine transition bits keep their numeric values. Seven remain update lanes and the two highest form an independently rotating deferred family.
Separate task and entangled render lanesReactFiberLane.luaReact 17 collapses those sets. A constrained reverse selection chooses a pinged deferred task only when its stored entangled parent is also selected and pinged; priority is unchanged.
DidDefer recovery and DidDefer flagReactFiberBeginWork.new.lua; ReactFiberFlags.luaDirect behavior with site-level register-limit and mutually-exclusive flag-reuse deviations. Hydration-only branches are unavailable.
Boundaryless component suspension and HostRoot unwindReactFiberThrow.new.lua; ReactFiberUnwindWork.new.luaAdapted prerequisite for concurrent roots. Interrupted mounted Fibers restore from alternates; new suspended mounts retain hook state.
Concurrent finish and commit readinessReactFiberWorkLoop.new.luaReact 17 folds the modern helpers together and explicitly threads spawnedLane through concurrent and separate sync paths.
Debug Tools implementationReactDebugHooks.luaReturns the committed memoized value. React 19 debugInfo and hookSource schema fields are not available in this React 17 Debug Tools model and are marked at the test site.
Public deferred-value casesReactDeferredValue.spec.luaAll renderer-supported cases remain in upstream order. React 19 sibling-prewarming duplicate logs are omitted because React 17 does not prewarm siblings.
Debug Tools #28508 regressionReactHooksInspectionIntegration.spec.luaPreserves initial, pending, and final rendered output; State; DeferredValue; conditional Context; and both trailing Memo assertions. The slotless renderer read and inspection dispatcher read are inlined so the translation adds no custom-hook frame. React 17 StrictMode replay, synchronous act, Promise construction, one-based IDs, and option naming are marked locally.
React 17 handler reconstructionReactDeferredValue.spec.luaTwo local regressions prove a deferred hook in a fallback marks the outer catcher and an avoided inner boundary selects the desirable outer catcher.
Reserved-lane contractReactFiberLane.roblox.spec.luaSix local cases cover matching, unpinged, unrelated-parent, transition-priority, and multiple-deferred selection.
Fizz, hydration, Activity/Offscreen hidden prerendering, and browser popstate testsNo targetOut of scope because React-Luau exposes none of those renderer contracts on this branch.

Behavior-bearing history includes #27500, #27509, #27512, #27888, #28508, #32821, and #34376.

Test-driven regressions

  • Before deferred-task reverse selection, the boundaryless recovery case retained the suspended preview yield before Final.
  • Before canonical Suspense capture selection, the fallback-subtree case stopped after Primary, Loading, and Outer Fallback instead of attempting Primary and Final again.
  • Before canonical avoided-boundary selection, the desirable-boundary case stopped after Loading and Outer Fallback instead of attempting Final.
  • Before the React 17 StrictMode setter adaptation, the #28508 test dispatched into the abandoned mount queue and never produced the pending tree.

Each failing state was reproduced before its corresponding implementation and the assertions were retained.

Verification

Exact candidate:

  • Commit: 015ecda
  • Tree: 6eef706509b8354de08fc0c965a17e5e98192f10
  • One commit on dependency head 9626a5b
  • Archived source snapshot SHA-256: D50B88BE6EB1E7D7BB99F68CE146504027CDF1FDED02CF8E13BA194F8EA5619E

Static checks:

  • StyLua 0.18.1 check: passed on all 13 changed Luau files
  • luau-compile: passed on all 13 changed Luau files
  • Selene 0.28.0: 0 errors, 0 warnings, 0 parse errors
  • git diff --check and privacy/debug-residue audit: passed
  • Independent provenance, deviation, ancestry, attribution, and source-link audit: passed

Hardened single-runtime Studio CLI:

  • Package identity: 1/1
  • ReactDeferredValue: 15/15
  • ReactFiberLane: 53/53
  • ReactHooksInspectionIntegration: 17 passed, 3 pre-existing skipped
  • Focused #28508 regression: 1/1
  • Focused nil-useMemo regression: 1/1
  • Focused fallback-subtree handler regression: 1/1
  • Focused desirable-boundary regression: 1/1

Generated with Codex.

christopher-bussand others added 2 commits August 12, 2026 00:14
Adds startTransition, useTransition, and useDeferredValue with transition lane scheduling, queue entanglement, debug inspection, and upstream-derived coverage.
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Backport React 19.2's initial-value contract, reserved deferred tasks, suspended-preview recovery, and committed Debug Tools inspection.
Co-authored-by: Codex <noreply@openai.com>
@christopher-buss
christopher-bussforce-pushed the backport-react-19-deferred-initial-value branch from 55818df to 015ecdaCompareSeptember 1, 2026 04:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@christopher-buss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Backport useDeferredValue initial values - #33

Draft
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value
Draft

Backport useDeferredValue initial values#33
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value

Conversation

@christopher-buss

@christopher-busschristopher-buss commented Aug 31, 2026

Copy link
Copy Markdown

Summary

Backport React 19.2's optional initialValue argument for useDeferredValue on top of #25.

The first render can commit the supplied preview immediately and then schedule the final value as a distinct deferred task. The port also includes the behavior needed to recover suspended previews, avoid nested deferred waterfalls, and preserve the existing one-argument React 18 contract.

React Debug Tools includes the #28508 correction: inspection logs and returns the committed deferred value so the inspected component follows the committed tree's control flow and every subsequent hook stays aligned.

Dependency and consolidation

Upstream source and test ledger

Pinned stable contract: React v19.2.0.

Upstream source or testReact-Luau targetStatus and deviation
Public hook and dispatcher typeReactHooks.lua; ReactCurrentDispatcher.luaDirect. Luau cannot distinguish an omitted argument from explicit nil.
Hook implementation and seven DEV dispatchersReactFiberHooks.new.luaAdapted to React 17's lane layout. Hidden-tree/Activity prerendering is unavailable and marked at the source site.
Deferred-lane requestReactFiberWorkLoop.new.luaReact 17 has no identity-valued Suspense handler stack. The port reconstructs the exact boundary selected by its canonical throw path using the visibility cursor and shouldCaptureSuspense predicate, including fallback-subtree and unstable_avoidThisFallback semantics.
Deferred lane families and root bookkeepingReactFiberLane.luaReact 17's nine transition bits keep their numeric values. Seven remain update lanes and the two highest form an independently rotating deferred family.
Separate task and entangled render lanesReactFiberLane.luaReact 17 collapses those sets. A constrained reverse selection chooses a pinged deferred task only when its stored entangled parent is also selected and pinged; priority is unchanged.
DidDefer recovery and DidDefer flagReactFiberBeginWork.new.lua; ReactFiberFlags.luaDirect behavior with site-level register-limit and mutually-exclusive flag-reuse deviations. Hydration-only branches are unavailable.
Boundaryless component suspension and HostRoot unwindReactFiberThrow.new.lua; ReactFiberUnwindWork.new.luaAdapted prerequisite for concurrent roots. Interrupted mounted Fibers restore from alternates; new suspended mounts retain hook state.
Concurrent finish and commit readinessReactFiberWorkLoop.new.luaReact 17 folds the modern helpers together and explicitly threads spawnedLane through concurrent and separate sync paths.
Debug Tools implementationReactDebugHooks.luaReturns the committed memoized value. React 19 debugInfo and hookSource schema fields are not available in this React 17 Debug Tools model and are marked at the test site.
Public deferred-value casesReactDeferredValue.spec.luaAll renderer-supported cases remain in upstream order. React 19 sibling-prewarming duplicate logs are omitted because React 17 does not prewarm siblings.
Debug Tools #28508 regressionReactHooksInspectionIntegration.spec.luaPreserves initial, pending, and final rendered output; State; DeferredValue; conditional Context; and both trailing Memo assertions. The slotless renderer read and inspection dispatcher read are inlined so the translation adds no custom-hook frame. React 17 StrictMode replay, synchronous act, Promise construction, one-based IDs, and option naming are marked locally.
React 17 handler reconstructionReactDeferredValue.spec.luaTwo local regressions prove a deferred hook in a fallback marks the outer catcher and an avoided inner boundary selects the desirable outer catcher.
Reserved-lane contractReactFiberLane.roblox.spec.luaSix local cases cover matching, unpinged, unrelated-parent, transition-priority, and multiple-deferred selection.
Fizz, hydration, Activity/Offscreen hidden prerendering, and browser popstate testsNo targetOut of scope because React-Luau exposes none of those renderer contracts on this branch.

Behavior-bearing history includes #27500, #27509, #27512, #27888, #28508, #32821, and #34376.

Test-driven regressions

  • Before deferred-task reverse selection, the boundaryless recovery case retained the suspended preview yield before Final.
  • Before canonical Suspense capture selection, the fallback-subtree case stopped after Primary, Loading, and Outer Fallback instead of attempting Primary and Final again.
  • Before canonical avoided-boundary selection, the desirable-boundary case stopped after Loading and Outer Fallback instead of attempting Final.
  • Before the React 17 StrictMode setter adaptation, the #28508 test dispatched into the abandoned mount queue and never produced the pending tree.

Each failing state was reproduced before its corresponding implementation and the assertions were retained.

Verification

Exact candidate:

  • Commit: 015ecda
  • Tree: 6eef706509b8354de08fc0c965a17e5e98192f10
  • One commit on dependency head 9626a5b
  • Archived source snapshot SHA-256: D50B88BE6EB1E7D7BB99F68CE146504027CDF1FDED02CF8E13BA194F8EA5619E

Static checks:

  • StyLua 0.18.1 check: passed on all 13 changed Luau files
  • luau-compile: passed on all 13 changed Luau files
  • Selene 0.28.0: 0 errors, 0 warnings, 0 parse errors
  • git diff --check and privacy/debug-residue audit: passed
  • Independent provenance, deviation, ancestry, attribution, and source-link audit: passed

Hardened single-runtime Studio CLI:

  • Package identity: 1/1
  • ReactDeferredValue: 15/15
  • ReactFiberLane: 53/53
  • ReactHooksInspectionIntegration: 17 passed, 3 pre-existing skipped
  • Focused #28508 regression: 1/1
  • Focused nil-useMemo regression: 1/1
  • Focused fallback-subtree handler regression: 1/1
  • Focused desirable-boundary regression: 1/1

Generated with Codex.

christopher-bussand others added 2 commits August 12, 2026 00:14
Adds startTransition, useTransition, and useDeferredValue with transition lane scheduling, queue entanglement, debug inspection, and upstream-derived coverage.
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Backport React 19.2's initial-value contract, reserved deferred tasks, suspended-preview recovery, and committed Debug Tools inspection.
Co-authored-by: Codex <noreply@openai.com>
@christopher-buss
christopher-bussforce-pushed the backport-react-19-deferred-initial-value branch from 55818df to 015ecdaCompareSeptember 1, 2026 04:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@christopher-buss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Backport useDeferredValue initial values - #33

Draft
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value
Draft

Backport useDeferredValue initial values#33
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value

Conversation

@christopher-buss

@christopher-busschristopher-buss commented Aug 31, 2026

Copy link
Copy Markdown

Summary

Backport React 19.2's optional initialValue argument for useDeferredValue on top of #25.

The first render can commit the supplied preview immediately and then schedule the final value as a distinct deferred task. The port also includes the behavior needed to recover suspended previews, avoid nested deferred waterfalls, and preserve the existing one-argument React 18 contract.

React Debug Tools includes the #28508 correction: inspection logs and returns the committed deferred value so the inspected component follows the committed tree's control flow and every subsequent hook stays aligned.

Dependency and consolidation

Upstream source and test ledger

Pinned stable contract: React v19.2.0.

Upstream source or testReact-Luau targetStatus and deviation
Public hook and dispatcher typeReactHooks.lua; ReactCurrentDispatcher.luaDirect. Luau cannot distinguish an omitted argument from explicit nil.
Hook implementation and seven DEV dispatchersReactFiberHooks.new.luaAdapted to React 17's lane layout. Hidden-tree/Activity prerendering is unavailable and marked at the source site.
Deferred-lane requestReactFiberWorkLoop.new.luaReact 17 has no identity-valued Suspense handler stack. The port reconstructs the exact boundary selected by its canonical throw path using the visibility cursor and shouldCaptureSuspense predicate, including fallback-subtree and unstable_avoidThisFallback semantics.
Deferred lane families and root bookkeepingReactFiberLane.luaReact 17's nine transition bits keep their numeric values. Seven remain update lanes and the two highest form an independently rotating deferred family.
Separate task and entangled render lanesReactFiberLane.luaReact 17 collapses those sets. A constrained reverse selection chooses a pinged deferred task only when its stored entangled parent is also selected and pinged; priority is unchanged.
DidDefer recovery and DidDefer flagReactFiberBeginWork.new.lua; ReactFiberFlags.luaDirect behavior with site-level register-limit and mutually-exclusive flag-reuse deviations. Hydration-only branches are unavailable.
Boundaryless component suspension and HostRoot unwindReactFiberThrow.new.lua; ReactFiberUnwindWork.new.luaAdapted prerequisite for concurrent roots. Interrupted mounted Fibers restore from alternates; new suspended mounts retain hook state.
Concurrent finish and commit readinessReactFiberWorkLoop.new.luaReact 17 folds the modern helpers together and explicitly threads spawnedLane through concurrent and separate sync paths.
Debug Tools implementationReactDebugHooks.luaReturns the committed memoized value. React 19 debugInfo and hookSource schema fields are not available in this React 17 Debug Tools model and are marked at the test site.
Public deferred-value casesReactDeferredValue.spec.luaAll renderer-supported cases remain in upstream order. React 19 sibling-prewarming duplicate logs are omitted because React 17 does not prewarm siblings.
Debug Tools #28508 regressionReactHooksInspectionIntegration.spec.luaPreserves initial, pending, and final rendered output; State; DeferredValue; conditional Context; and both trailing Memo assertions. The slotless renderer read and inspection dispatcher read are inlined so the translation adds no custom-hook frame. React 17 StrictMode replay, synchronous act, Promise construction, one-based IDs, and option naming are marked locally.
React 17 handler reconstructionReactDeferredValue.spec.luaTwo local regressions prove a deferred hook in a fallback marks the outer catcher and an avoided inner boundary selects the desirable outer catcher.
Reserved-lane contractReactFiberLane.roblox.spec.luaSix local cases cover matching, unpinged, unrelated-parent, transition-priority, and multiple-deferred selection.
Fizz, hydration, Activity/Offscreen hidden prerendering, and browser popstate testsNo targetOut of scope because React-Luau exposes none of those renderer contracts on this branch.

Behavior-bearing history includes #27500, #27509, #27512, #27888, #28508, #32821, and #34376.

Test-driven regressions

  • Before deferred-task reverse selection, the boundaryless recovery case retained the suspended preview yield before Final.
  • Before canonical Suspense capture selection, the fallback-subtree case stopped after Primary, Loading, and Outer Fallback instead of attempting Primary and Final again.
  • Before canonical avoided-boundary selection, the desirable-boundary case stopped after Loading and Outer Fallback instead of attempting Final.
  • Before the React 17 StrictMode setter adaptation, the #28508 test dispatched into the abandoned mount queue and never produced the pending tree.

Each failing state was reproduced before its corresponding implementation and the assertions were retained.

Verification

Exact candidate:

  • Commit: 015ecda
  • Tree: 6eef706509b8354de08fc0c965a17e5e98192f10
  • One commit on dependency head 9626a5b
  • Archived source snapshot SHA-256: D50B88BE6EB1E7D7BB99F68CE146504027CDF1FDED02CF8E13BA194F8EA5619E

Static checks:

  • StyLua 0.18.1 check: passed on all 13 changed Luau files
  • luau-compile: passed on all 13 changed Luau files
  • Selene 0.28.0: 0 errors, 0 warnings, 0 parse errors
  • git diff --check and privacy/debug-residue audit: passed
  • Independent provenance, deviation, ancestry, attribution, and source-link audit: passed

Hardened single-runtime Studio CLI:

  • Package identity: 1/1
  • ReactDeferredValue: 15/15
  • ReactFiberLane: 53/53
  • ReactHooksInspectionIntegration: 17 passed, 3 pre-existing skipped
  • Focused #28508 regression: 1/1
  • Focused nil-useMemo regression: 1/1
  • Focused fallback-subtree handler regression: 1/1
  • Focused desirable-boundary regression: 1/1

Generated with Codex.

christopher-bussand others added 2 commits August 12, 2026 00:14
Adds startTransition, useTransition, and useDeferredValue with transition lane scheduling, queue entanglement, debug inspection, and upstream-derived coverage.
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Backport React 19.2's initial-value contract, reserved deferred tasks, suspended-preview recovery, and committed Debug Tools inspection.
Co-authored-by: Codex <noreply@openai.com>
@christopher-buss
christopher-bussforce-pushed the backport-react-19-deferred-initial-value branch from 55818df to 015ecdaCompareSeptember 1, 2026 04:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@christopher-buss
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Backport useDeferredValue initial values - #33

Draft
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value
Draft

Backport useDeferredValue initial values#33
christopher-buss wants to merge 3 commits into
Roblox:mainfrom
christopher-buss:backport-react-19-deferred-initial-value

Conversation

@christopher-buss

@christopher-busschristopher-buss commented Aug 31, 2026

Copy link
Copy Markdown

Summary

Backport React 19.2's optional initialValue argument for useDeferredValue on top of #25.

The first render can commit the supplied preview immediately and then schedule the final value as a distinct deferred task. The port also includes the behavior needed to recover suspended previews, avoid nested deferred waterfalls, and preserve the existing one-argument React 18 contract.

React Debug Tools includes the #28508 correction: inspection logs and returns the committed deferred value so the inspected component follows the committed tree's control flow and every subsequent hook stays aligned.

Dependency and consolidation

Upstream source and test ledger

Pinned stable contract: React v19.2.0.

Upstream source or testReact-Luau targetStatus and deviation
Public hook and dispatcher typeReactHooks.lua; ReactCurrentDispatcher.luaDirect. Luau cannot distinguish an omitted argument from explicit nil.
Hook implementation and seven DEV dispatchersReactFiberHooks.new.luaAdapted to React 17's lane layout. Hidden-tree/Activity prerendering is unavailable and marked at the source site.
Deferred-lane requestReactFiberWorkLoop.new.luaReact 17 has no identity-valued Suspense handler stack. The port reconstructs the exact boundary selected by its canonical throw path using the visibility cursor and shouldCaptureSuspense predicate, including fallback-subtree and unstable_avoidThisFallback semantics.
Deferred lane families and root bookkeepingReactFiberLane.luaReact 17's nine transition bits keep their numeric values. Seven remain update lanes and the two highest form an independently rotating deferred family.
Separate task and entangled render lanesReactFiberLane.luaReact 17 collapses those sets. A constrained reverse selection chooses a pinged deferred task only when its stored entangled parent is also selected and pinged; priority is unchanged.
DidDefer recovery and DidDefer flagReactFiberBeginWork.new.lua; ReactFiberFlags.luaDirect behavior with site-level register-limit and mutually-exclusive flag-reuse deviations. Hydration-only branches are unavailable.
Boundaryless component suspension and HostRoot unwindReactFiberThrow.new.lua; ReactFiberUnwindWork.new.luaAdapted prerequisite for concurrent roots. Interrupted mounted Fibers restore from alternates; new suspended mounts retain hook state.
Concurrent finish and commit readinessReactFiberWorkLoop.new.luaReact 17 folds the modern helpers together and explicitly threads spawnedLane through concurrent and separate sync paths.
Debug Tools implementationReactDebugHooks.luaReturns the committed memoized value. React 19 debugInfo and hookSource schema fields are not available in this React 17 Debug Tools model and are marked at the test site.
Public deferred-value casesReactDeferredValue.spec.luaAll renderer-supported cases remain in upstream order. React 19 sibling-prewarming duplicate logs are omitted because React 17 does not prewarm siblings.
Debug Tools #28508 regressionReactHooksInspectionIntegration.spec.luaPreserves initial, pending, and final rendered output; State; DeferredValue; conditional Context; and both trailing Memo assertions. The slotless renderer read and inspection dispatcher read are inlined so the translation adds no custom-hook frame. React 17 StrictMode replay, synchronous act, Promise construction, one-based IDs, and option naming are marked locally.
React 17 handler reconstructionReactDeferredValue.spec.luaTwo local regressions prove a deferred hook in a fallback marks the outer catcher and an avoided inner boundary selects the desirable outer catcher.
Reserved-lane contractReactFiberLane.roblox.spec.luaSix local cases cover matching, unpinged, unrelated-parent, transition-priority, and multiple-deferred selection.
Fizz, hydration, Activity/Offscreen hidden prerendering, and browser popstate testsNo targetOut of scope because React-Luau exposes none of those renderer contracts on this branch.

Behavior-bearing history includes #27500, #27509, #27512, #27888, #28508, #32821, and #34376.

Test-driven regressions

  • Before deferred-task reverse selection, the boundaryless recovery case retained the suspended preview yield before Final.
  • Before canonical Suspense capture selection, the fallback-subtree case stopped after Primary, Loading, and Outer Fallback instead of attempting Primary and Final again.
  • Before canonical avoided-boundary selection, the desirable-boundary case stopped after Loading and Outer Fallback instead of attempting Final.
  • Before the React 17 StrictMode setter adaptation, the #28508 test dispatched into the abandoned mount queue and never produced the pending tree.

Each failing state was reproduced before its corresponding implementation and the assertions were retained.

Verification

Exact candidate:

  • Commit: 015ecda
  • Tree: 6eef706509b8354de08fc0c965a17e5e98192f10
  • One commit on dependency head 9626a5b
  • Archived source snapshot SHA-256: D50B88BE6EB1E7D7BB99F68CE146504027CDF1FDED02CF8E13BA194F8EA5619E

Static checks:

  • StyLua 0.18.1 check: passed on all 13 changed Luau files
  • luau-compile: passed on all 13 changed Luau files
  • Selene 0.28.0: 0 errors, 0 warnings, 0 parse errors
  • git diff --check and privacy/debug-residue audit: passed
  • Independent provenance, deviation, ancestry, attribution, and source-link audit: passed

Hardened single-runtime Studio CLI:

  • Package identity: 1/1
  • ReactDeferredValue: 15/15
  • ReactFiberLane: 53/53
  • ReactHooksInspectionIntegration: 17 passed, 3 pre-existing skipped
  • Focused #28508 regression: 1/1
  • Focused nil-useMemo regression: 1/1
  • Focused fallback-subtree handler regression: 1/1
  • Focused desirable-boundary regression: 1/1

Generated with Codex.

christopher-bussand others added 2 commits August 12, 2026 00:14
Adds startTransition, useTransition, and useDeferredValue with transition lane scheduling, queue entanglement, debug inspection, and upstream-derived coverage.
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Codex <noreply@openai.com>
Backport React 19.2's initial-value contract, reserved deferred tasks, suspended-preview recovery, and committed Debug Tools inspection.
Co-authored-by: Codex <noreply@openai.com>
@christopher-buss
christopher-bussforce-pushed the backport-react-19-deferred-initial-value branch from 55818df to 015ecdaCompareSeptember 1, 2026 04:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@christopher-buss