Skip to content

node:module: list node:test in builtinModules - #39700

Open
robobun wants to merge 7 commits into
mainfrom
farm/dd1f684a/builtin-modules-node-test
Open

robobun wants to merge 7 commits into
mainfrom
farm/dd1f684a/builtin-modules-node-test

Conversation

@robobun

@robobun robobun commented Aug 19, 2026 •

Copy link
Copy Markdown
Collaborator

Problem

  • require("node:module").builtinModules lacks "node:test", although isBuiltin("node:test") is true and the module loads. Node lists it. A tool that takes its external list from the array misses node:test.
  • The array and isBuiltin() read separate hand-written tables (src/jsc/modules/NodeModuleModule.cpp:55, src/jsc/bindings/isBuiltinModule.cpp:3). Nothing compared them. require.resolve with paths option #18851 dropped the name from the first.

Fix

  • Add "node:test" to builtinModuleNames. As in Node, a builtin that resolves only as node:x is listed with the prefix, like node:sqlite (node:sqlite: implement the module and pass the Node v26.3.0 test suite #32498).
  • Add the source lint test/internal/source-lints/builtin-module-tables.test.ts: every name isBuiltin() accepts is in builtinModuleNames, or an allowlist says why not.
  • Three tests on main that walk the list agree with the new name (see Notes).
  • Verified: the lint and test/js/node/module/node-module-module.test.js fail without the entry and pass here. Other suites: Notes.

Background

Downsides

  • builtinModules has 77 names, was 76. Code that pins the length or a snapshot of the list breaks.
  • Size: +26 bytes of read-only data. One more string on the first read of builtinModules.
  • Node 26.12.1 also lists node:sea, node:test/reporters and node:ffi, which Bun does not have.
Notes
  • Repro: bun -e 'const m=require("node:module"); console.log(m.isBuiltin("node:test"), m.builtinModules.includes("node:test"), typeof require("node:test"))' prints true false function on a build without the entry (canary 367d939d9). The table on main 11c367163a has no "node:test" entry. Node 26.3.0 and 26.12.1 print true true function, and so does a debug build of this branch.
  • History: Initial support for node:test #18140 (v1.2.6) listed node:test. require.resolve with paths option #18851 (v1.2.9) dropped it again and changed the length assertion in node-module-module.test.js from 77 to 76. That is why no test pins the length now.
  • The three tests on main. All three landed after this branch started, so the branch merged clean as text and these tests failed:
    • test/js/node/module/node-module-module.test.js, "Object.entries(Module) passes exception check validation" (Hardening: fix crashes across the runtime, bundler, dev server, shell and CLI #46021). It expected builtinModules: 76 for the copied list. It now expects the length of the test process's own list. The first test of the file and the lint check what the list holds.
    • test/js/bun/module-graph/module-graph-isolation.test.ts, "every node: builtin module is classified" (Bun.ModuleGraph: a context per graph for timers and I/O, per-graph CommonJS #42590). Every listed name needs an entry that says what graph.dispose() does with what the module opens. Without one the test fails with ["node:test"]. The new entry is "node:test": "host", the class Bun.jest has in the same file: node:test registers its tests through Bun.jest (src/js/node/test.ts:9).
    • test/aot/runtime-use-of-built-in-code.test.ts, "only a call opens the report: requiring %s leaves it closed" (Compile TypeScript to machine code ahead of time: bun build --compile --aot #45631). It has a row for every listed name. For node:test the report of bun check --aot --explain=trim has the line uses globalThis (escapes, so any member may be used), so the row fails. node:test is now in letTheGlobalObjectEscape, the modules whose rows are test.todo for that reason.
  • Other tests that take their cases from the list. All pass with node:test in it, on a debug build of this branch: test/js/bun/test/parallel/test-require-builtins.ts (it requires all 77 names, each in a subprocess), test/js/node/test/parallel/test-process-get-builtin.mjs, test-require-resolve.js, test-module-builtin.js, test-repl-options.js, test/bundler/bun-build-compile.test.ts ("every internal module's functions have names"), test/internal/lazy-function-table.test.ts, test/js/web/workers/worker.test.ts ("terminate() while importing every builtin module"), test/cli/lint/js-plugins.test.ts ("a config file and a rule see Node.js's list of builtin modules"), test/js/bun/resolve/builtin-esm-lazy-exports.test.ts, the three builtin tests of test/js/bun/repl/repl.test.ts, test/js/node/sqlite/node-sqlite.test.ts ("node:sqlite is a built-in module"), and all of test/internal/source-lints/.
  • The AOT tests need minutes for each program on a debug build: bun check --aot of one require("node:test") took 263 s. Their results are from CI on ddf03aabc3, on the release builds for Debian 13 x64 and aarch64. The head has the same src/ and differs from it in two test files. test/aot/load/every-runtime-module-compiles.test.ts: 3 pass. test/aot/runtime-use-of-built-in-code.test.ts: 85 pass, 53 todo. test/aot/generated-library-modules-that-use-keys-of-one-another.test.ts: 28 of 28 (x64) and 34 of 34 (aarch64) of the drawn programs pass. Its "beside every module" programs now import node:test.
  • On a local debug build node-module-module.test.js takes 23 to 35 s. Subprocess tests that this change does not touch hit the 5 s default timeout (7 in one run). With --timeout 30000 all 80 tests pass.
  • Size: one table entry is 16 bytes (ASCIILiteral holds one std::span). The string with its terminator is 10 bytes.
  • The source-lints workflow is not part of this change any more. Main triggers it on src/**/*.cpp since Update the jsc class skill for BUN_SUBSPACE_SLOTS and lint IsoSubspace construction #39833, which covers NodeModuleModule.cpp.
  • The lint against the shape of node:test: --test CLI mode, node:test/reporters, standalone execution, and reporter-output parity (+18 tests, test_runner 32%→55%) #34515 (add node:test/reporters to isBuiltinModule.cpp and HardcodedModule.rs only): it fails with ["node:test/reporters"]. Node lists node:test/reporters, so that is the wanted outcome. The lint also fails when an allowlist entry goes stale. Its allowlist: bun:main and bun:wrap are internal (process: port Node.js v26.3.0 process compatibility tests and fix the gaps they surface (env exotic-object/TZ semantics, warnings pipeline + CLI flags, uncaught origin/exit codes, execve throw, threadCpuUsage/finalization/loadEnvFile, native-module identity; +26 tests) #31831), and stock Node 26 builds do not list node:quic.
  • The lint reads the two C++ tables line by line. It skips a comment line, reports a line that is not one name, and fails on a name that is there twice. Checked by mutation: "ws" commented out in builtinModuleNames gives ["ws"], and a second "fs" gives twice: ["fs"].
  • fix(node:module): synchronize builtin ESM exports #42616 (open) walks builtinModuleNames in syncBuiltinESMExports(). It looks each name up in the module registry and skips a module that is not loaded. With this change it also looks up node:test.
  • Set difference against Node before this change: Node 26.3.0 lists node:sea, node:test and node:test/reporters, Bun lists none of them. Node 26.12.1 adds node:ffi. After this change the only entries Bun lacks are modules Bun does not have: isBuiltin() is false for each.
  • node:quic: Bun resolves it without a flag and prints an ExperimentalWarning. The stock node 26.3.0 and 26.12.1 binaries do not list it, also not with --experimental-quic. To list it is a separate decision. The allowlist entry records the current one.
  • Not covered by the lint: the non-prefix entries of the resolver (they also hold flag-gated modules such as stream/iter and third-party aliases), the separate table behind process.binding("natives") in src/jsc/bindings/ProcessBindingNatives.cpp, and the REPL's list of prefix-only names (getSchemeOnlyModuleNames() in src/js/internal/repl/node-shims.ts, which has test and not sqlite). A table derived from the resolver's Alias entries would remove the copies. That is a larger change than this fix.
  • node:module: build builtinModules from the same table as isBuiltin, and freeze it #33430 fixed the node:test entry by merging the two tables into one. That would list bun:wrap and bun:main again, and the branch conflicted with main, so I closed it. The freeze of builtinModules that it also did is independent of this bug and is not part of this change.
  • Other consumers of the array: the REPL's getBuiltinLibs() already filters out node: names (src/js/internal/repl/node-shims.ts:183). util.inspect only looks up bare names taken from stack frames. bun lint hands configs and plugins the array without Bun's own names (src/lint/driver/evaluate-start.js:13, src/lint/js_plugin/worker/main.js:45). They now see node:test, as under Node.

no test proof · iteration 0 · Platform-specific test(s) that do not run on this machine. Deferring to CI, which covers all platforms: test/js/node/module/node-module-module.test.js

@coderabbitai

coderabbitai Bot commented Aug 19, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

No actionable comments were generated in the recent review.

Recent review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between ddf03aa and 457637f.

Files selected for processing: 2
  • test/internal/source-lints/builtin-module-tables.test.ts
  • test/js/node/module/node-module-module.test.js

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 1 remain after this review.

Walkthrough

The builtin module list now includes node:test. Source and runtime tests check builtin-table consistency, listing, recognition, prefixed resolution, and module classification.

Changes

Builtin module support

Layer / File(s) Summary
Builtin module metadata
src/jsc/modules/NodeModuleModule.cpp
The builtin module names include node:test. A comment documents that node:test and node:sqlite are listed with the node: prefix.
Builtin module validation
test/internal/source-lints/builtin-module-tables.test.ts, test/js/node/module/node-module-module.test.js, test/aot/runtime-use-of-built-in-code.test.ts, test/js/bun/module-graph/module-graph-isolation.test.ts
Source checks validate builtin-table contents and consistency. Runtime tests check listing, recognition, and prefixed resolution, replace a fixed array-length assertion, and classify node:test as host-owned and as a TODO case in the AOT test.

Suggested reviewers: jarred-sumner, alii

Priority: Normal

Merge Risk: Minimal · up to 45763

No actionable merge-blocking risk is established; the change is mergeable.

Pre-merge checks: Passed 4
Check name Status Explanation
Title check Passed The title "node:module: list node:test in builtinModules" names the main change: adding "node:test" to the builtinModuleNames array so that module.builtinModules matches isBuiltin() and Node. The chan…
Description check Passed The description follows the repository template. It has a Problem section, a Fix section that describes the verification steps, and a Background section, so it covers the template's intent of explaini…
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.
Full details: Title check

Explanation

The title "node:module: list node:test in builtinModules" names the main change: adding "node:test" to the builtinModuleNames array so that module.builtinModules matches isBuiltin() and Node. The changeset edits NodeModuleModule.cpp to add the entry, and the other changes (lint, tests, allowlist) support that fix. The title is specific and short, and it does not use vague terms.

Full details: Description check

Explanation

The description follows the repository template. It has a Problem section, a Fix section that describes the verification steps, and a Background section, so it covers the template's intent of explaining the change and how it was verified. The 'How did you verify your code works?' content is detailed: it names the lint and test files, the repro command, and the CI results for the AOT tests. The template headings 'What does this PR do?' and 'How did you verify your code works?' are not used verbatim; the Problem/Fix sections cover the first heading's content. One item is noted as deferred to CI for platform-specific tests, but the description still provides complete reasoning and verification details.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

Finishing Touches: 💡 1
🛠️ Fix failing CI checks: 💡
  • Commit to this branch
  • Create a new PR

@robobun

robobun commented Aug 19, 2026 •

Copy link
Copy Markdown
Collaborator Author
Updated 3:01 AM PT - Oct 28th, 2026

❌ @robobun, your commit 457637f has 60 failures in Build #134278 (All Failures):


🧪   To try this PR locally:

bunx bun-pr 39700

That installs a local version of the PR into your bun-39700 executable, so you can run:

bun-39700 --bun

@robobun

robobun commented Aug 19, 2026 •

Copy link
Copy Markdown
Collaborator Author

Status

Reproduced with a canary build (367d939d9). The table on main (11c367163a) still has no node:test entry:

$ bun -e 'const m=require("node:module"); console.log(m.isBuiltin("node:test"), m.builtinModules.includes("node:test"), typeof require("node:test"))'
true false function
$ node -e 'const m=require("node:module"); console.log(m.isBuiltin("node:test"), m.builtinModules.includes("node:test"))'
true true

With this branch the debug build prints true true function. Two tests fail without the entry and pass with the change: the source lint test/internal/source-lints/builtin-module-tables.test.ts (with main's table it reports ["node:test"] as missing) and test/js/node/module/node-module-module.test.js.

The branch is rebased on 11c367163a. Three tests that main gained after the branch started read the list. They agree with the new name now. The PR description says which tests and how.

CI

The diff is green. Build 134278 on 457637f693 finished with two failed jobs, and this PR touches neither test:

  • vendor/elysia/test/response/stream.test.ts ("stop stream on canceled request") failed four times on debian 13 x64-asan. It passed on the same lane in build 134171, which had the same src/.
  • test/aot/engine-tests-native-12.test.ts on debian 13 x64: the engine's native test heap-cage/ballast/first-requests-of-threads-are-served crashed. All 27 shards of this step passed on the same lane in builds 134171 and 134246.

Everything else that gates a merge passed:

  • test-bun: 159 of 160 shards. All shards passed on Debian 13, Ubuntu 25.04 and Alpine 3.23 (x64 and aarch64), Windows 2019 x64, Windows 11 aarch64, and macOS x64 and aarch64. The one failure is the elysia test above.
  • test-aot: 70 of 71 shards, on Linux, Windows and macOS. The one failure is the engine test above.
  • build-bun (14 platforms), verify-baseline, test-hardened and binary-size.

The 70 other red jobs are test-aot-drawn steps. They do not gate a merge, and none of their failures mentions builtinModules or node:test.

The branch has one ci: retrigger commit. In the earlier build 134246 of the same tree, eight build jobs did not get a machine (CapacityLimitExceeded from EC2).

Fix: this PR (#39700). #33430 was an earlier attempt with a single table. It is closed.

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

LGTM — one string literal added to a static table, following the existing node:sqlite pattern.

What was reviewed:

  • Counted the table: 77 entries after the addition, matching the updated toHaveLength(77).
  • isBuiltinModule.cpp already lists node:test, so the new isBuiltin/process.getBuiltinModule assertions hold.
  • Only other consumer of node:-prefixed entries is the REPL's getBuiltinLibs(), which already filters them out (src/js/internal/repl/node-shims.js:184).
  • New tests assert the exact prefixed set and that bare "test" stays out; they fail on main per the PR notes.
Extended reasoning...

Overview

Adds "node:test"_s to the static builtinModuleNames array in src/jsc/modules/NodeModuleModule.cpp, alongside the existing "node:sqlite"_s entry, plus a three-line comment explaining the prefix-only convention. Bumps the length assertion in node-module-module.test.js from 76 to 77 and adds two focused tests: one enumerating the node:-prefixed subset and asserting each is prefix-only and requireable, and one in node-test.test.ts asserting node:test is a builtin.

Security risks

None. The change is a compile-time string literal in a constexpr array; no user input, no allocation, no new code paths, no exception scopes touched.

Level of scrutiny

Low. This is a one-line data change to a lookup table that already contains an entry of the exact same shape (node:sqlite, added in #32498). The array is consumed only by getBuiltinModulesObject via countof(), so no hardcoded size to update elsewhere. I verified the entry count (77) by hand, confirmed isBuiltinModule.cpp:48 already recognizes node:test (so the new test's isBuiltin and process.getBuiltinModule assertions are consistent), and confirmed the REPL consumer at src/js/internal/repl/node-shims.js:184 filters node:-prefixed names so completion is unaffected.

Other factors

The PR description is unusually thorough — it enumerates the set difference against Node 26.3.0, justifies leaving out node:quic (not in stock Node builds), bun:wrap/bun:main (deliberately removed in #31831), and defers freezing the array as an independent change. Tests are placed in the correct existing files, use exact-value assertions (toEqual(["node:sqlite", "node:test"]) rather than toContain), and cover the negative contract (bare "test" absent, isBuiltin("test") false). No outstanding reviewer comments; no prior reviews from me.

@robobun

robobun commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks, the review asks for no changes.

@coderabbitai review

(The first attempt hit the review rate limit before it started.)

@coderabbitai

coderabbitai Bot commented Aug 19, 2026 •

Copy link
Copy Markdown
Contributor

@robobun, I will review PR #39700.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Comment thread src/jsc/modules/NodeModuleModule.cpp Resolved
Comment thread src/jsc/modules/NodeModuleModule.cpp Resolved
Comment thread src/jsc/modules/NodeModuleModule.cpp Resolved
@robobun

robobun commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator Author

Update after a self-review of the first version. The head is now f06a92c.

  • New source lint test/internal/source-lints/builtin-module-tables.test.ts. It compares the isBuiltin() table with builtinModules. On main it fails with ["node:test"]. It also fails on the shape of node:test: --test CLI mode, node:test/reporters, standalone execution, and reporter-output parity (+18 tests, test_runner 32%→55%) #34515, which adds node:test/reporters to the isBuiltin() table only.
  • The length assertion in node-module-module.test.js is gone. The test checks the properties of the array instead. The duplicate test in node-test.test.ts is gone too.
  • The comment above the table only has its first sentence corrected. The three comment-cop threads about it are answered and resolved.

The PR description describes the current state.

@robobun

robobun commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

The three commits after 8baf99b (the source lint, the test rework and the comment change) have not been reviewed yet. The earlier attempts hit the review rate limit.

@coderabbitai

coderabbitai Bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor

@robobun, I will review the commits after 8baf99b07d.

⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@robobun

robobun commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Aug 20, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

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

LGTM — one-line data addition to a static table, matching Node's behavior for prefix-only builtins.

What was reviewed:

  • Verified node:test is already in isBuiltinModule.cpp and node_entry_only_prefix!(), so this only closes the gap in builtinModules.
  • Checked the new source-lint's notListed entries (bun:main, bun:wrap, node:quic) against both tables — all consistent; the regex parsers match the actual table declarations.
  • Confirmed the runtime test's new loop over node:-prefixed entries only hits node:sqlite and node:test, both requireable in-process; the removed .toHaveLength(76) is subsumed by the cross-table lint.
Extended reasoning...

Overview

The PR adds "node:test"_s to the builtinModuleNames[] table in src/jsc/modules/NodeModuleModule.cpp so that require("node:module").builtinModules includes it, matching Node 26. It also corrects the first sentence of the pre-existing comment above that table, adds a source-lint test that cross-checks the three hand-written builtin-name tables (builtinModuleNames, builtinModuleNamesSortedLength, node_entry_only_prefix!), wires the new file into the source-lints workflow path filter, and replaces the fragile .toHaveLength(76) runtime assertion with invariant-based checks.

Security risks

None. This is a metadata list of module names; adding an entry does not change what require() resolves — node:test was already resolvable and already accepted by isBuiltin(). The source-lint test only reads source files with regex.

Level of scrutiny

Low. The production change is a single string literal appended to a static constexpr ASCIILiteral[], following the exact precedent set by node:sqlite immediately above it. No control flow, no allocation, no exception paths are touched. The test and workflow changes are defensive tooling.

Other factors

  • I verified the source-lint test's assumptions hold: isBuiltinModule.cpp contains bun:main, bun:wrap, node:quic, node:test, node:sqlite; HardcodedModule.rs has node_entry_only_prefix! for node:sqlite, node:test, node:quic. The notListed map exactly covers the intended isBuiltin-only names, and the reverse check ensures the map cannot go stale.
  • The runtime test dropped the hardcoded length in favor of stronger invariants (every listed name passes isBuiltin, prefix-only entries are not resolvable bare, process.getBuiltinModule matches require). The lint test enforces completeness in the other direction, so no coverage is lost.
  • The comment-cop bot flagged the table comment three times; the author iterated down to a minimal one-sentence correction of the pre-existing comment, and all threads are resolved.
  • The PR description references assertions in node-test.test.ts that are not in the final diff — presumably reverted in a later commit — but this does not affect the change's correctness or test coverage.
  • The PR author enumerated downstream consumers of builtinModules (REPL, util.inspect, test-require-builtins, test-process-get-builtin) and explained why each is unaffected or improved.

@robobun

robobun commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator Author

Thanks. On the one observation: the PR description was rewritten for the current diff before this review ran and no longer mentions node-test.test.ts. Only the update comment above mentions it, as the test that 08b77b7 removed. No changes needed.

@robobun

robobun commented Aug 20, 2026

Copy link
Copy Markdown
Collaborator Author

On the "wrong build configuration" note in the merge risk summary: the new test is a source lint. It reads three source files and never runs the bun binary, so the source-lints workflow runs it with a released bun on purpose. That is the documented setup for every test in test/internal/source-lints/ (see the README there). The workflow change in this PR only adds NodeModuleModule.cpp to the path filter, so that an edit to the table triggers the lint. The Buildkite lanes are unaffected: .buildkite/ci.mjs excludes this directory.

Node lists the modules that only resolve with the node: prefix under
that prefixed name in module.builtinModules. Bun already does this for
node:sqlite. node:test was missing from the list although
isBuiltin("node:test") is true and require("node:test") works.
module.builtinModules and module.isBuiltin() read two hand-written
tables, and the module loader has a third marker for the builtins that
resolve with the node: prefix only. A new module tends to reach the
last two and not the first. The new source lint requires every name
isBuiltin() accepts to be listed in builtinModules, with an allowlist
that names the reasons for the deliberate exceptions.

The runtime test now checks the array's properties instead of its
length, and the copy of those assertions in node-test.test.ts is gone.
Three tests that main gained since this branch started read the list:

- node-module-module.test.js: the Object.entries(Module) test pinned the
  length of the copied list at 76. It now checks that the copy holds "fs".
  The first test of the file and the source lint check what the list holds.
- module-graph-isolation.test.ts: every listed builtin has to say what a
  graph's dispose() does with what the module opens. node:test is "host":
  a test it registers goes to the process's test runner, like Bun.jest.
- aot/runtime-use-of-built-in-code.test.ts: the trim report of a program
  that requires node:test lists globalThis as escaped, so node:test joins
  the modules of which that is a known gap.

The source-lints workflow triggers on src/**/*.cpp since #39833, so the
extra path for NodeModuleModule.cpp is gone.
@robobun
robobun force-pushed the farm/dd1f684a/builtin-modules-node-test branch from f06a92c to ddf03aa Compare October 28, 2026 02:52

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

Nothing blocking. The comments below are optional suggestions. There is no need to push a fix for them before merging.

The lint counted a name in a commented-out line as listed, and it
folded each table into a set, so a name that was there twice passed.
It now drops comment lines, reports a line that is not one name, and
fails when a table holds a name twice.

The runtime test also fails on a repeated name. The Object.entries test
compares the length of the copied list with the length of the list of
the test process again, in place of a check for one name.

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

Code review completed

Nothing new to post: everything this review found is already covered by existing comments on this pull request or didn't merit a separate one.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant