Skip to content

Revive Pro streaming validation coverage#4035

Merged
justin808 merged 12 commits into
mainfrom
codex/batch5-3886-streaming-validation
Jun 20, 2026
Merged

Revive Pro streaming validation coverage#4035
justin808 merged 12 commits into
mainfrom
codex/batch5-3886-streaming-validation

Conversation

@justin808

@justin808 justin808 commented Jun 15, 2026

Copy link
Copy Markdown
Member

Summary

  • Revive streamBackpressure.e2e against the length-prefixed RSC stream protocol and options-based generateRSCPayload injection.
  • Fix SuspenseHydration resolution under Jest by using the browser server stream entrypoint and local helper import.
  • Add the intended non-RSC streaming validation bucket to the Pro package test script, with React-version gating for minimum-dependency runs.
  • Keep script/convert aligned with the anchored non-RSC ignore pattern so generated minimum-dependency scripts do not accidentally skip or include streaming tests based on the absolute worktree path.

Refs #3886

Validation

  • Baseline before changes: pnpm --filter react-on-rails-pro exec jest tests/streamBackpressure.e2e.test.tsx tests/SuspenseHydration.test.tsx --runInBand failed with length-prefixed parsing / missing options-based payload injection / ./testUtils.js resolution errors.
  • pnpm --filter react-on-rails-pro run test:streaming -> passed, 4 suites / 41 tests.
  • pnpm --filter react-on-rails-pro test -> passed, 24 non-RSC suites / 282 tests, 4 streaming suites / 41 tests, 5 RSC suites / 17 tests.
  • pnpm --filter react-on-rails-pro run type-check -> passed.
  • pnpm --filter react-on-rails-pro run build -> passed.
  • pnpm start format.listDifferent -> passed.
  • pnpm run lint -> passed.
  • (cd react_on_rails && BUNDLE_GEMFILE=../Gemfile bundle exec rubocop) -> passed, 224 files inspected, no offenses.
  • git diff --check -> passed.
  • codex review --uncommitted -> no correctness, security, performance, or maintainability findings.
  • Pre-commit hook -> trailing newlines, Prettier, ESLint, Pro license headers passed.
  • Pre-push hook -> branch lint and markdown links passed.

CI Selection

script/ci-changes-detector origin/main reported:

  • Changed categories: React on Rails Pro JavaScript/TypeScript; CI infrastructure (full test suite, no benchmarks).
  • Recommended jobs: lint, OSS Ruby/JS/integration/generator/E2E coverage, Pro lint/RSpec/dummy/node-renderer coverage, and Pro benchmark jobs listed by the detector.

Labels: full-ci, full-ci-no-benchmarks — this changes Pro package test coverage and generated CI script selection, so broad CI is appropriate; runtime/performance code is untouched, so benchmarks should be suppressed.

Residual Risk

Low. This is test/package-script coverage only. GitHub CI and review are still pending on the pushed branch.


Note

Low Risk
Changes are limited to Pro test files and npm scripts; production streaming/RSC code is not modified in this diff.

Overview
Restores Pro streaming/RSC e2e coverage after the length-prefixed stream protocol and options-based generateRSCPayload injection, without changing runtime rendering code.

Test orchestration: package.json adds a dedicated test:streaming step (React 19–gated, --runInBand) between non-RSC and RSC runs, and tightens test:non-rsc ignores to tests/.*… so paths don’t depend on the worktree. script/convert mirrors that anchored pattern for minimum-dependency CI.

streamBackpressure.e2e: Replaces newline JSON chunk collection with LengthPrefixedStreamParser, frames mock payloads via toLengthPrefixedPayload, injects generateRSCPayload instead of globalThis, and adds parser flush/truncation tests (including preserving outer console.warn spies).

SuspenseHydration: Uses react-dom/server.browser, fixes ./testUtils resolution, hardens streamed-chunk reads with readNextChunk, and renames the suite to SuspenseHydration.

streamServerRenderedReactComponent tests: Focus on single post-SSR hook behavior for bailout/error mixes; duplicate notifySSREnd warnings are only asserted where still relevant (RSCRoute ssr=false bailout).

Reviewed by Cursor Bugbot for commit a5d5f2c. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • Tests
    • Improved streaming/RSC end-to-end test coverage by switching payload parsing to length-prefixed framing and updating related payload sizing checks.
    • Strengthened end-of-stream handling to explicitly fail when a length-prefixed stream is truncated.
    • Refreshed Suspense hydration test setup and consolidated warning assertions to prevent duplicate-warning regressions.
  • Chores
    • Updated Pro test scripts to run non-RSC, streaming, and RSC suites in a clearer order, with refined Jest path-ignoring to better separate runs.

@coderabbitai

coderabbitai Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Test infrastructure updates for react-on-rails-pro: the Jest pipeline splits into three named suites; streaming backpressure tests adopt length-prefixed RSC chunk framing via LengthPrefixedStreamParser; console warning assertions are unified with a shared helper; and two import paths are corrected.

Changes

Test Suite and Streaming Test Updates

Layer / File(s) Summary
Test script pipeline split and ignore pattern fix
packages/react-on-rails-pro/package.json, script/convert
package.json adds a dedicated test:streaming suite and revises test:non-rsc ignore patterns; script/convert scopes the minimum-dependency matrix regex to tests/.*.
Backpressure test: length-prefixed framing and mock wiring
packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx
Imports LengthPrefixedStreamParser, introduces toLengthPrefixedPayload and a new collectChunks using TextDecoder with end-of-stream error handling, replaces globalThis.generateRSCPayload with a scoped Jest mock, and updates all four backpressure test cases to derive payload sizes and HTML assertions from framed chunks.
Shared notifySSREnd warning constant and assertion helper
packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx
Adds DUPLICATE_NOTIFY_SSR_END_WARNING constant and expectNoDuplicateNotifySSREndWarning helper; updates one post-SSR hook test to use the helper for console warning validation; removes warning assertions from two other post-SSR hook tests.
SuspenseHydration import path corrections
packages/react-on-rails-pro/tests/SuspenseHydration.test.tsx
Switches renderToReadableStream to react-dom/server.browser and removes .js extension from ./testUtils import.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • shakacode/react_on_rails#3526: Both PRs focus on the length-prefixed protocol: the main PR updates the streaming e2e test to use LengthPrefixedStreamParser with framed payloads, while the retrieved PR adds byte-accurate multibyte/edge-case coverage for the same kind of LPP parsing in JS and Ruby.
  • shakacode/react_on_rails#3318: Both PRs touch packages/react-on-rails-pro streaming/RSC handling around notifySSREnd() in streamServerRenderedReactComponent.test.jsx, with the main PR refactoring warning assertions and the retrieved PR adding underlying SSR-false bailout logic.
  • shakacode/react_on_rails#3515: The main PR updates streamBackpressure to parse framed/length-prefixed RSC payloads using LengthPrefixedStreamParser, which is the same parser modified in the retrieved PR to tolerate blank separators.

Suggested labels

review-needed, P2

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The PR title directly and clearly describes the main objective: reviving streaming validation coverage in the React on Rails Pro package.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch codex/batch5-3886-streaming-validation

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@greptile-apps

greptile-apps Bot commented Jun 15, 2026

Copy link
Copy Markdown

Greptile Summary

This PR revives streaming test coverage for the Pro package by updating streamBackpressure.e2e.test.tsx to the length-prefixed RSC stream protocol and options-based generateRSCPayload injection, fixing import paths in SuspenseHydration.test.tsx, and adding a React-version-gated test:streaming bucket to package.json. The script/convert generator is also updated to match the anchored tests/.* ignore pattern used in the hand-edited scripts.

  • streamBackpressure.e2e.test.tsx: The old newline-delimited JSON chunk collector is replaced with LengthPrefixedStreamParser; generateRSCPayload is now injected via options rather than globalThis, removing the need for afterEach cleanup; toLengthPrefixedPayload produces correctly-formatted mock RSC payloads; byte-count assertions now account for protocol framing overhead.
  • streamServerRenderedReactComponent.test.jsx: Two tests are renamed and their positive console.warn assertions are relaxed to expectOnlyDuplicateNotifySSREndWarnings, which permits (but does not require) the duplicate-notifySSREnd warning, weakening regression coverage for that specific path.
  • SuspenseHydration.test.tsx: Switches to react-dom/server.browser and removes the .js extension from the testUtils import so the tests resolve correctly under Jest.

Confidence Score: 4/5

Safe to merge; all changes are in test files and package scripts with no modifications to production runtime code.

The two changed test files each have a minor gap: collectChunks silently absorbs parser flush warnings rather than failing the promise, and expectOnlyDuplicateNotifySSREndWarnings neither requires nor forbids the duplicate-notifySSREnd warning — meaning a regression in either area could go undetected. Neither gap affects production behaviour, but they reduce the fidelity of the new test coverage that is the stated purpose of the PR.

packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx (flush handling in collectChunks) and packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx (warning assertion semantics)

Important Files Changed

Filename Overview
packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx Revived backpressure E2E tests to use length-prefixed RSC stream protocol and options-based generateRSCPayload; new toLengthPrefixedPayload helper and LengthPrefixedStreamParser replace the old newline-delimited JSON approach. parser.flush() in collectChunks does not propagate incomplete-stream warnings as test failures.
packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx Two tests renamed from "preserves the duplicate notifySSREnd warning" to "runs post-SSR hooks once"; the positive assertion that the duplicate warning was called is replaced with expectOnlyDuplicateNotifySSREndWarnings, which allows the warning to fire or not fire without failing.
packages/react-on-rails-pro/tests/SuspenseHydration.test.tsx Fixed two import paths: react-dom/server.browser for Jest/jsdom compatibility and ./testUtils (no .js extension) for Node module resolution; no logic changes.
packages/react-on-rails-pro/package.json Added test:streaming bucket (React-version-gated) and anchored the test:non-rsc ignore pattern to tests/.* to avoid false path matches.
script/convert Updated the generated test:non-rsc pattern from ".*(" to "tests/.*(" to keep the generated minimum-dependency scripts in sync with the hand-edited package.json.

Sequence Diagram

