Skip to content
Development
Skill

/verify

Verify a Bun runtime change by driving the debug binary end-to-end.

From plugin
bun
95k8 skills6 commands
Install
$ npx -y skills add oven-sh/bun --skill verify --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/verify

Context preview

The summary Claude sees to decide when to auto-load this skill.

Verify a Bun runtime change by driving the debug binary end-to-end.

SKILL.md

verify.SKILL.md
name: verify
description: Verify a Bun runtime change by driving the debug binary end-to-end.

Verify a Bun runtime change

Build and drive the debug binary directly — never `bun test`, never import-and-call.

Build

bun bd --version   # builds ./build/debug/bun-debug and prints its version

Drive

For any JS-visible change, run the debug binary with `-e` and observe stdout:

bun bd -e '<repro>'   # builds, then runs; sets BUN_DEBUG_QUIET_LOGS for you

For worker/subprocess-shaped changes, spawn a subprocess (still `-e`) so worker teardown / event-loop-idle paths are exercised. Cross-check against `node -e '<same repro>'` for Node-compat changes.

Gotchas

  • **A `src/js/**` edit can silently not reach the binary.** `bundle-modules`

regenerates `build/<cfg>/codegen/InternalModuleRegistryConstants.h`, but the C++ TU that embeds it is not always recompiled, so the build succeeds while the binary still runs the OLD JS. Gate on the binary, not the build: ask the binary you just built — `bun bd -e 'console.log(<Class>.toString().includes("<new-id>"))'` (or run `./build/<cfg>/bun` directly). Plain `bun` is the system Bun on $PATH and never has your edit, so it answers about the wrong binary. If false, `touch src/jsc/bindings/InternalModuleRegistry.cpp` and rebuild.

  • **Prefix every `bun bd` with `PATH="$HOME/.cargo/bin:$PATH"`** — Homebrew's `rust`

formula shadows the pinned nightly, and `bun bd` dies with `the option 'Z' is only accepted on the nightly compiler`. `bun bd` re-runs cargo on every invocation, so this is needed for follow-up runs too, not just the first build.

  • `BUN_DEBUG_QUIET_LOGS=1` suppresses debug-build log spam.
  • Debug builds print `[cachefs]`/`[sys]` lines to stdout; filter them before diffing

output against `node`.

  • MessagePort's `.on/.off` are added by requiring `worker_threads` — plain `new MessageChannel()` ports only have `addEventListener` until then.
  • The debug+asan build is 10-100× slower than release; large-allocation stress tests can time out locally while passing in CI.
Read more
Ships withbun

Incredibly fast JavaScript runtime, bundler, test runner, and package manager – all in one

Get the whole plugin