Skip to content

test(readline): expand granular Node parity coverage - #6880

Merged
proggeramlug merged 10 commits into
mainfrom
test/expand-node-readline-parity
Jul 30, 2026
Merged

test(readline): expand granular Node parity coverage#6880
proggeramlug merged 10 commits into
mainfrom
test/expand-node-readline-parity

Conversation

@TheHypnoo

@TheHypnoo TheHypnoo commented Jul 27, 2026

Copy link
Copy Markdown
Member

Summary

Expands the granular node:readline parity suite from 12 to 95 fixtures using Node 26.5.0 as the exact oracle. The fixtures cover deterministic public contracts with in-memory streams and fixed input bytes.

Changes

  • Add focused fixtures for exports, interface construction, stream parsing, lifecycle, questions, promises, async iteration, completers, history, keypress parsing, and terminal helpers.
  • Remove the shell child-process fixture and document ownership boundaries for tty, process, events, stream, child_process, and repl.
  • Update the clean Perry readline baseline to 20/95 and make the regression guard reject fixture-count drops.
  • Add pinned Node, Deno, and Bun sources, a reproducible comparison harness, measured gaps, exclusions, and the stopping rule.
  • Initialize async iteration before ending input and remove unrelated capability gates from question fixtures.

Related issue

n/a

Test plan

  • cargo build --release -p perry clean
  • cargo test --workspace --exclude perry-ui-ios --exclude perry-ui-tvos --exclude perry-ui-watchos --exclude perry-ui-gtk4 --exclude perry-ui-android --exclude perry-ui-windows passes
  • Node 26.5.0: 95/95 across three byte-identical runs
  • Perry release: 20 matches and 75 output differences across three warmed runs, with no compile failures, crashes, or timeouts
  • Deno 2.9.3: 91 matches, 2 differences, and 2 errors across three identical runs
  • Bun 1.2.18: 79 matches, 14 differences, and 2 errors across three identical runs
  • Synthetic regression-guard checks cover passing-count and fixture-count drops
  • cargo fmt --all -- --check
  • deno fmt --check test-parity/node-suite/readline scripts/node_suite_regression_check.py test-parity/node_suite_baseline.json
  • python3 -m py_compile scripts/node_suite_regression_check.py
  • python3 -m json.tool test-parity/node_suite_baseline.json
  • git diff --check origin/main...HEAD
  • (if user-facing) Added or updated a test under test-files/ or a #[test] in the affected crate — not applicable; this PR changes parity fixtures only
  • (if CLI / stdlib / runtime API changed) Updated docs/src/ — not applicable; runtime code is unchanged
  • (if touching a platform UI backend) Built -p perry-ui-<backend> locally on that platform — not applicable

Screenshots / output

Node 26.5.0  95 match / 0 difference / 0 error / 0 timeout
Perry         20 match / 75 difference / 0 compile failure / 0 crash / 0 timeout
Deno 2.9.3    91 match / 2 difference / 2 error / 0 timeout
Bun 1.2.18    79 match / 14 difference / 2 error / 0 timeout

Perry PR #6858 remains open and absent from main. This fixture-only change neither depends on nor copies its implementation fix.

Checklist

  • I have NOT bumped the workspace version or edited CLAUDE.md / CHANGELOG.md (maintainer handles these at merge)
  • My commits follow the loose feat: / fix: / docs: / chore: prefix convention used in the log
  • I've read CONTRIBUTING.md and agree to the Code of Conduct

Summary by CodeRabbit

  • New Features

    • Expanded readline compatibility coverage across async iteration, completion, history, prompts, streams, keypresses, lifecycle behavior, validation, and promises APIs.
    • Added reproducible parity documentation and comparison guidance, with measured coverage results.
  • Bug Fixes

    • Improved test cleanup and stream lifecycle handling to reduce resource leakage during checks.
  • Documentation

    • Added release notes documenting expanded Node.js 26.5 compatibility coverage and known runtime differences.

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown

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

Walkthrough

Expands Node.js v26.5.0 readline parity coverage with 95 fixtures spanning interfaces, streams, lifecycle, questions, promises, async iteration, completion, history, terminal helpers, and keypress parsing. It also documents cross-runtime results and raises regression thresholds.

Changes

Readline parity suite

Layer / File(s) Summary
Oracle documentation and baseline
test-parity/node-suite/readline/README.md, test-parity/node_suite_baseline.json, changelog.d/6880-readline-parity-expansion.md
Documents pinned runtime sources, measured parity results, reproduction commands, suite boundaries, and updates readline floors to 20 passing and 95 total fixtures.
Module surface and interface validation
test-parity/node-suite/readline/exports/*, test-parity/node-suite/readline/create-interface/*, test-parity/node-suite/readline/validation/*
Adds checks for exports, constructors, symbols, aliases, interface options, overloads, terminal inference, defaults, and invalid values.
Stream parsing and interface lifecycle
test-parity/node-suite/readline/streams/*, test-parity/node-suite/readline/lifecycle/*, test-parity/node-suite/readline/interface/stream-line-close-events.ts
Covers line separators, CRLF boundaries, UTF-8 handling, input errors, reopening, cursor state, prompts, pause/resume, writes, close behavior, and teardown.
Question and promises flows
test-parity/node-suite/readline/question/*, test-parity/node-suite/readline/promises/*
Adds callback and promise question cases for answers, concurrency, aborts, post-close behavior, prompts, command queues, commits, rollbacks, and commit errors.
Async iteration, completion, and history
test-parity/node-suite/readline/async-iterator/*, test-parity/node-suite/readline/completer/*, test-parity/node-suite/readline/history/*
Adds async-iterator lifecycle and error cases, classic and promises completer behavior, and history ordering, sizing, mutation, and duplicate-removal fixtures.
Terminal helpers and keypress parsing
test-parity/node-suite/readline/helpers/*, test-parity/node-suite/readline/keypress/*
Adds cursor and screen helper behavior, overload and validation cases, CSI parsing, modifiers, listener reactivation, and explicit stream cleanup.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • PerryTS/perry#6698: Updates the same node-suite baseline configuration used for parity regression thresholds.

Suggested labels: parity

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main change: expanding granular Node readline parity coverage.
Description check ✅ Passed The description follows the template well, covering summary, changes, related issue, test plan, output, and checklist.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch test/expand-node-readline-parity

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.

@coderabbitai coderabbitai 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.

Actionable comments posted: 6

🧹 Nitpick comments (1)
test-parity/node-suite/readline/promises/question-after-close.ts (1)

7-12: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

Do not gate question behavior on the unrelated rl.on API.

Both fixtures can emit missing without exercising the question contract, reducing the granularity of the parity results. Keep listener registration conditional where needed, but always execute the targeted question flow.

  • test-parity/node-suite/readline/promises/question-after-close.ts#L7-L12: Remove the outer rl.on guard and always await/catch rl.question() after close.
  • test-parity/node-suite/readline/promises/question-abort-recovery.ts#L13-L25: Make only the 'line' listener conditional; always create, abort, and await the pending question.
🤖 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 `@test-parity/node-suite/readline/promises/question-after-close.ts` around
lines 7 - 12, Remove the outer rl.on guard in
test-parity/node-suite/readline/promises/question-after-close.ts lines 7-12 and
always await/catch rl.question() after closing. In
test-parity/node-suite/readline/promises/question-abort-recovery.ts lines 13-25,
condition only 'line' listener registration while always creating, aborting, and
awaiting the pending question.
🤖 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 `@test-parity/node_suite_baseline.json`:
- Around line 141-142: Update scripts/node_suite_regression_check.py to validate
the fixture-count floor as well as the passing-count floor: reject current
results when cur["total"] is below floor["total"], using the existing regression
failure path and preserving the current pass-count check.

In `@test-parity/node-suite/readline/async-iterator/values.ts`:
- Around line 6-9: In the async-iteration block guarded by
rl[Symbol.asyncIterator], create or obtain the readline async iterator before
calling input.end("\nalpha\nlast"). Then consume that initialized iterator in
the existing for-await loop, preserving the current line collection behavior.

In `@test-parity/node-suite/readline/completer/classic-callback.ts`:
- Line 26: Replace the completion input from input tab to In tab in the readline
completer fixtures so case-sensitive matching produces the expected Input
completion. Apply this change in
test-parity/node-suite/readline/completer/classic-callback.ts:26,
classic-sync.ts:22, promises-async.ts:22, and promises-sync.ts:22.

In `@test-parity/node-suite/readline/completer/classic-error.ts`:
- Line 22: Update the output assertions in
test-parity/node-suite/readline/completer/classic-error.ts:22-22 and
test-parity/node-suite/readline/completer/promises-error.ts:22-22 to use
includes instead of startsWith, so they match the leading newline before the
completion-error message.

In `@test-parity/node-suite/readline/lifecycle/pause-resume-order.ts`:
- Around line 11-12: Update the pause/resume checks in the readline lifecycle
fixture to call each method once, store its return value, and log only whether
it is identical to rl. Preserve the existing identity validation while
preventing the full readline interface object from appearing in oracle output.

In `@test-parity/node-suite/readline/question/abort-recovery.ts`:
- Around line 13-15: Move the rl.on("line", ...) registration into the typeof
(rl as any).on === "function" guard before invoking rl.question. Keep the
missing-capability fallback reachable when rl.on is unavailable, and preserve
the existing event collection behavior when it is supported.

---

Nitpick comments:
In `@test-parity/node-suite/readline/promises/question-after-close.ts`:
- Around line 7-12: Remove the outer rl.on guard in
test-parity/node-suite/readline/promises/question-after-close.ts lines 7-12 and
always await/catch rl.question() after closing. In
test-parity/node-suite/readline/promises/question-abort-recovery.ts lines 13-25,
condition only 'line' listener registration while always creating, aborting, and
awaiting the pending question.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 70c41071-5759-4fe4-b1ae-98aca093e4aa

📥 Commits

Reviewing files that changed from the base of the PR and between c3dc207 and 14e5c1d.

📒 Files selected for processing (100)
  • test-parity/node-suite/readline/README.md
  • test-parity/node-suite/readline/async-iterator/break-closes.ts
  • test-parity/node-suite/readline/async-iterator/done.ts
  • test-parity/node-suite/readline/async-iterator/input-error.ts
  • test-parity/node-suite/readline/async-iterator/nested.ts
  • test-parity/node-suite/readline/async-iterator/values.ts
  • test-parity/node-suite/readline/completer/classic-callback.ts
  • test-parity/node-suite/readline/completer/classic-error.ts
  • test-parity/node-suite/readline/completer/classic-sync.ts
  • test-parity/node-suite/readline/completer/promises-async.ts
  • test-parity/node-suite/readline/completer/promises-error.ts
  • test-parity/node-suite/readline/completer/promises-sync.ts
  • test-parity/node-suite/readline/completer/undefined-columns.ts
  • test-parity/node-suite/readline/create-interface/crlf-delay.ts
  • test-parity/node-suite/readline/create-interface/defaults.ts
  • test-parity/node-suite/readline/create-interface/positional-overload.ts
  • test-parity/node-suite/readline/create-interface/pre-aborted-signal.ts
  • test-parity/node-suite/readline/create-interface/terminal-inference.ts
  • test-parity/node-suite/readline/exports/classic-surface.ts
  • test-parity/node-suite/readline/exports/interface-callable.ts
  • test-parity/node-suite/readline/exports/interface-class-name.ts
  • test-parity/node-suite/readline/exports/interface-constructor-descriptor.ts
  • test-parity/node-suite/readline/exports/interface-instance-constructor.ts
  • test-parity/node-suite/readline/exports/interface-legacy-aliases.ts
  • test-parity/node-suite/readline/exports/interface-prototype-identity.ts
  • test-parity/node-suite/readline/exports/interface-symbols.ts
  • test-parity/node-suite/readline/exports/promises-alias.ts
  • test-parity/node-suite/readline/exports/promises-surface.ts
  • test-parity/node-suite/readline/helpers/clear-line-callback-validation.ts
  • test-parity/node-suite/readline/helpers/clear-line-directions.ts
  • test-parity/node-suite/readline/helpers/clear-line-null-output.ts
  • test-parity/node-suite/readline/helpers/clear-screen-callback-validation.ts
  • test-parity/node-suite/readline/helpers/clear-screen-down.ts
  • test-parity/node-suite/readline/helpers/clear-screen-null-output.ts
  • test-parity/node-suite/readline/helpers/cursor-to-null-output.ts
  • test-parity/node-suite/readline/helpers/cursor-to-overloads.ts
  • test-parity/node-suite/readline/helpers/cursor-to-validation.ts
  • test-parity/node-suite/readline/helpers/emit-keypress-events.ts
  • test-parity/node-suite/readline/helpers/move-cursor-callback-validation.ts
  • test-parity/node-suite/readline/helpers/move-cursor-directions.ts
  • test-parity/node-suite/readline/helpers/move-cursor-null-output.ts
  • test-parity/node-suite/readline/helpers/terminal-helpers.ts
  • test-parity/node-suite/readline/history/event-newest-first.ts
  • test-parity/node-suite/readline/history/history-size.ts
  • test-parity/node-suite/readline/history/listener-mutation.ts
  • test-parity/node-suite/readline/history/remove-duplicates.ts
  • test-parity/node-suite/readline/interface/child-stdout-async-iteration.ts
  • test-parity/node-suite/readline/interface/control-methods.ts
  • test-parity/node-suite/readline/interface/stream-line-close-events.ts
  • test-parity/node-suite/readline/interface/stream-question-output.ts
  • test-parity/node-suite/readline/keypress/csi-chunk-boundary.ts
  • test-parity/node-suite/readline/keypress/fixed-csi.ts
  • test-parity/node-suite/readline/keypress/fixed-modifiers.ts
  • test-parity/node-suite/readline/keypress/listener-reactivation.ts
  • test-parity/node-suite/readline/lifecycle/close-idempotent.ts
  • test-parity/node-suite/readline/lifecycle/cursor-position-width.ts
  • test-parity/node-suite/readline/lifecycle/cursor-position.ts
  • test-parity/node-suite/readline/lifecycle/pause-resume-after-close.ts
  • test-parity/node-suite/readline/lifecycle/pause-resume-order.ts
  • test-parity/node-suite/readline/lifecycle/prompt-output.ts
  • test-parity/node-suite/readline/lifecycle/recursive-write.ts
  • test-parity/node-suite/readline/lifecycle/write-after-close.ts
  • test-parity/node-suite/readline/lifecycle/write-undefined.ts
  • test-parity/node-suite/readline/lifecycle/write-while-paused.ts
  • test-parity/node-suite/readline/promises/get-builtin-module.ts
  • test-parity/node-suite/readline/promises/question-abort-cause.ts
  • test-parity/node-suite/readline/promises/question-abort-recovery.ts
  • test-parity/node-suite/readline/promises/question-abort.ts
  • test-parity/node-suite/readline/promises/question-after-close.ts
  • test-parity/node-suite/readline/promises/question-resolution.ts
  • test-parity/node-suite/readline/promises/readline-action-validation.ts
  • test-parity/node-suite/readline/promises/readline-actions.ts
  • test-parity/node-suite/readline/promises/readline-auto-commit.ts
  • test-parity/node-suite/readline/promises/readline-commit-error.ts
  • test-parity/node-suite/readline/promises/readline-commit-queue.ts
  • test-parity/node-suite/readline/promises/readline-constructor-validation.ts
  • test-parity/node-suite/readline/promises/readline-rollback.ts
  • test-parity/node-suite/readline/question/abort-recovery.ts
  • test-parity/node-suite/readline/question/after-close.ts
  • test-parity/node-suite/readline/question/callback-answer.ts
  • test-parity/node-suite/readline/question/callback-receiver.ts
  • test-parity/node-suite/readline/question/concurrent.ts
  • test-parity/node-suite/readline/question/pre-aborted.ts
  • test-parity/node-suite/readline/question/prompt-output.ts
  • test-parity/node-suite/readline/streams/carriage-return.ts
  • test-parity/node-suite/readline/streams/crlf-chunk-boundary.ts
  • test-parity/node-suite/readline/streams/empty-lines.ts
  • test-parity/node-suite/readline/streams/input-error-event.ts
  • test-parity/node-suite/readline/streams/reopen-utf8-boundary.ts
  • test-parity/node-suite/readline/streams/trailing-newline.ts
  • test-parity/node-suite/readline/streams/unicode-separators.ts
  • test-parity/node-suite/readline/streams/unterminated-final-line.ts
  • test-parity/node-suite/readline/streams/utf8-chunks.ts
  • test-parity/node-suite/readline/validation/completer.ts
  • test-parity/node-suite/readline/validation/escape-code-timeout.ts
  • test-parity/node-suite/readline/validation/history-size.ts
  • test-parity/node-suite/readline/validation/history.ts
  • test-parity/node-suite/readline/validation/signal.ts
  • test-parity/node-suite/readline/validation/tab-size.ts
  • test-parity/node_suite_baseline.json
💤 Files with no reviewable changes (5)
  • test-parity/node-suite/readline/promises/readline-actions.ts
  • test-parity/node-suite/readline/interface/stream-question-output.ts
  • test-parity/node-suite/readline/interface/control-methods.ts
  • test-parity/node-suite/readline/interface/child-stdout-async-iteration.ts
  • test-parity/node-suite/readline/helpers/terminal-helpers.ts

Comment thread test-parity/node_suite_baseline.json Outdated
Comment thread test-parity/node-suite/readline/async-iterator/values.ts Outdated
Comment thread test-parity/node-suite/readline/completer/classic-callback.ts
Comment thread test-parity/node-suite/readline/completer/classic-error.ts
Comment thread test-parity/node-suite/readline/lifecycle/pause-resume-order.ts Outdated
Comment thread test-parity/node-suite/readline/question/abort-recovery.ts Outdated
@TheHypnoo
TheHypnoo force-pushed the test/expand-node-readline-parity branch from 14e5c1d to 2a08e6a Compare July 27, 2026 08:01

@coderabbitai coderabbitai 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.

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 `@scripts/node_suite_regression_check.py`:
- Around line 75-79: Update the improvement-reporting logic near the regression
check so fixture-count increases are added to improvements, not only pass-count
increases. Treat a module as an improvement when either cur["pass"] exceeds
floor["pass"] or cur["total"] exceeds floor["total"], and include both pass and
fixture deltas in the reported ratchet candidate while preserving regression
handling.
🪄 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: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: fcb1c948-2421-4244-be7e-1e14d410899a

📥 Commits

Reviewing files that changed from the base of the PR and between 14e5c1d and 2a08e6a.

📒 Files selected for processing (101)
  • scripts/node_suite_regression_check.py
  • test-parity/node-suite/readline/README.md
  • test-parity/node-suite/readline/async-iterator/break-closes.ts
  • test-parity/node-suite/readline/async-iterator/done.ts
  • test-parity/node-suite/readline/async-iterator/input-error.ts
  • test-parity/node-suite/readline/async-iterator/nested.ts
  • test-parity/node-suite/readline/async-iterator/values.ts
  • test-parity/node-suite/readline/completer/classic-callback.ts
  • test-parity/node-suite/readline/completer/classic-error.ts
  • test-parity/node-suite/readline/completer/classic-sync.ts
  • test-parity/node-suite/readline/completer/promises-async.ts
  • test-parity/node-suite/readline/completer/promises-error.ts
  • test-parity/node-suite/readline/completer/promises-sync.ts
  • test-parity/node-suite/readline/completer/undefined-columns.ts
  • test-parity/node-suite/readline/create-interface/crlf-delay.ts
  • test-parity/node-suite/readline/create-interface/defaults.ts
  • test-parity/node-suite/readline/create-interface/positional-overload.ts
  • test-parity/node-suite/readline/create-interface/pre-aborted-signal.ts
  • test-parity/node-suite/readline/create-interface/terminal-inference.ts
  • test-parity/node-suite/readline/exports/classic-surface.ts
  • test-parity/node-suite/readline/exports/interface-callable.ts
  • test-parity/node-suite/readline/exports/interface-class-name.ts
  • test-parity/node-suite/readline/exports/interface-constructor-descriptor.ts
  • test-parity/node-suite/readline/exports/interface-instance-constructor.ts
  • test-parity/node-suite/readline/exports/interface-legacy-aliases.ts
  • test-parity/node-suite/readline/exports/interface-prototype-identity.ts
  • test-parity/node-suite/readline/exports/interface-symbols.ts
  • test-parity/node-suite/readline/exports/promises-alias.ts
  • test-parity/node-suite/readline/exports/promises-surface.ts
  • test-parity/node-suite/readline/helpers/clear-line-callback-validation.ts
  • test-parity/node-suite/readline/helpers/clear-line-directions.ts
  • test-parity/node-suite/readline/helpers/clear-line-null-output.ts
  • test-parity/node-suite/readline/helpers/clear-screen-callback-validation.ts
  • test-parity/node-suite/readline/helpers/clear-screen-down.ts
  • test-parity/node-suite/readline/helpers/clear-screen-null-output.ts
  • test-parity/node-suite/readline/helpers/cursor-to-null-output.ts
  • test-parity/node-suite/readline/helpers/cursor-to-overloads.ts
  • test-parity/node-suite/readline/helpers/cursor-to-validation.ts
  • test-parity/node-suite/readline/helpers/emit-keypress-events.ts
  • test-parity/node-suite/readline/helpers/move-cursor-callback-validation.ts
  • test-parity/node-suite/readline/helpers/move-cursor-directions.ts
  • test-parity/node-suite/readline/helpers/move-cursor-null-output.ts
  • test-parity/node-suite/readline/helpers/terminal-helpers.ts
  • test-parity/node-suite/readline/history/event-newest-first.ts
  • test-parity/node-suite/readline/history/history-size.ts
  • test-parity/node-suite/readline/history/listener-mutation.ts
  • test-parity/node-suite/readline/history/remove-duplicates.ts
  • test-parity/node-suite/readline/interface/child-stdout-async-iteration.ts
  • test-parity/node-suite/readline/interface/control-methods.ts
  • test-parity/node-suite/readline/interface/stream-line-close-events.ts
  • test-parity/node-suite/readline/interface/stream-question-output.ts
  • test-parity/node-suite/readline/keypress/csi-chunk-boundary.ts
  • test-parity/node-suite/readline/keypress/fixed-csi.ts
  • test-parity/node-suite/readline/keypress/fixed-modifiers.ts
  • test-parity/node-suite/readline/keypress/listener-reactivation.ts
  • test-parity/node-suite/readline/lifecycle/close-idempotent.ts
  • test-parity/node-suite/readline/lifecycle/cursor-position-width.ts
  • test-parity/node-suite/readline/lifecycle/cursor-position.ts
  • test-parity/node-suite/readline/lifecycle/pause-resume-after-close.ts
  • test-parity/node-suite/readline/lifecycle/pause-resume-order.ts
  • test-parity/node-suite/readline/lifecycle/prompt-output.ts
  • test-parity/node-suite/readline/lifecycle/recursive-write.ts
  • test-parity/node-suite/readline/lifecycle/write-after-close.ts
  • test-parity/node-suite/readline/lifecycle/write-undefined.ts
  • test-parity/node-suite/readline/lifecycle/write-while-paused.ts
  • test-parity/node-suite/readline/promises/get-builtin-module.ts
  • test-parity/node-suite/readline/promises/question-abort-cause.ts
  • test-parity/node-suite/readline/promises/question-abort-recovery.ts
  • test-parity/node-suite/readline/promises/question-abort.ts
  • test-parity/node-suite/readline/promises/question-after-close.ts
  • test-parity/node-suite/readline/promises/question-resolution.ts
  • test-parity/node-suite/readline/promises/readline-action-validation.ts
  • test-parity/node-suite/readline/promises/readline-actions.ts
  • test-parity/node-suite/readline/promises/readline-auto-commit.ts
  • test-parity/node-suite/readline/promises/readline-commit-error.ts
  • test-parity/node-suite/readline/promises/readline-commit-queue.ts
  • test-parity/node-suite/readline/promises/readline-constructor-validation.ts
  • test-parity/node-suite/readline/promises/readline-rollback.ts
  • test-parity/node-suite/readline/question/abort-recovery.ts
  • test-parity/node-suite/readline/question/after-close.ts
  • test-parity/node-suite/readline/question/callback-answer.ts
  • test-parity/node-suite/readline/question/callback-receiver.ts
  • test-parity/node-suite/readline/question/concurrent.ts
  • test-parity/node-suite/readline/question/pre-aborted.ts
  • test-parity/node-suite/readline/question/prompt-output.ts
  • test-parity/node-suite/readline/streams/carriage-return.ts
  • test-parity/node-suite/readline/streams/crlf-chunk-boundary.ts
  • test-parity/node-suite/readline/streams/empty-lines.ts
  • test-parity/node-suite/readline/streams/input-error-event.ts
  • test-parity/node-suite/readline/streams/reopen-utf8-boundary.ts
  • test-parity/node-suite/readline/streams/trailing-newline.ts
  • test-parity/node-suite/readline/streams/unicode-separators.ts
  • test-parity/node-suite/readline/streams/unterminated-final-line.ts
  • test-parity/node-suite/readline/streams/utf8-chunks.ts
  • test-parity/node-suite/readline/validation/completer.ts
  • test-parity/node-suite/readline/validation/escape-code-timeout.ts
  • test-parity/node-suite/readline/validation/history-size.ts
  • test-parity/node-suite/readline/validation/history.ts
  • test-parity/node-suite/readline/validation/signal.ts
  • test-parity/node-suite/readline/validation/tab-size.ts
  • test-parity/node_suite_baseline.json
💤 Files with no reviewable changes (5)
  • test-parity/node-suite/readline/interface/control-methods.ts
  • test-parity/node-suite/readline/helpers/terminal-helpers.ts
  • test-parity/node-suite/readline/interface/stream-question-output.ts
  • test-parity/node-suite/readline/interface/child-stdout-async-iteration.ts
  • test-parity/node-suite/readline/promises/readline-actions.ts
🚧 Files skipped from review as they are similar to previous changes (77)
  • test-parity/node-suite/readline/exports/interface-class-name.ts
  • test-parity/node-suite/readline/exports/interface-symbols.ts
  • test-parity/node-suite/readline/helpers/clear-line-callback-validation.ts
  • test-parity/node-suite/readline/streams/unterminated-final-line.ts
  • test-parity/node-suite/readline/exports/interface-constructor-descriptor.ts
  • test-parity/node-suite/readline/streams/crlf-chunk-boundary.ts
  • test-parity/node-suite/readline/question/after-close.ts
  • test-parity/node-suite/readline/create-interface/crlf-delay.ts
  • test-parity/node-suite/readline/completer/promises-sync.ts
  • test-parity/node-suite/readline/streams/carriage-return.ts
  • test-parity/node-suite/readline/streams/empty-lines.ts
  • test-parity/node-suite/readline/create-interface/defaults.ts
  • test-parity/node-suite/readline/validation/escape-code-timeout.ts
  • test-parity/node-suite/readline/keypress/listener-reactivation.ts
  • test-parity/node-suite/readline/create-interface/pre-aborted-signal.ts
  • test-parity/node-suite/readline/promises/readline-commit-queue.ts
  • test-parity/node_suite_baseline.json
  • test-parity/node-suite/readline/question/callback-answer.ts
  • test-parity/node-suite/readline/streams/input-error-event.ts
  • test-parity/node-suite/readline/async-iterator/break-closes.ts
  • test-parity/node-suite/readline/validation/history.ts
  • test-parity/node-suite/readline/validation/signal.ts
  • test-parity/node-suite/readline/lifecycle/cursor-position.ts
  • test-parity/node-suite/readline/interface/stream-line-close-events.ts
  • test-parity/node-suite/readline/helpers/clear-line-directions.ts
  • test-parity/node-suite/readline/question/abort-recovery.ts
  • test-parity/node-suite/readline/promises/question-resolution.ts
  • test-parity/node-suite/readline/helpers/cursor-to-validation.ts
  • test-parity/node-suite/readline/create-interface/terminal-inference.ts
  • test-parity/node-suite/readline/streams/utf8-chunks.ts
  • test-parity/node-suite/readline/completer/classic-sync.ts
  • test-parity/node-suite/readline/completer/undefined-columns.ts
  • test-parity/node-suite/readline/validation/history-size.ts
  • test-parity/node-suite/readline/lifecycle/write-after-close.ts
  • test-parity/node-suite/readline/completer/promises-error.ts
  • test-parity/node-suite/readline/lifecycle/write-while-paused.ts
  • test-parity/node-suite/readline/helpers/clear-screen-null-output.ts
  • test-parity/node-suite/readline/completer/classic-error.ts
  • test-parity/node-suite/readline/exports/interface-prototype-identity.ts
  • test-parity/node-suite/readline/lifecycle/write-undefined.ts
  • test-parity/node-suite/readline/helpers/move-cursor-directions.ts
  • test-parity/node-suite/readline/lifecycle/pause-resume-after-close.ts
  • test-parity/node-suite/readline/promises/question-abort-cause.ts
  • test-parity/node-suite/readline/exports/interface-legacy-aliases.ts
  • test-parity/node-suite/readline/helpers/emit-keypress-events.ts
  • test-parity/node-suite/readline/streams/reopen-utf8-boundary.ts
  • test-parity/node-suite/readline/promises/question-abort-recovery.ts
  • test-parity/node-suite/readline/history/listener-mutation.ts
  • test-parity/node-suite/readline/promises/readline-auto-commit.ts
  • test-parity/node-suite/readline/helpers/clear-line-null-output.ts
  • test-parity/node-suite/readline/question/concurrent.ts
  • test-parity/node-suite/readline/question/prompt-output.ts
  • test-parity/node-suite/readline/helpers/move-cursor-null-output.ts
  • test-parity/node-suite/readline/history/event-newest-first.ts
  • test-parity/node-suite/readline/completer/classic-callback.ts
  • test-parity/node-suite/readline/promises/readline-rollback.ts
  • test-parity/node-suite/readline/question/callback-receiver.ts
  • test-parity/node-suite/readline/helpers/cursor-to-overloads.ts
  • test-parity/node-suite/readline/exports/promises-surface.ts
  • test-parity/node-suite/readline/promises/question-abort.ts
  • test-parity/node-suite/readline/helpers/clear-screen-down.ts
  • test-parity/node-suite/readline/helpers/move-cursor-callback-validation.ts
  • test-parity/node-suite/readline/completer/promises-async.ts
  • test-parity/node-suite/readline/streams/unicode-separators.ts
  • test-parity/node-suite/readline/validation/completer.ts
  • test-parity/node-suite/readline/promises/readline-action-validation.ts
  • test-parity/node-suite/readline/keypress/csi-chunk-boundary.ts
  • test-parity/node-suite/readline/helpers/cursor-to-null-output.ts
  • test-parity/node-suite/readline/promises/get-builtin-module.ts
  • test-parity/node-suite/readline/async-iterator/done.ts
  • test-parity/node-suite/readline/lifecycle/recursive-write.ts
  • test-parity/node-suite/readline/lifecycle/close-idempotent.ts
  • test-parity/node-suite/readline/async-iterator/input-error.ts
  • test-parity/node-suite/readline/create-interface/positional-overload.ts
  • test-parity/node-suite/readline/README.md
  • test-parity/node-suite/readline/lifecycle/cursor-position-width.ts
  • test-parity/node-suite/readline/async-iterator/nested.ts

Comment thread scripts/node_suite_regression_check.py Outdated

@coderabbitai coderabbitai 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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
crates/perry-codegen/src/loop_purity.rs (1)

128-130: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Don’t treat generic IndexUpdate as allocation-free.

IndexUpdate can lower to js_dyn_index_set, which may grow a plain JS array or string-keyed storage and can String coerce keys, so arr[i]++ may reallocate and move GC roots. Keep the poll for this path, or narrow it to a statically proven fixed-size typed-array case.

🤖 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 `@crates/perry-codegen/src/loop_purity.rs` around lines 128 - 130, The
Expr::IndexUpdate branch in expr_alloc_free must not classify generic index
updates as allocation-free. Preserve the allocation poll for dynamic array or
string-keyed storage, or restrict the optimization to cases statically proven to
use fixed-size typed arrays.
🤖 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.

Outside diff comments:
In `@crates/perry-codegen/src/loop_purity.rs`:
- Around line 128-130: The Expr::IndexUpdate branch in expr_alloc_free must not
classify generic index updates as allocation-free. Preserve the allocation poll
for dynamic array or string-keyed storage, or restrict the optimization to cases
statically proven to use fixed-size typed arrays.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c95a4eae-277e-4f34-b8b9-be2fbd24cbba

📥 Commits

Reviewing files that changed from the base of the PR and between c9ed49c and 4245361.

📒 Files selected for processing (1)
  • crates/perry-codegen/src/loop_purity.rs

@proggeramlug
proggeramlug merged commit edbda58 into main Jul 30, 2026
6 checks passed
@proggeramlug
proggeramlug deleted the test/expand-node-readline-parity branch July 30, 2026 06:05
Sign up for free to 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.

2 participants