sequenceDiagram
    participant Test as E2E Test
    participant Source as source (PassThrough)
    participant SSRC as streamServerRenderedReactComponent
    participant RSCTracker as RSCRequestTracker
    participant RenderFn as RSC Render Function
    participant Injector as injectRSCPayload
    participant Output as Result Stream

    Test->>Source: push(toLengthPrefixedPayload(...))
    Test->>SSRC: "renderComponent(name, {generateRSCPayload})"
    SSRC->>RSCTracker: tee source via generateRSCPayload option
    RSCTracker-->>RenderFn: stream1 (raw RSC bytes)
    RSCTracker-->>Injector: stream2 (RSC bytes for embedding)
    RenderFn->>RenderFn: read all bytes, count totalBytes
    RenderFn-->>SSRC: React element (rsc-content, RSC payload: N bytes)
    SSRC->>Output: renderToPipeableStream → length-prefixed HTML chunks
    Injector->>Output: embed RSC payload scripts (.push(...))
    Test->>Output: collectChunks via LengthPrefixedStreamParser
    Output-->>Test: "StreamResultChunk[] {html, hasErrors, isShellReady}"
Loading

Reviews (1): Last reviewed commit: "Revive Pro streaming validation coverage" | Re-trigger Greptile

Comment thread packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx (1)

63-67: ⚡ Quick win

Use interface for StreamResultChunk instead of a type object shape.

This conflicts with the TypeScript guideline in this repository.

Suggested change
-type StreamResultChunk = {
+interface StreamResultChunk {
   html: string;
   hasErrors: boolean;
   isShellReady: boolean;
-};
+}

As per coding guidelines, **/*.{ts,tsx}: Prefer interface for defining object shapes in TypeScript instead of type keyword.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx` around
lines 63 - 67, The StreamResultChunk definition uses a type keyword instead of
an interface keyword, which conflicts with the repository's TypeScript
guidelines that prefer interface for defining object shapes. Convert the
StreamResultChunk type definition to an interface by replacing the type keyword
with interface and removing the equals sign, keeping the same properties (html,
hasErrors, isShellReady) in the interface body.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx`:
- Around line 168-173: The helper function
expectOnlyDuplicateNotifySSREndWarnings currently only asserts that unexpected
warnings are absent but does not verify that the expected
DUPLICATE_NOTIFY_SSR_END_WARNING is actually present. This allows false passes
when console.warn is never called. Add an additional assertion to verify that at
least one call to the consoleWarnSpy contains the
DUPLICATE_NOTIFY_SSR_END_WARNING message, ensuring the expected warning contract
is properly tested alongside the existing check for unexpected warnings.

---

Nitpick comments:
In `@packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx`:
- Around line 63-67: The StreamResultChunk definition uses a type keyword
instead of an interface keyword, which conflicts with the repository's
TypeScript guidelines that prefer interface for defining object shapes. Convert
the StreamResultChunk type definition to an interface by replacing the type
keyword with interface and removing the equals sign, keeping the same properties
(html, hasErrors, isShellReady) in the interface body.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 6d7cd67b-ec75-49c3-a210-5bd4806581df

📥 Commits

Reviewing files that changed from the base of the PR and between 225738e and 7836dab.

📒 Files selected for processing (5)
  • packages/react-on-rails-pro/package.json
  • packages/react-on-rails-pro/tests/SuspenseHydration.test.tsx
  • packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx
  • packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx
  • script/convert

Comment thread packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx Outdated
@github-actions

github-actions Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

size-limit report 📦

Path Size
react-on-rails/client bundled (gzip) 63.33 KB (+0.01% 🔺)
react-on-rails/client bundled (gzip) (time) 63.33 KB (0%)
react-on-rails/client bundled (brotli) 54.35 KB (0%)
react-on-rails/client bundled (brotli) (time) 54.35 KB (0%)
react-on-rails-pro/client bundled (gzip) 64.27 KB (0%)
react-on-rails-pro/client bundled (gzip) (time) 64.27 KB (0%)
react-on-rails-pro/client bundled (brotli) 55.21 KB (0%)
react-on-rails-pro/client bundled (brotli) (time) 55.21 KB (0%)
registerServerComponent/client bundled (gzip) 74.43 KB (0%)
registerServerComponent/client bundled (gzip) (time) 74.43 KB (0%)
registerServerComponent/client bundled (brotli) 64.04 KB (0%)
registerServerComponent/client bundled (brotli) (time) 64.04 KB (0%)
wrapServerComponentRenderer/client bundled (gzip) 67.23 KB (0%)
wrapServerComponentRenderer/client bundled (gzip) (time) 67.23 KB (0%)
wrapServerComponentRenderer/client bundled (brotli) 57.67 KB (0%)
wrapServerComponentRenderer/client bundled (brotli) (time) 57.67 KB (0%)

@justin808 justin808 force-pushed the codex/batch5-3886-streaming-validation branch from 7836dab to 72c7902 Compare June 15, 2026 05:13
@justin808 justin808 added full-ci full-ci-no-benchmarks Full CI test matrix but hard-suppress all benchmark suites (overrides detection + benchmark label) labels Jun 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx (1)

168-172: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Restore duplicate-warning expectation for unexpected-error paths

The new helper is asserting the opposite contract in these two scenarios. For unexpected nested Suspense errors (and mixed bailout + unexpected error), suppressDuplicateWarning should be false, so tests should assert duplicate notifySSREnd() warning presence (or at least allow it), not enforce its absence.

Suggested minimal patch
-  const expectNoDuplicateNotifySSREndWarning = (consoleWarnSpy) => {
-    expect(consoleWarnSpy).not.toHaveBeenCalledWith(
-      expect.stringContaining(DUPLICATE_NOTIFY_SSR_END_WARNING),
-    );
-  };
+  const expectOnlyDuplicateNotifySSREndWarnings = (consoleWarnSpy) => {
+    const duplicateWarnings = consoleWarnSpy.mock.calls.filter(([message]) =>
+      String(message).includes(DUPLICATE_NOTIFY_SSR_END_WARNING),
+    );
+    const unexpectedWarnings = consoleWarnSpy.mock.calls.filter(
+      ([message]) => !String(message).includes(DUPLICATE_NOTIFY_SSR_END_WARNING),
+    );
+    expect(duplicateWarnings.length).toBeGreaterThan(0);
+    expect(unexpectedWarnings).toHaveLength(0);
+  };
@@
-      expectNoDuplicateNotifySSREndWarning(consoleWarnSpy);
+      expectOnlyDuplicateNotifySSREndWarnings(consoleWarnSpy);
@@
-      expectNoDuplicateNotifySSREndWarning(consoleWarnSpy);
+      expectOnlyDuplicateNotifySSREndWarnings(consoleWarnSpy);

Also applies to: 369-369, 392-392

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx`
around lines 168 - 172, The helper function expectNoDuplicateNotifySSREndWarning
is asserting the wrong contract for error scenarios where
suppressDuplicateWarning is false. For unexpected nested Suspense error paths
and mixed bailout plus unexpected error scenarios, the duplicate notifySSREnd
warning should be present (not absent). At
packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx
line 369 (anchor) and line 392 (sibling), replace calls to
expectNoDuplicateNotifySSREndWarning with an assertion that expects the
duplicate warning to be present (or create a complementary helper like
expectDuplicateNotifySSREndWarning and use it at those locations instead). The
core issue is that these specific test cases should verify the warning exists
when suppressDuplicateWarning is false, not verify its absence.
🧹 Nitpick comments (1)
packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx (1)

64-68: ⚡ Quick win

Use interface for the chunk object shape.

StreamResultChunk is an object shape in a .tsx file, so this should be declared as an interface to match repository standards.

♻️ Suggested change
-type StreamResultChunk = {
+interface StreamResultChunk {
   html: string;
   hasErrors: boolean;
   isShellReady: boolean;
-};
+}

As per coding guidelines, **/*.{ts,tsx}: Prefer interface for defining object shapes in TypeScript instead of type keyword.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx` around
lines 64 - 68, The `StreamResultChunk` declaration is currently using the `type`
keyword to define an object shape, but repository standards require using
`interface` for object shape definitions in TypeScript files. Convert the
`StreamResultChunk` type alias to an interface declaration by replacing `type
StreamResultChunk = { ... };` syntax with `interface StreamResultChunk { ... };`
syntax, removing the equals sign and adjusting the braces accordingly.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In
`@packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx`:
- Around line 168-172: The helper function expectNoDuplicateNotifySSREndWarning
is asserting the wrong contract for error scenarios where
suppressDuplicateWarning is false. For unexpected nested Suspense error paths
and mixed bailout plus unexpected error scenarios, the duplicate notifySSREnd
warning should be present (not absent). At
packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx
line 369 (anchor) and line 392 (sibling), replace calls to
expectNoDuplicateNotifySSREndWarning with an assertion that expects the
duplicate warning to be present (or create a complementary helper like
expectDuplicateNotifySSREndWarning and use it at those locations instead). The
core issue is that these specific test cases should verify the warning exists
when suppressDuplicateWarning is false, not verify its absence.

---

Nitpick comments:
In `@packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx`:
- Around line 64-68: The `StreamResultChunk` declaration is currently using the
`type` keyword to define an object shape, but repository standards require using
`interface` for object shape definitions in TypeScript files. Convert the
`StreamResultChunk` type alias to an interface declaration by replacing `type
StreamResultChunk = { ... };` syntax with `interface StreamResultChunk { ... };`
syntax, removing the equals sign and adjusting the braces accordingly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2e10fbb9-974a-424f-8a83-1eb647d9d7e1

📥 Commits

Reviewing files that changed from the base of the PR and between 7836dab and 72c7902.

📒 Files selected for processing (5)
  • packages/react-on-rails-pro/package.json
  • packages/react-on-rails-pro/tests/SuspenseHydration.test.tsx
  • packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx
  • packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx
  • script/convert
🚧 Files skipped from review as they are similar to previous changes (3)
  • packages/react-on-rails-pro/tests/SuspenseHydration.test.tsx
  • script/convert
  • packages/react-on-rails-pro/package.json

@justin808 justin808 force-pushed the codex/batch5-3886-streaming-validation branch from 72c7902 to c11fd88 Compare June 15, 2026 06:17
@justin808

Copy link
Copy Markdown
Member Author

Post-rebase validation update for current head c11fd88fdfa9fdc0b890b0fd042c21a8cb9df1c0:

CI has restarted for the rebased head.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c11fd88fdf

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx
Comment thread packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx Outdated
@justin808 justin808 force-pushed the codex/batch5-3886-streaming-validation branch from c11fd88 to db99c88 Compare June 15, 2026 06:38

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

Bugbot Autofix is ON. A cloud agent has been kicked off to fix the reported issue.

Reviewed by Cursor Bugbot for commit db99c88. Configure here.

@justin808

Copy link
Copy Markdown
Member Author

Current-head review-fix update for db99c888c6c3c4767e64a8113cf29a80f06fbe65:

  • Resolved the incomplete length-prefixed flush review thread by rejecting the parser's incomplete-stream warning before resolving collected chunks.
  • Resolved the duplicate notifySSREnd() warning thread by keeping the no-duplicate assertion only on the classified RSCRoute ssr=false bailout path and removing it from real unexpected-error paths.
  • pnpm --filter react-on-rails-pro run test:streaming -> pass, 4 suites / 42 tests.
  • pnpm start format.listDifferent -> pass.
  • git diff --check origin/main...HEAD -> pass.

CI restarted again for this head.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx`:
- Line 350: The expectNoDuplicateNotifySSREndWarning assertion is only being
called in one post-SSR test scenario at line 350, but two other post-SSR test
blocks at lines 356-370 and 372-391 also set up consoleWarnSpy without
performing the same assertion check. For consistency and to prevent regression,
add the expectNoDuplicateNotifySSREndWarning(consoleWarnSpy) call to both of the
other post-SSR test blocks, or alternatively remove the consoleWarnSpy setup
from those blocks if the assertion is intentionally not needed there.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ee753c6a-663f-4de3-b776-93283e7b245c

