Skip to content

bun-types: type BuildMessage/ResolveMessage level and importKind as the strings the runtime reports - #38542

Open
robobun wants to merge 2 commits into
mainfrom
farm/0f166ac8/build-message-level-types
Open

bun-types: type BuildMessage/ResolveMessage level and importKind as the strings the runtime reports#38542
robobun wants to merge 2 commits into
mainfrom
farm/0f166ac8/build-message-level-types

Conversation

@robobun

@robobun robobun commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator

Problem

  • BuildMessage.level and ResolveMessage.level are declared as "error" | "warning" | "info" | "debug" | "verbose" (packages/bun-types/globals.d.ts), but both getters return bun_ast::Kind::string() (src/jsc/BuildMessage.rs and src/jsc/ResolveMessage.rs get_level; table in src/ast/lib.rs), whose values are "error" | "warn" | "note" | "debug" | "verbose". So log.level === "warn" (the value that comes back) is a TS2367 error, while log.level === "warning" type-checks and is never true.
  • ResolveMessage.importKind is declared as the old enum tag names ("stmt" | "require" | "require_resolve" | "at" | ...), but the getter has returned ImportKind::label() ("import-statement" | "require-call" | "require-resolve" | "import-rule" | ...) since bundler tests and improve Bun.build return type #2833, the same change that added the level unions above. Same failure mode.
  • Bun.ImportKind in bun.d.ts, the declared mirror of ImportKind::label(), is missing "composes", which a ResolveMessage for composes: x from "./missing.css" reports.
  • The copies drifted because nothing compares them with the Rust tables: the only guard was a "keep bun.d.ts in sync" comment in src/ast/lib.rs, and src/jsc/ResolveMessage.rs kept its own verbatim copy of the label table as well.
  • Reproduces on bun 1.4.0 and current main; probe output below.

Fix

  • Bun.ImportKind gains "composes" (each member now documented), and a new Bun.BuildMessageLevel alias holds the Kind::string() arms. ResolveMessage.importKind and both level declarations reference those two types, so each union is declared once. The docs copies in docs/bundler/index.mdx are updated to match.
  • The declarations change rather than the runtime: these strings have been returned unchanged since before bun-types existed, and tests and user code compare against them (test/bundler/bun-build-api.test.ts, test/bundler/metafile.test.ts).
  • ResolveMessage::get_import_kind now calls ImportKind::label() instead of its private copy of the table (the copy's justification was stale: MetadataResolve.import_kind is the bun_ast::ImportKind that has label()). The table is identical, so the reported strings do not change (verified with the probe below on a debug build).
  • New source lint test/internal/source-lints/import-kind-and-level-names.test.ts parses the Kind::string() and ImportKind::label() arms out of src/ast/lib.rs and fails when Bun.BuildMessageLevel, Bun.ImportKind, or any class BuildMessage / class ResolveMessage snippet in the docs differs from them. Two variants are listed as exclusions with their reasons: AtConditional (its label is "") and HtmlManifest (see below). Same shape as the Loader lint in Lint the loader name list in bun-types and the docs against src/ast/loader.rs #38424; the source-lints workflow and README hunks are identical to that PR's so the two merge in either order.
  • On main's declarations the lint fails (BuildMessageLevel absent, ImportKind missing "composes"); with this change it passes. test/integration/bun-types/fixture/build.ts additionally compiles realistic usage (log.level === "warn", log.importKind === "require-call") and checks that the globals resolve to the two aliases, under both the DOM and non-DOM tsconfigs.
  • Also run: bun bd test test/js/bun/resolve/resolve-error.test.ts test/bundler/bun-build-api.test.ts (74 pass) and bun test test/internal/source-lints/ (151 pass).

Not changed here

Background

  • A bundler diagnostic is a bun_ast::Msg whose kind is a bun_ast::Kind (Err, Warn, Note, Debug, Verbose). Bun.build returns each one wrapped as a BuildMessage, or a ResolveMessage when it carries resolve metadata, and level is Kind::string() of that kind. Note is the kind of the entries in a message's notes.
  • bun_ast::ImportKind classifies the import record being resolved. label() is its public string form, shared by ResolveMessage.importKind, the metafile kind field and Transpiler.scanImports(); Bun.ImportKind is the TypeScript mirror of that table.
  • test/internal/source-lints/ holds tests that only read the source tree. They are excluded from the Buildkite lanes and run on GitHub Actions (.github/workflows/source-lints.yml) for the paths listed there, which is why bun.d.ts and the docs are added to that list.
Runtime probe (bun 1.4.0 and a debug build of this branch print the same rows)
const { logs } = await Bun.build({
  entrypoints: [
    "unknown-at-rule.css",          // @foo bar; .a { color: red }
    "missing-imports.ts",           // import / require / require.resolve / import() of missing files
    "missing-css-imports.css",      // @import "./missing.css"; @import "./missing-cond.css" supports(...); url("./missing.png")
    "missing-composes.module.css",  // .a { composes: b from "./missing.module.css" }
  ].map(f => import.meta.dir + "/" + f),
  throw: false,
});
for (const l of logs) console.log(l.name, l.level, l instanceof ResolveMessage ? l.importKind : null, l.message);
ResolveMessage error ""                 Could not resolve: "./missing-cond.css"
ResolveMessage error "dynamic-import"   Could not resolve: "./missing-dynamic"
ResolveMessage error "import-statement" Could not resolve: "./missing-import"
ResolveMessage error "require-resolve"  Could not resolve: "./missing-require-resolve"
ResolveMessage error "require-call"     Could not resolve: "./missing-require"
ResolveMessage error "import-rule"      Could not resolve: "./missing.css"
ResolveMessage error "composes"         Could not resolve: "./missing.module.css"
ResolveMessage error "url-token"        Could not resolve: "./missing.png"
BuildMessage   warn  null               invalid @ rule encountered: '@foo'
Earlier revision of this PR

The first push fixed the same declarations but re-pinned the unions as literals in the bun-types fixture and added a Bun.build + tsc case to test/integration/bun-types/bun-types.test.ts. Self-review pointed out that the literal pins only compared TypeScript with TypeScript, that test/integration/bun-types is excluded from the Buildkite lanes (so the Bun.build half never ran against the build under test), that the tsc helper extraction collided with #37421, and that ResolveMessage.rs still carried its own copy of the label table. This revision replaces all of that with the source lint, the shared aliases and the label() call described above; bun-types.test.ts is no longer touched.


[review] gate passed · iteration 2 · 9 files touched

fails on main (without fix)
ASAN without fix: 2 FAILED
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/internal/source-lints/import-kind-and-level-names.test.ts
bun test v1.4.0 (e1ea82a0a)

test/internal/source-lints/import-kind-and-level-names.test.ts:
(pass) src/ast/lib.rs: Kind::string() and ImportKind::label() were parsed for every variant [30.02ms]
(pass) src/ast/lib.rs: a variant without a label is listed in `notPublic` [7.39ms]
101 |   expect(unlabeled.filter(variant => !notPublic.includes(variant))).toEqual([]);
102 |   expect(importKinds).not.toContain("");
103 | });
104 | 
105 | test("packages/bun-types/bun.d.ts: BuildMessageLevel lists Kind::string()", () => {
106 |   expect(unionsAfter(read("packages/bun-types/bun.d.ts"), typeAlias("BuildMessageLevel"))).toEqual([levels]);
                                                                                                 ^
error: expect(received).toEqual(expected)

- [
-   [
-     "debug",
-     "error",
-     "note",
-     "verbose",
-     "warn",
-   ],
- ]
+ []

- Expected  - 9
+ Received  + 1

      at <anonymous> (/workspace/bun/test/internal/source-lints/import-kind-
... (truncated)

release without fix: 2 FAILED
bun test v1.4.0-canary.1 (4dcef48c6)

test/internal/source-lints/import-kind-and-level-names.test.ts:
(pass) src/ast/lib.rs: Kind::string() and ImportKind::label() were parsed for every variant [2.55ms]
(pass) src/ast/lib.rs: a variant without a label is listed in `notPublic` [0.09ms]
101 |   expect(unlabeled.filter(variant => !notPublic.includes(variant))).toEqual([]);
102 |   expect(importKinds).not.toContain("");
103 | });
104 | 
105 | test("packages/bun-types/bun.d.ts: BuildMessageLevel lists Kind::string()", () => {
106 |   expect(unionsAfter(read("packages/bun-types/bun.d.ts"), typeAlias("BuildMessageLevel"))).toEqual([levels]);
                                                                                                 ^
error: expect(received).toEqual(expected)

- [
-   [
-     "debug",
-     "error",
-     "note",
-     "verbose",
-     "warn",
-   ],
- ]
+ []

- Expected  - 9
+ Received  + 1

      at <anonymous> (/workspace/bun/test/internal/source-lints/import-kind-and-level-names.test.ts:106:92)
(fail) packages/bun-types/bun.d.ts: BuildMessageLevel lists Kind::string() [4.98ms]
105 | test("packages/bun-types/bun.d.ts: BuildMessageLevel lists Kind::s
... (truncated)
passes on PR (with fix)
ASAN with fix: all passed
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/internal/source-lints/import-kind-and-level-names.test.ts
bun test v1.4.0 (e1ea82a0a)

test/internal/source-lints/import-kind-and-level-names.test.ts:
(pass) src/ast/lib.rs: Kind::string() and ImportKind::label() were parsed for every variant [30.07ms]
(pass) src/ast/lib.rs: a variant without a label is listed in `notPublic` [7.06ms]
(pass) packages/bun-types/bun.d.ts: BuildMessageLevel lists Kind::string() [29.14ms]
(pass) packages/bun-types/bun.d.ts: ImportKind lists ImportKind::label() [20.44ms]
(pass) docs: every BuildMessage / ResolveMessage snippet lists the same strings [264.46ms]

 5 pass
 0 fail
 24 expect() calls
Ran 5 tests across 1 file. [2.84s]
__F:0:S:0

release with fix: all passed
$ bun scripts/build.ts --profile=release
[configured] bun-profile → bun (stripped) in 751ms (unchanged)
ninja: Entering directory `/workspace/bun/build/release'
[1/133] gen ErrorCode+*.h
[2/133] gen NodeModuleModule.lut.h
Generating /workspace/bun/build/release/codegen/NodeModuleModule.lut.h from /workspace/bun/src/jsc/modules/NodeModuleModule.cpp
[3/133] gen generated_host_exports.rs
generated_host_exports.rs: 93 exports (host=3, lazy=10, generic=80, rust=0); 239 extern-C blocks audited
[4/133] gen cpp.rs (cppbind)
[5/133] gen ZigGeneratedClasses.{cpp,h,rs}
Found 2 classes from /workspace/bun/src/jsc/resolve_message.classes.ts
  - ResolveMessage (15 fields)
  - BuildMessage (10 fields)
Found 1 classes from /workspace/bun/src/runtime/api/Archive.classes.ts
  - Archive (4 fields, 1 class fields)
Found 2 classes from /workspace/bun/src/runtime/api/BunObject.classes.ts
  - ResourceUsage (8 fields)
  - Subprocess (20 fields)
Found 1 classes from /workspace/bun/src/runtime/api/cron.classes.ts
  - CronJob (5 fields)
Found 3 classes from /workspace/bun/src/runtime/api/filesystem_router.classes.ts
  - FileSystemRouter (5 fields)
  - FrameworkFileSystemRouter (2 fields)
  
... (truncated)
diff hotspot
.github/workflows/source-lints.yml                 |   4 +
 docs/bundler/index.mdx                             |  24 ++--
 packages/bun-types/bun.d.ts                        |  22 ++++
 packages/bun-types/globals.d.ts                    |  16 +--
 src/ast/lib.rs                                     |   1 +
 src/jsc/ResolveMessage.rs                          |  23 +---
 test/integration/bun-types/fixture/build.ts        |  16 +++
 test/internal/source-lints/README.md               |   5 +
 .../import-kind-and-level-names.test.ts            | 143 +++++++++++++++++++++
 9 files changed, 207 insertions(+), 47 deletions(-)

gate history · 2 passed · 0 rejected · iteration 2

evidence per changed file
file                                                      reads  edits  tests
.github/workflows/source-lints.yml                            1      3      0
docs/bundler/index.mdx                                        3      4      0
packages/bun-types/bun.d.ts                                   3      6      0
packages/bun-types/globals.d.ts                               2      3      0
src/ast/lib.rs                                                4      7      0
src/jsc/ResolveMessage.rs                                     1      2      0
test/integration/bun-types/fixture/build.ts                   3      3      0
test/internal/source-lints/README.md                          1      1      0
…ternal/source-lints/import-kind-and-level-names.test.ts      3      7      0

@robobun
robobun requested a review from alii as a code owner August 14, 2026 14:35
@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@robobun, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 37 seconds

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: cf14b32a-f28c-4979-8482-8d65517cee60

📥 Commits

Reviewing files that changed from the base of the PR and between e7460e3 and e1ea82a.

📒 Files selected for processing (9)
  • .github/workflows/source-lints.yml
  • docs/bundler/index.mdx
  • packages/bun-types/bun.d.ts
  • packages/bun-types/globals.d.ts
  • src/ast/lib.rs
  • src/jsc/ResolveMessage.rs
  • test/integration/bun-types/fixture/build.ts
  • test/internal/source-lints/README.md
  • test/internal/source-lints/import-kind-and-level-names.test.ts

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

@robobun

robobun commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator Author
Updated 8:45 PM PT - Aug 14th, 2026

@robobun, your commit e1ea82a0a9b284d19eae62b45de365eb9126c8e7 passed in Build #96810! 🎉


🧪   To try this PR locally:

bunx bun-pr 38542

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

bun-38542 --bun

@robobun

robobun commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator Author

Status: ready to merge from my side. Diff is 4dcef48 (e1ea82a on top is an empty CI retrigger).

  • Reproduced on bun 1.4.0 and a debug build of main: Bun.build logs report level: "warn" and importKind: "import-statement" / "require-call" / "composes", none of which the declarations accepted (probe output is in the PR description).
  • Fix: the declarations now reference Bun.ImportKind (which gains "composes") and a new Bun.BuildMessageLevel; ResolveMessage's getter calls ImportKind::label() instead of a private copy of the table (reported strings unchanged); a source lint keeps the unions and the docs snippets equal to the Rust tables.
  • Proof: test/internal/source-lints/import-kind-and-level-names.test.ts fails on main's declarations and passes with this change; the bun-types fixture compiles realistic usage under both tsconfigs.
  • "html_manifest" is deliberately not added while bundler: keep the import kind of server-side HTML imports so import() and require() of the manifest link #38621 (which removes its only producer but keeps the variant) is open; reasoning in the description and in the resolved review thread on the lint.
  • CI (build 96810 on e1ea82a): 177 of 179 jobs passed, including every Windows and ASAN lane; the one flaky annotation (test/cli/run/no-orphans.test.ts, passed on retry) is unrelated. The remaining 2 jobs are the darwin 14 aarch64 test shards, which have not been assigned an agent; they never started in the previous build either (expired after ~5h), so macOS agent availability is the only thing between this PR and a fully green build. The earlier build 96666 on the same diff was green on every lane that ran apart from two ASAN leak-test timeouts unrelated to this change (reported for main triage) and Windows lanes canceled by agent provisioning.
  • Reviews: the bot review on the current diff is an LGTM; all review threads are resolved; CodeRabbit has only posted rate-limit notices. packages/bun-types has a code owner, so this still needs a human sign-off.

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

I reviewed this PR and didn't find any bugs. Since packages/bun-types/ has a CODEOWNER, a human sign-off is still appropriate.

What was reviewed:

  • Verified the new level union matches Kind::string() (src/ast/lib.rs:555) and get_level in both BuildMessage.rs and ResolveMessage.rs.
  • Verified Bun.ImportKind now covers every arm of ImportKind::label() (src/ast/lib.rs:88) except the intentional AtConditional => "" gap noted in the description.
  • Checked the test refactor: the extracted expectToTypecheck helper preserves the existing mmap case verbatim, and the new case asserts runtime values before feeding them to tsc.
Extended reasoning...

Overview

This PR corrects three stale string-literal unions in packages/bun-types/: BuildMessage.level, ResolveMessage.level, and ResolveMessage.importKind. It also adds two missing members ("composes", "html_manifest") and one-line doc comments to Bun.ImportKind, updates the hand-maintained copy in docs/bundler/index.mdx, and adds a mirror comment on Kind::string() in src/ast/lib.rs. The test file extracts the existing single-file tsc helper into expectToTypecheck and adds a case that runs Bun.build to collect real level/importKind strings, then type-checks them against the packed declarations. A fixture pins the exact unions for the release-build LanguageService checks.

Verification against source

I confirmed against src/ast/lib.rs that Kind::string() returns exactly error|warn|note|debug|verbose and ImportKind::label() returns exactly the eleven strings now in Bun.ImportKind (plus "" for AtConditional, deliberately excluded per the description). ResolveMessage::get_level calls this.msg.kind.string() and get_import_kind calls import_kind_label(resolve.import_kind), which replicates label() verbatim, so the declarations are now accurate mirrors of runtime behavior.

Security risks

None. This is type declarations, a doc comment, an .mdx update, and a test. No runtime code paths change.

Level of scrutiny

Low-to-medium. The change is mechanical (aligning .d.ts with what the runtime already returns) and thoroughly tested — the new test would fail on the old declarations with TS2367/TS1360. However, packages/bun-types/ is CODEOWNER-gated, so per the approval guidelines I'm deferring rather than approving outright.

Other factors

The test refactor is clean: the mmap case is byte-equivalent through the new helper, pipes are drained concurrently, tempDir with using handles cleanup, and assertions check stdout/stderr before exit code. The docs hunk lists 11 importKind members while the old block listed 10, so the diff's +/- counts differ by one line — that's expected, not a mis-splice.

@robobun

robobun commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator Author

Note on the "html_manifest" member added to ImportKind here: #38621 stops the bundler from rewriting server-side HTML import records to that kind (the rewrite is what broke import() / require() of such imports, and it only ever applied to the first importer of a given file). With that change the string is no longer reported anywhere: the metafile shows the import's real kind (import-statement, dynamic-import, require-call), onResolve receives the kind before resolution, and resolve errors are logged before the record was ever rewritten. If #38621 lands first, this member should probably be left out.

@robobun
robobun force-pushed the farm/0f166ac8/build-message-level-types branch from e692cdf to 760233c Compare August 14, 2026 20:43
Comment thread src/ast/lib.rs Outdated
Comment thread src/ast/lib.rs Outdated
@robobun
robobun force-pushed the farm/0f166ac8/build-message-level-types branch from 760233c to 7aa6a94 Compare August 14, 2026 20:55
Comment thread test/internal/source-lints/import-kind-and-level-names.test.ts Outdated
…he strings the runtime reports

level is bun_ast::Kind::string(), so the runtime reports "warn" and "note",
never the "warning" / "info" the declarations listed. ResolveMessage.importKind
has been ImportKind::label() ("import-statement", "require-call", ...) since the
getter stopped using the enum tag names, but the declaration still listed the
tag names. Both declarations now reuse one type each: Bun.ImportKind, which
gains the "composes" label it was missing, and a new Bun.BuildMessageLevel.
The docs copies are updated to match.

ResolveMessage's getter used a verbatim copy of the label table; it now calls
ImportKind::label() directly. A source lint parses both tables out of
src/ast/lib.rs and fails when the bun-types unions or the docs snippets differ
from them (AtConditional and HtmlManifest are the listed exclusions), and the
source-lints workflow now also triggers on bun.d.ts and the docs so that lint
runs for declaration-only changes.
@robobun
robobun force-pushed the farm/0f166ac8/build-message-level-types branch from 7aa6a94 to 4dcef48 Compare August 14, 2026 21:19
Comment thread src/collections/index_sort.rs Outdated
Comment thread src/collections/index_sort.rs Outdated
Comment thread src/collections/index_sort.rs Outdated
@robobun
robobun force-pushed the farm/0f166ac8/build-message-level-types branch from 2ea95c1 to e1ea82a Compare August 14, 2026 23:09
@robobun

robobun commented Aug 14, 2026

Copy link
Copy Markdown
Collaborator Author

Ignore the 2ea95c1 push: it was meant to be an empty CI retrigger (build 96666 lost its Windows lanes to agent provisioning failures) but picked up 21 unrelated files that were staged from a newer main. The branch is reset; e1ea82a is the empty retrigger on top of 4dcef48, and the diff is the same 9 files as before. The three bot threads on the stray file are resolved.

@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 — the author addressed my earlier note on HtmlManifest (kept as a documented exclusion coordinated with #38621), and the diff is otherwise unchanged since. Verified ImportKind::label() in src/ast/lib.rs is byte-identical to the deleted private table, so get_import_kind returns the same strings; Kind::string() matches the new BuildMessageLevel union; and the source-lint's regex parsing lines up with the actual match arm shapes in lib.rs.

Extended reasoning...

Overview

This PR corrects long-standing drift between the runtime's reported strings and the TypeScript declarations for BuildMessage.level, ResolveMessage.level, and ResolveMessage.importKind. It touches: type declarations (bun.d.ts, globals.d.ts) to add Bun.BuildMessageLevel and "composes" to Bun.ImportKind and reference those aliases from the global classes; docs (docs/bundler/index.mdx) to match; src/jsc/ResolveMessage.rs to delete a private copy of the label table and call ImportKind::label() directly; a one-line doc comment in src/ast/lib.rs; a new source-lint test that parses the Rust tables and compares them to the declared unions and docs snippets; workflow paths: additions so the lint triggers on bun-types/docs edits; and a bun-types fixture exercising the corrected types.

Security risks

None. No auth, crypto, network, or user-input parsing paths are touched. The only compiled change is replacing a private static-string table with a call to the identical shared one.

Level of scrutiny

Low-to-medium. The runtime change is a pure dedup (I diffed the deleted import_kind_label arms against ImportKind::label() in src/ast/lib.rs:88-102 — byte-identical, including the AtConditional => "" and HtmlManifest => "html_manifest" arms). Everything else is types, docs, and a source-tree lint that reads files rather than executing the build. The lint's regex parsing is guarded by a self-check test that compares parsed arm keys against the enum variants, so a future refactor of lib.rs that breaks the regex fails loudly rather than silently passing.

Other factors

I previously flagged the HtmlManifest exclusion in notPublic. The author responded with a clear rationale (adding it now would leave a member that outlives its last producer once #38621 lands, and the lint could not detect that; leaving it out costs only the metafile kind typing for one narrow case, which was never typed before), updated the lint comment to present tense, and updated the description. That is a reasonable scope decision, not a correctness issue, and the thread is resolved. All other review threads (comment-cop nits, an accidental stray push) are resolved and the diff is back to the described 9 files. The bug-hunting pass found nothing this run. The change is self-contained, well-tested (source lint fails on main / passes here; bun-types fixture compiles the corrected comparisons), and low-risk.

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