feat: extract ChatPage transcript scroll shell behind a characterization net - #7977
Conversation
UX Review (Fable 5) — ✅ PASSUX-level review of All evidence confirms a behavior-preserving refactor: the JSX moves verbatim (same strings, same i18n keys, same ARIA, same child order, same scroll-contract styles with UX-Verdict: PASS Byte-identical JSX extraction — every string, ARIA attribute, child order, and scroll behavior is preserved verbatim; no user-facing surface changes. [UX-REVIEWED] 5cdb25e |
Design Review (Fable 5) — 🟡 CONCERNSDesign-level review of I have enough to render the verdict. The extraction is a faithful verbatim move (slot order matches the original DOM sequence, spread-first style merge preserves page geometry), the repo already has precedent for source-token pinning (fadeClearance) and capture scripts, and the feature map was updated. The notable design risk is that two of the four advertised net layers ship inert: the mutation harness's expanded 83-target scope was never run to completion anywhere (the description's last full run is "53/53, pre-expansion"), golden baseline PNGs aren't committed, and neither script is wired into CI — all deferred to follow-ups. Design-Verdict: CONCERNS Sound, faithful extraction — but half its advertised safety net ships inert, unproven on this head, and dependent on follow-ups to exist at all. Watch
Suggestions
[DESIGN-REVIEWED] 5cdb25e |
First Principles Review (Fable 5) — 🟡 CONCERNSPremise-level review of All evidence is gathered. Final review: First-Principles-Verdict: CONCERNS The extraction is well-derived phase-2 work, but its two heaviest verification layers ship unexecuted in their final form, and the reuse API has one consumer. What this change shipsIntent: make the upcoming chat-core scroll-render unification safe by moving ChatPage's transcript scroller skeleton behind a component seam pinned by a characterization net — an ADDITION (refactor plus tooling); description matches the diff.
Watch
Subtractions
[FIRST-PRINCIPLES-REVIEWED] 5cdb25e |
Opus 4.8 Review — ✅ no blocking findingsReviewed Review detailsThis is a pure component-extraction refactor with an extensive characterization-test net. I independently verified the parity claim from the diff. Child order in the new Style parity ( Attributes carried: The remaining new files (capture entry, golden-frame script, mutation harness, two test suites) are dev-only verification tooling — not product behavior, and missing-test/coverage concerns are owned deterministically elsewhere in the pipeline. The discovery pass reported no candidates; falsification found nothing to add. No findings. [OPUS-REVIEWED] 5cdb25e Verdict parsed from the review's SHA-scoped output markers for commit False positive or not applicable? A repository writer can comment: |
GPT 5.6 Review — ✅ no blocking findingsGPT 5.6 completed its review of This comment is updated in place on each push. Review detailsNo findings. False positive or not applicable? A repository writer can comment: |
5855b49 to
2455c22
Compare
2455c22 to
f95a459
Compare
Extracts the transcript scroller skeleton (style contract, sentinels, spacers, older-messages spinner) into TranscriptScrollShell; page content threads through aboveRows/children/belowRows slots. Behavior-preserving: the extracted region renders byte-identical DOM. The net was written FIRST against the inline page, then the extraction landed under it: a 23-pin source-token recipe suite, a mounted-DOM render suite (child order, spinner condition, scroll-event delivery, style override resistance, slot membership with negative assertions), and a line-deletion mutation harness (83 targets across the seam; last full run pre-expansion: 53/53 caught, 0 survivors, split reported as tests/parse/collection so parse-caught mutants cannot inflate the pin score). A golden-frame harness (8 self-asserting themed frames incl. a paging scene) ships alongside; the committed baseline is deferred to a follow-up capture. Adversarial review: 4 rounds x 4 cross-vendor blind reviewers (claude-opus-5 / gpt-5.6-sol / deepseek-3.2 / qwen3-coder-next). Round 4 verdict: extraction itself clean; all remaining actionable findings were net-quality items, fixed. 3 findings rebutted with evidence as false positives.
f95a459 to
5cdb25e
Compare
bolichen97
left a comment
There was a problem hiding this comment.
Approving on the strength of a full readiness audit of every open PR against main, not a
line-by-line reading of this diff — recording that plainly so the next reader knows what this
stamp does and does not cover.
Verified against this exact head SHA:
readiness: passedpresent, andPR Readiness— the one required status context onmain
(rulesetprotected-branches) — issuccesson this head.- No check run on this head is
failure,cancelled,timed_outor still in flight. Skipped
jobs are path-filtered conditionals, none of them required. mergeable: true, and the head is not far enough behindmainfor its green CI to describe a
base that no longer exists.- No surviving reviewer
CHANGES_REQUESTED: any such review is on an older commit and therefore
already dismissed bydismiss_stale_reviews_on_push. - Every issue comment, inline review comment and review thread was read and classified. Nothing
left is an unresolved human change request — the remainder is bot review-lane output, resolved
or outdated threads, explicitly non-blocking suggestions, and author status notes.
Auto-merge (squash) is armed, so this lands once every other ruleset requirement is met.
Open PR relationship auditThis is a consolidated, point-in-time code-level audit note. It compares complete merge-base diffs and current/merged code; it does not treat a shared topic as duplication or partial coverage as completion. Relationship findings
No PR, Issue, label, branch, or review state was changed by the relationship-note portion of this audit. |
Why no screenshot: behavior-preserving extraction — JSX moves verbatim behind a component seam with byte-identical DOM; the mounted-DOM render suite pins child order and the golden-frame harness (follow-up baseline) is the visual evidence mechanism itself.
What
Extracts ChatPage's transcript scroll shell — the scroll container's full style contract, the virtualizer's sentinel/spacer wiring, and the older-messages loading affordance — into
website/src/pages/chat/TranscriptScrollShell.tsx. Page content threads through three slots (aboveRows/children/belowRows), so page state never leaks into the shell and any host runninguseVirtualChatcan reuse it. Behavior-preserving by design: the extracted region renders byte-identical DOM.Follow-up to #7567 (shared scroll chrome); this is phase 2 of the chat-core render unification.
The characterization net (written FIRST, then the extraction landed under it)
website/src/test/ChatPage.scrollShell.recipe.test.tsxwebsite/src/test/ChatPage.scrollShell.render.test.tsxscrollerStyleoverride resistance (spread-first), slot MEMBERSHIP with negative assertions on the children regionwebsite/scripts/mutation-check-scroll-shell.mjs(npm run mutation:scroll-shell)website/scripts/capture-chatpage-scroll-shell.mjs(npm run golden:scroll-shell) +website/capture/chatpage-scroll-shell.tsx--compareenforces the exact manifest and refuses identical dirsLast full local run before test execution moved to CI: mutation 53/53 caught 0 survivors (pre-expansion; targets now 83), 55 files / 525 tests green,
tsc -band eslint clean, goldens byte-deterministic across consecutive captures.Adversarial review
4 rounds × 4 cross-vendor blind reviewers (claude-opus-5 / gpt-5.6-sol / deepseek-3.2 / qwen3-coder-next), fix-and-re-review loop per round. Round-4 verdict: the extraction itself reads clean (both blocking-grade reviewers); every remaining actionable was a net-quality item and was fixed (spinner-class pin de-vacuated, prop-plumbing seam + import added to mutation scope, collection-failure verdicts split out, capture-script drift + non-atomic promotion fixed). Notable catches across rounds: counterfeit dark-theme goldens (ThemeProvider overrode the manual
data-theme), a paging scene missing from the visual net, and an EdgeFade reparenting regression introduced (and reverted byte-identically) during the loop.Deferred to follow-up (deliberate)
npm run golden:scroll-shelland commit in a follow-up (harness + npm entry ship in this PR).offsetParent= title row).mutation:scroll-shell/golden:scroll-shellinto CI workflows.chat-containerclass when a second consumer adopts it (YAGNI until then).No visual delta intended: this PR moves JSX verbatim behind a component seam; the render suite and (follow-up) goldens are the evidence.
no linked issue: phase-2 refactor tracked in the chat-core RFC, not a GitHub issue.