📥 Commits

Reviewing files that changed from the base of the PR and between c11fd88 and db99c88.

📒 Files selected for processing (2)
  • packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx
  • packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx

@justin808 justin808 force-pushed the codex/batch5-3886-streaming-validation branch from db99c88 to b67fccc Compare June 15, 2026 08:10
@justin808

Copy link
Copy Markdown
Member Author

Rebase validation update for head b67fcccea9c5fd638a4ce00e6ba6e3d22776cf5a (base 3b677e9183e0102ee68fe2a16c49e1bc60c5abe7):

Labels remain full-ci, full-ci-no-benchmarks: broad CI is still warranted for Pro package test/CI-selection coverage, and benchmarks remain intentionally suppressed because runtime/performance code is untouched.

GitHub CI and current-head review checks are pending on this rebased head.

@justin808 justin808 force-pushed the codex/batch5-3886-streaming-validation branch from b67fccc to 4231935 Compare June 15, 2026 09:14
@justin808

Copy link
Copy Markdown
Member Author

Rebase validation update for head 42319358405d5814acdfec89a7c33420f59880b3 (base 39d93eb727f183760552f0d78f0921308f6de23a):

  • Rebased codex/batch5-3886-streaming-validation onto current origin/main after the rc.4/version and agent-doc updates landed.
  • pnpm --filter react-on-rails-pro run test:streaming -> passed, 4 suites / 42 tests.
  • script/ci-changes-detector origin/main -> React on Rails Pro JS/TS + CI infrastructure; broad CI selected, benchmark suppression remains intentional via full-ci-no-benchmarks because runtime/performance code is untouched.
  • pnpm start format.listDifferent -> passed.
  • git diff --check origin/main...HEAD -> passed.
  • Pre-push hook -> passed; no branch Ruby or Markdown files to check.

Labels remain full-ci, full-ci-no-benchmarks. GitHub CI and review checks are running on this current head.

@justin808

Copy link
Copy Markdown
Member Author

Strict closeout blocker for current head 42319358405d5814acdfec89a7c33420f59880b3:

  • Current unresolved review threads: 0.
  • Current-head changes-requested objects: none.
  • Priority finding disposition: fixed and recorded for the incomplete length-prefixed output finding.
  • CI: no failed checks. gh pr checks still shows one stale pending detect-changes row for JS unit tests, while the downstream JS unit jobs completed successfully.
  • Strict ledger: script/pr-merge-ledger 4035 --repo shakacode/react_on_rails --finding-dispositions /tmp/pr-4035-finding-dispositions.json --changelog-classification not_user_visible --strict --pretty blocks only on unknown_review_decision / pr.review_decision.

A current-head formal review or maintainer finalizer/waiver is needed before this PR can be called merge-ready under the batch rules. I am not self-approving because the PR author and current authenticated actor are both justin808.

@justin808

Copy link
Copy Markdown
Member Author

CI process update after #4036 merged:

Please rebase or otherwise update this PR onto current main before relying on CI results. #4036 changed the hosted-CI commands, labels, local CI defaults, and required PR gate behavior.

Post-merge audit tracker: #4055

Legacy labels currently present here: full-ci, full-ci-no-benchmarks. Please replace them during the rebase/update pass.

Recommended update path:

  1. Rebase/update onto current main (git fetch origin main && git rebase origin/main, then git push --force-with-lease if you own the branch; otherwise use the GitHub update/rebase path appropriate for the branch owner).
  2. Run bin/ci-local before pushing; it now auto-detects the PR base and runs optimized local CI by default. Use bin/ci-local --all only when broad local coverage is warranted.
  3. Make sure the PR body has a self-contained Why section; issue links are helpful context, but the PR description should stand on its own.
  4. Use +ci-status before requesting hosted CI.
  5. Use +ci-run-hosted for optimized hosted GitHub Actions after the final push.
  6. Use +ci-force-full only when intentionally bypassing optimized selection.

