Adopted claims derive their prefix from the wire id, not the call address - #2973
Merged
Merged
Conversation
…ress The identity split (bcbe7e5) rebound adopted frames to the call's address — function id + args hash — but the document producer stamps _hk keys and region fids under the bare wire id. ctx.frame falls back to the frame id when no claimScope is given, so every adopted claim on an args-bearing call derived a ':hash'-suffixed prefix, missed the registry, and re-rendered fresh clones; their inserts then moved the adopted {$frame} region elements (server-rendered interiors) into the discarded detached tree — streamed content flashed on screen and went blank at hydration. Argless calls (address === id) masked the break. claimScope is the runtime's existing seam for exactly this — region frames already thread the root boundary's scope down — so adoptBoundary now passes the wire id through it, alongside the other unpublished FrameOptions in the spread-cast. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
🦋 Changeset detectedLatest commit: 19d75b1 The changes in this PR will be included in the next version bump. This PR includes changesets to release 9 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Merging this PR will not alter performance
Comparing Footnotes
|
ryansolid
added a commit
that referenced
this pull request
Aug 5, 2026
Argless calls (address === id) masked the claim-prefix break, which is why the adopted-slot suites never caught it: this spec seeds an _$SC.a address record so the adopted frame binds a hash-suffixed address while the markup's _hk keys stay under the wire id, and asserts the fill CLAIMS the producer's server-rendered node instead of re-rendering a clone over it. Fails without adoptBoundary's claimScope threading. Co-authored-by: Cursor <cursoragent@cursor.com>
ryansolid
added a commit
that referenced
this pull request
Aug 5, 2026
@solidjs/web's test-types script re-ran `types` before its tsc, and that script begins with `rimraf types/ types-cjs/`. Turbo already orders the types task ahead of test-types (dependsOn) but has no edge between test-types and the EXAMPLES' typecheck tasks, so in CI the rimraf could wipe @solidjs/web/types/** mid-typecheck — the example's tsc then lost the jsx-runtime namespace and every type-only export (frames' Slot), falling through to the built JS. Flaky by scheduling: notes typechecked seconds earlier and passed while hackernews lost the race (#2973's red check). solid-js's test-types is already a pure consumer; now web's is too, and the types work isn't done twice per CI run. Co-authored-by: Cursor <cursoragent@cursor.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The identity split (bcbe7e5) rebound adopted document frames to the call's address (function id + args hash), but the document producer still stamps
_hkhydration keys and region fids under the bare wire id.ctx.framefalls back to the frame's id when noclaimScopeis provided (frame-client.js:claimScope ?? id), so every adopted claim on an args-bearing call derived a:hash-suffixed prefix (sc-…-noteListView:28y-item#0-1vs the stampedsc-…-noteListView-item#0-1), missed the registry, and re-rendered fresh template clones. The clones'insert(props.children)then moved the adopted{$frame}region elements — the server-rendered interiors — out of the live document into the discarded detached tree: streamed content flashed on screen and went blank at hydration, leaving the gutted server markup in place.Argless calls (address === id) masked the break, which is why simple pages kept working.
Fix
claimScopeis the runtime's existing seam for exactly this — nested region frames already thread the root boundary's scope down (claimScope ?? idat both consumption sites).adoptBoundarynow passes the wire id through it, next to the other unpublished FrameOptions in the spread-cast.Repro / verification
examples/notesin dev: sidebar note titles stream in, then blank out at hydration (everyitem#N.children/item#N.expandedChildrenregion frame is reparented into a detached clone and dropped). With this change the items claim the server DOM in place (_hkmarkup retained, region frames intact) and titles persist; navigation and selection behave.Diagnosed by instrumenting
getNextElementto log miss-key vs registry — the:28yargs-hash suffix on every requested key against hash-less registry keys pins the mismatch. The removal itself was invisible to removal-API patches because it's a connected→detachedinsertBefore/appendChildmove byreconcileArrays.🤖 Generated with Claude Code