Vocabulary changes:

  • full-ci -> ready-for-hosted-ci only when optimized hosted CI should persist.
  • full-ci-no-benchmarks -> hosted-ci-no-benchmarks when suppressing benchmark labels.
  • force-full intent -> force-full-hosted-ci or +ci-force-full.
  • Legacy commands +ci-run-full, +ci-skip-full, /run-skipped-ci, /run-skipped-tests, and /stop-run-skipped-ci are removed.

@claude

claude Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Code Review — PR #4035: Revive Pro streaming validation coverage

Summary: Test/script-only changes (no production runtime impact). The PR correctly revives streaming test coverage by updating the backpressure E2E test to the length-prefixed protocol, fixing Jest resolution issues in `SuspenseHydration`, and adding a proper `test:streaming` bucket to CI.

What works well

  • Protocol alignment: `streamBackpressure.e2e.test.tsx` now faithfully mirrors the wire format used by `parseLengthPrefixedStream.ts` — `toLengthPrefixedPayload` constructs correctly-framed test data and `collectChunks` parses it with the production `LengthPrefixedStreamParser`.
  • Truncation test: The new "rejects if the rendered result stream ends with an incomplete length-prefixed chunk" test correctly exercises the `flush()` path and converts the `console.warn` signal into a Promise rejection — good coverage of a real failure mode.
  • `globalThis` → options-based injection: Moving `generateRSCPayload` from a global side-channel to a proper options parameter makes the tests more predictable and avoids cross-test contamination.
  • `script/convert` anchor fix: Anchoring the ignore pattern to `tests/.*` is the right fix — the previous unanchored pattern could match worktree-relative paths unexpectedly.
  • `react-dom/server.browser` and extension-less import: Both changes are correct for Jest/jsdom compatibility.

Concerns

1. Missed regression guard in two renamed tests

The two tests renamed from "preserves the duplicate notifySSREnd warning…" to "runs post-SSR hooks once…" remove the old `expect(consoleWarnSpy).toHaveBeenCalledWith('notifySSREnd...')` assertion but do not add `expectNoDuplicateNotifySSREndWarning(consoleWarnSpy)` in its place. The spy is set up but does nothing assertive, so if the behavioral fix regresses and duplicate warnings reappear, neither test would catch it.

// tests/streamServerRenderedReactComponent.test.jsx (lines ~356-370, ~372-392)
// consoleWarnSpy is spied but never asserted — consider adding:
expectNoDuplicateNotifySSREndWarning(consoleWarnSpy);

2. flushParserOrThrow — spurious console output on parse errors

When a `feed()` error causes `reject(error)` inside the `data` handler, the `end` event still fires (the stream ends normally after `push(null)`). `flushParserOrThrow` then calls `parser.flush()` — which may `console.warn` the incomplete-stream message — but at this point there is no active spy, so the warning leaks to the real console. The Promise won't double-settle (already rejected), but the console output could confuse CI logs.

This is low severity for the current test cases since a feed-error terminates content accumulation mid-stream (parser state would be unexpected), but worth noting.

3. `payload.length` assertion now measures framed stream size

// tests/streamBackpressure.e2e.test.tsx  line ~194
const payload = toLengthPrefixedPayload('x'.repeat(1024));
expect(allHtml).toContain(`RSC payload: ${payload.length} bytes`);

`payload.length` is now the full framed buffer size (metadata header + hex length + newline + 1024 content bytes), not 1024. The component counts raw bytes from the RSC stream (which receives the unstripped framed data), so the assertion is numerically correct — but the change in semantics from "content size" to "framed wire size" is subtle enough to warrant a comment, especially since the test description still says "Push a small payload" without clarifying that the byte count includes framing overhead.

4. Truncation test placement

The new "rejects if the rendered result stream ends with…" test sits inside describe('streamServerRenderedReactComponent - RSC payload…') but exercises only collectChunks — it creates its own PassThrough and never calls streamServerRenderedReactComponent. A separate describe('collectChunks') block (or a top-level sibling describe) would make the scope clearer and prevent the test from inheriting the beforeEach setup it doesn't use.

Minor nit

`test:streaming` lists `injectRSCPayload.test.ts` — confirm that test is intentionally included in the streaming bucket (it doesn't appear to deal with streaming directly from the filename). If it belongs in `test:non-rsc`, the ignore pattern already excludes it via the `RSC` keyword match, so it would run in both buckets.

Verdict

The core changes are correct and the PR significantly improves streaming test coverage. The concerns above are non-blocking for merging, with item (1) being the most worth addressing before merge since it leaves a gap in regression detection for the behavioral fix that motivated the test renames.

Comment thread packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx Outdated
Comment thread packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx
Comment thread packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx
@claude

claude Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Code review posted as inline comments. See thread below.

@claude

claude Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Code review test

@claude

claude Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Review Overview

This PR updates streaming test infrastructure to match the length-prefixed wire protocol. Changes are confined to test files and package scripts.

Positives

  • generateRSCPayload moved from globalThis to render option (mirrors production)
  • LengthPrefixedStreamParser used directly in tests
  • expectRSCPayloadPushScript regex avoids false positives
  • readNextChunk helper makes stream-truncation failures explicit
  • flushParserOrThrow spy-preservation is well explained

@claude

claude Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Test heading

body content here

@claude

claude Bot commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Positives:

  • generateRSCPayload moved from globalThis to render option (mirrors production)
  • LengthPrefixedStreamParser used directly in tests
  • expectRSCPayloadPushScript regex avoids false positives
  • readNextChunk helper makes stream-truncation failures explicit
  • flushParserOrThrow spy-preservation is well explained

Issue 1 (actionable): parseLengthPrefixedStream.test.ts orphaned from pnpm test

test:non-rsc ignores paths matching tests/.stream., which catches parseLengthPrefixedStream.test.ts. test:streaming uses an explicit file list that omits it. Pre-existing gap, but explicit-list approach cements it. Fix: add tests/parseLengthPrefixedStream.test.ts to test:streaming.

Issue 2 (actionable): test behavior reversal needs a comment

Two tests in streamServerRenderedReactComponent.test.jsx flip from asserting the duplicate notifySSREnd warning IS emitted to asserting it is NOT. The production source still has suppressDuplicateWarning: sawRSCRouteSSRFalseBailout && !sawUnexpectedRenderError. The tests pass because onAllReady apparently fires only once in these setups, preventing any duplicate. A one-line comment on each test would prevent future confusion.

Issue 3 (minor): double casts in streamBackpressure.e2e.test.tsx (lines 186, 214) bypass the type checker. A targeted Partial<> would be safer.

Issue 4 (nit): writeSecondChunk drains subsequent chunks via raw reader.read() without the readNextChunk guard. Correct due to while (!done), but readNextChunk() throughout would be clearer.

Comment thread packages/react-on-rails-pro/package.json Outdated
Comment thread packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx
Comment thread packages/react-on-rails-pro/tests/SuspenseHydration.test.tsx
Comment thread packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx
Comment thread packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx
Comment thread packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx Outdated
Comment thread packages/react-on-rails-pro/package.json
Comment thread packages/react-on-rails-pro/tests/streamBackpressure.e2e.test.tsx
Comment thread packages/react-on-rails-pro/tests/SuspenseHydration.test.tsx
@claude

claude Bot commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

Code Review

Overall: Solid PR that closes a real coverage gap — streaming tests were passing CI as green only because they weren't wired into any automated run. The approach is correct, the test fixes are well-targeted, and the anchored regex change in script/convert prevents a real class of false matches.

What works well

  • Correct protocol alignment. Replacing newline-delimited JSON parsing with LengthPrefixedStreamParser in collectChunks matches the actual wire format the production code emits. The old tests were essentially testing a protocol the stack no longer speaks.
  • Global → options migration. Removing (globalThis as any).generateRSCPayload and threading generateRSCPayload through render options is strictly better: no teardown needed, no pollution between test suites, no as any escape for a property that shouldn't be global.
  • readNextChunk guard. The old writeFirstChunk silently passed undefined to TextDecoder.decode when the stream ended early; the new helper throws explicitly. Correct fail-fast behavior.
  • expectRSCPayloadPushScript helper. Using a regex (/REACT_ON_RAILS_RSC_PAYLOADS[^<]*\.push\(/) instead of a plain toContain('.push(') prevents the assertion from matching unrelated .push( calls in the rendered HTML. Good tightening.
  • Type improvements. RailsContextWithRSCPayloadStream, StreamResultChunk, and the as unknown as Parameters<typeof ...>[0] casts are all more honest than the previous as any escape hatches.
  • script/convert anchor fix. Prefixing the ignore pattern with tests/ prevents the absolute worktree path from accidentally matching pattern strings — exactly the kind of latent bug that only shows up when running in unusual CI environments.

Questions / concerns

1. The notifySSREnd assertion flip (non-blocker but needs a comment)
Two tests in streamServerRenderedReactComponent.test.jsx previously asserted that a notifySSREnd() called multiple times warning was emitted; they now assert it was not. The PR notes that these tests weren't in any automated run before this PR added test:streaming, so the old assertions were effectively dead. But it's still worth documenting: were the old assertions ever correct? Did a previous commit fix the double-fire, or was the behavior never actually a duplicate-warn in this test environment? A one-line comment in the test body (similar to what was added for the bailout test at line 367) would remove the ambiguity for the next reader.

2. flushParserOrThrow console.warn swap (minor risk)
The pattern of temporarily replacing console.warn, calling parser.flush(), and restoring it works today because flush() is synchronous. But it's fragile: any future async path in flush() would silently let the spy restoration race ahead. A cleaner long-term fix would be to have flush() throw (or return a result) instead of warning, which would reduce this entire helper to a single parser.flush() call. Not a blocker for this PR, but worth a follow-up issue/TODO.

3. Mixing unit and E2E tests in one file (style-only)
The collectChunks - length-prefixed stream parsing describe block tests the helper itself, not the E2E pipeline. parseLengthPrefixedStream.test.ts already exists and would be a more natural home. Fine to leave here for now, but worth relocating if the file grows.

Summary

No correctness or security issues found. The one substantive question (assertion flip on notifySSREnd) needs a clarifying comment but isn't a blocker. Ready to merge after that minor documentation gap is addressed.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7d6e717545

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx Outdated
@cursor

cursor Bot commented Jun 20, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_7de1490e-81e3-46eb-9748-c4b662d738ad)

@justin808

Copy link
Copy Markdown
Member Author

Address-review summary for batch-2026-06-18-c-rsc-pro / PR #4035

Scan scope: full review history (no previous address-review summary found), including current-head review feedback after the latest batch push.

Fixed:

  • Scoped the duplicate SSR-end warning assertion to the classified RSCRoute ssr=false bailout path only; real nested Suspense/render-error paths no longer require exactly-once duplicate-warning behavior. Follow-up commit: a5d5f2c.
  • Earlier batch pass added length-prefixed parser coverage to the streaming validation suite and handled prior optional/status review threads.

Validation:

  • pnpm --filter react-on-rails-pro run test:streaming
  • pnpm --filter react-on-rails-pro exec jest tests/streamServerRenderedReactComponent.test.jsx --runInBand
  • pnpm --filter react-on-rails-pro run type-check
  • pnpm exec prettier --check packages/react-on-rails-pro/tests/streamServerRenderedReactComponent.test.jsx && git diff --check
  • pre-commit and pre-push hooks
  • codex review --uncommitted completed clean for the follow-up diff

Review state: unresolved review threads = 0 after resolving the fixed current-head thread.

Remaining external blockers: hosted checks are still pending (CodeQL ruby, CodeQL javascript-typescript, Cursor Bugbot). No current failing checks observed at refresh time.

@cursor

cursor Bot commented Jun 20, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_b9595136-1a9b-4c13-8fbc-886e158a24c1)

@justin808

Copy link
Copy Markdown
Member Author

Confidence note:

  • Validated: current-head checks are complete with no failing or pending checks; pr-ci-readiness 4035 returned READY; unresolved review threads = 0; branch is mergeable and CLEAN; release tracker Release gate: react_on_rails 17.0.0 #3823 Agent Release Mode block says Mode: development.
  • Evidence: head a5d5f2c7c8ee; address-review summary Revive Pro streaming validation coverage #4035 (comment); current merge-monitor coordination claim held by desktop-codex-5891-merge-pr-4035; no other live workers on this PR in agent-coord status.
  • UNKNOWN: script/pr-merge-ledger --strict still reports GitHub reviewDecision as UNKNOWN because there is no current-head approval review; merge authority is delegated directly by the maintainer in the active Codex thread on 2026-06-20.
  • Residual risk: low; this PR is test/script coverage for Pro streaming validation, with no production runtime change.

@justin808 justin808 merged commit 19a01db into main Jun 20, 2026
4 checks passed
@justin808 justin808 deleted the codex/batch5-3886-streaming-validation branch June 20, 2026 11:06
justin808 added a commit that referenced this pull request Jun 21, 2026
…trap-4138

* origin/main:
  Docs: point Pro license to purchase site (#4160)
  docs: paired ShakaPerf A/B methodology for RSC perf regressions (#4137) (#4142)
  Bound the RSCProvider RSC payload cache with an LRU (#3564) (#4097)
  Harden PR security preflight follow-ups (#4151)
  [codex] Trust ShakaCode team for agent inputs (#4154)
  Default adversarial PR review to current branch (#4155)
  Require hosted CI for generator PRs (#4149)
  Make review-fix push confirmation context-sensitive (#4152)
  Harden PR batch security preflight (#4148)
  Add bidirectional streaming for async props (pull mode) (#4048)
  Fix main generator pretend spec isolation (#4147)
  Revive Pro streaming validation coverage (#4035)
  Fix ci-local detector JSON parsing (#4061)
  ci(pro): add Rspack build leg for execjs-compatible-dummy (#4091) (#4106)
  Add High-Risk Mode to adversarial-pr-review (#4050) (#4115)
  Fix hydration error reporting for thrown values (#4120)
  Add batch cancellation / drain protocol to stop in-flight PR batches (#4119)
  [codex] Document current RSC architecture and version policy (#4103)
  Clarify PR-batch merge authority and ready gates (#4140)

# Conflicts:
#	docs/oss/building-features/performance-tracks-and-profiling.md
#	llms-full.txt
justin808 added a commit that referenced this pull request Jun 21, 2026
…o-agent-guidance

* origin/main: (647 commits)
  Consolidate analysis/ into internal/analysis/ (#4159)
  Docs: point Pro license to purchase site (#4160)
  docs: paired ShakaPerf A/B methodology for RSC perf regressions (#4137) (#4142)
  Bound the RSCProvider RSC payload cache with an LRU (#3564) (#4097)
  Harden PR security preflight follow-ups (#4151)
  [codex] Trust ShakaCode team for agent inputs (#4154)
  Default adversarial PR review to current branch (#4155)
  Require hosted CI for generator PRs (#4149)
  Make review-fix push confirmation context-sensitive (#4152)
  Harden PR batch security preflight (#4148)
  Add bidirectional streaming for async props (pull mode) (#4048)
  Fix main generator pretend spec isolation (#4147)
  Revive Pro streaming validation coverage (#4035)
  Fix ci-local detector JSON parsing (#4061)
  ci(pro): add Rspack build leg for execjs-compatible-dummy (#4091) (#4106)
  Add High-Risk Mode to adversarial-pr-review (#4050) (#4115)
  Fix hydration error reporting for thrown values (#4120)
  Add batch cancellation / drain protocol to stop in-flight PR batches (#4119)
  [codex] Document current RSC architecture and version policy (#4103)
  Clarify PR-batch merge authority and ready gates (#4140)
  ...

# Conflicts:
#	AGENTS_USER_GUIDE.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

hosted-ci-no-benchmarks Suppress benchmark suites for hosted CI/tooling PRs that cannot affect runtime performance ready-for-hosted-ci Run optimized hosted GitHub CI for this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant