Skip to content

bench(integration): port integration benchmarks to CodSpeed (simulation + memory) - #898

Merged
jlucaso1 merged 9 commits into
mainfrom
bench/port-integration-to-codspeed
Jun 18, 2026
Merged

jlucaso1 merged 9 commits into
mainfrom
bench/port-integration-to-codspeed

Conversation

@jlucaso1

@jlucaso1 jlucaso1 commented Jun 18, 2026

Copy link
Copy Markdown
Collaborator

What

Port the integration benchmarks from a custom [[bin]] (wall-clock timing + a
hand-rolled counting allocator, emitting customSmallerIsBetter JSON for
github-action-benchmark) to a divan harness run under cargo codspeed, matching
the model the unit benches already use.

  • New harness tests/bench-integration/benches/integration.rs with a shared
    multi-thread tokio runtime and a connected-and-warmed TestClient pair, both
    built once outside the measured region. Benches: connect_to_ready,
    send_message, send_and_receive, reconnect. Single + x20 coverage is
    preserved via #[divan::bench(args = [1, 20])] looping the op inside the
    measured region.
  • bench-integration becomes bench-only: dropped the [[bin]], the dhat
    dependency / dhat-heap feature / cargo-shear ignore, and the now-unused
    anyhow/wacore/log/serde/serde_json deps; added divan + the
    [[bench]] target; deleted src/main.rs and src/counting_alloc.rs.
  • Added a separate integration-benchmarks job to codspeed.yml (bartender
    service container, mock-server wait, -p bench-integration build,
    MOCK_SERVER_URL/RUST_LOG on the run step). The unit-bench job is untouched.
    Deleted the old bench-integration.yml.

Why

CodSpeed's memory instrument supersedes the custom counting allocator and gives
deterministic memory metrics, simulation instruction counts, and flamegraph
profiling on the dashboard — the same observability the unit benches already get
— while keeping the real async client and external mock server unchanged.

Verification

  • cargo fmt --all -- --check, cargo clippy -p bench-integration --benches -- -D warnings — clean
  • cargo build -p bench-integration --benches, cargo build --workspace --exclude e2e-tests — pass
  • cargo codspeed build -p bench-integration registers the integration suite
  • Both workflow YAMLs parse

Note: the integration benches require the bartender mock server (a CI-only GHCR
image), so the actual run happens in CI under the new integration-benchmarks
job — they are not run locally.

…on + memory)

Replace the custom `[[bin]]` integration benchmark (timing + a hand-rolled
counting allocator, emitting `customSmallerIsBetter` JSON for
github-action-benchmark) with a divan harness run under `cargo codspeed`, the
same model the unit benches already use.

The benches keep the real async client and the external bartender mock server;
only the measurement layer changes. CodSpeed's memory instrument supersedes the
custom counting allocator and adds deterministic memory metrics, simulation
instruction counts, and flamegraph profiling on the dashboard.

- New harness `tests/bench-integration/benches/integration.rs` with a shared
  multi-thread tokio runtime and a connected-and-warmed client pair, both built
  once outside the measured region. Benches: connect_to_ready, send_message,
  send_and_receive, reconnect. The single + x20 coverage is preserved via
  `#[divan::bench(args = [1, 20])]` looping the op inside the measured region.
- `bench-integration` becomes bench-only: drop the `[[bin]]`, the `dhat`
  dependency / `dhat-heap` feature / cargo-shear ignore, and the now-unused
  `anyhow`/`wacore`/`log`/`serde`/`serde_json` deps; add `divan` and the
  `[[bench]]` target. Delete `src/main.rs` and `src/counting_alloc.rs`.
- Add a separate `integration-benchmarks` job to `codspeed.yml` carrying the
  bartender service container, the mock-server wait, a `-p bench-integration`
  build, and `MOCK_SERVER_URL`/`RUST_LOG` on the run step. The unit-bench job is
  left untouched so it stays fast and mock-server-free. Delete the old
  `bench-integration.yml`.

End-to-end runs are CI-only (they need the GHCR bartender image); local
validation covers compile, clippy, and `cargo codspeed build`.
@coderabbitai

coderabbitai Bot commented Jun 18, 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
  • ✅ Review completed - (🔄 Check again to review again)
📝 Walkthrough

Walkthrough

We're killing the homegrown binary benchmark and custom allocator and replacing them with divan integrated into CodSpeed. The old bench-integration.yml workflow is gone. Dependencies are now sane: divan, e2e-tests, env_logger, tokio. Four carefully measured benchmarks reuse warmed client pairs to capture real steady-state behavior without the overhead of custom instrumentation. The new CodSpeed job spins up bartender and runs them. This works because we're using proven tools instead of inventing infrastructure.

Changes

bench-integration migration to divan + CodSpeed

Layer / File(s) Summary
Cargo manifest: dependencies and benchmark target
tests/bench-integration/Cargo.toml
Dependencies trimmed to divan, e2e-tests, env_logger, and tokio with macros, rt-multi-thread, sync, time. Removes the old bloated dependency list. Declares [[bench]] target named integration with harness = false.
divan benchmark suite with shared state
tests/bench-integration/benches/integration.rs
Multithread Tokio OnceLock runtime with recursion limit increase and divan entry point. Pair struct holds two connected TestClients. Two warmed pair singletons: one for sender-only (with background event drain), one for round-trip. Global AtomicU64 generates unique message bodies per iteration to prevent mock-server deduplication. Four benchmarks: connect_to_ready (connect/disconnect baseline), send_message (batches [1, 20], sender-only), send_and_receive (batches [1, 20], round-trip), reconnect (single client reconnect). Replaces deleted src/main.rs and src/counting_alloc.rs.
CodSpeed CI integration
.github/workflows/codspeed.yml (new job)
Adds integration-benchmarks job: starts bartender mock service on port 8080 with CHATSTATE_TTL_SECS=3, waits for HTTPS readiness (~30s), builds bench-integration for simulation and memory, runs cargo codspeed run with MOCK_SERVER_URL=wss://127.0.0.1:8080/ws/chat and RUST_LOG=warn. Removes .github/workflows/bench-integration.yml entirely.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • oxidezap/whatsapp-rust#828: Introduced the CodSpeed and divan integration foundation in .github/workflows/codspeed.yml—this PR extends it with the integration-benchmarks job and divan benchmark implementation.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately describes the main change: porting integration benchmarks from a custom binary approach to CodSpeed with divan harness, covering both simulation and memory profiling.
Description check ✅ Passed The description is comprehensive and directly related to the changeset, explaining the migration from custom benchmarking to CodSpeed, the architectural changes, and the rationale.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
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.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch bench/port-integration-to-codspeed

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

❤️ Share

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

@github-actions

github-actions Bot commented Jun 18, 2026

Copy link
Copy Markdown

📦 Binary size report

Metric main PR Δ
bin size (stripped) 10.59 MiB 10.59 MiB 0
bin .text 8.70 MiB 8.70 MiB 0
bin allocated (text+data+bss) 10.59 MiB 10.59 MiB 0
llvm-lines wacore 639,574 639,574 0
llvm-lines wacore copies 17,666 17,666 0
llvm-lines whatsapp-rust lib 654,850 654,850 0
llvm-lines whatsapp-rust lib copies 20,155 20,155 0
deps crates (Cargo.lock) 347 347 0
.text per crate
Crate main PR Δ
.text whatsapp_rust 1.44 MiB 1.44 MiB 0
.text wacore 517.65 KiB 517.65 KiB 0
.text wacore_binary 156.73 KiB 156.73 KiB 0
.text wacore_libsignal 166.63 KiB 166.63 KiB 0
.text wacore_appstate 36.98 KiB 36.98 KiB 0
.text wacore_noise 27.71 KiB 27.71 KiB 0
.text waproto 876.21 KiB 876.21 KiB 0
.text whatsapp_rust_sqlite_storage 207.48 KiB 207.48 KiB 0
.text whatsapp_rust_tokio_transport 32.49 KiB 32.49 KiB 0
.text whatsapp_rust_ureq_http_client 5.93 KiB 5.93 KiB 0
.text std 1.13 MiB 1.13 MiB 0
.text other deps 4.07 MiB 4.07 MiB 0
Top movers (cargo-bloat attribution)
Crate main PR Δ
regex_automata 3.06 KiB 1.43 KiB -1.63 KiB (-53.27%)

Baseline: b88629b43 (latest main run) · Head: 6816ba168 · Graphs

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: af47f1743c

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread tests/bench-integration/benches/integration.rs Outdated
Comment thread tests/bench-integration/benches/integration.rs 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.

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 @.github/workflows/codspeed.yml:
- Line 75: Replace the `:latest` tag in the bartender service image reference on
line 75 with a specific version tag or SHA256 digest to ensure reproducibility
in CI environments. Instead of using
`ghcr.io/whiskeysockets-devtools/bartender:latest`, pin it to a concrete version
like `ghcr.io/whiskeysockets-devtools/bartender:v1.0.0` or use the full image
digest format with `@sha256:`. Check the GHCR package registry for available
versions of the bartender image and select an appropriate stable version to pin
to.
🪄 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: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 1e7be9e0-ec95-4214-8f59-ae927cca1a1b

📥 Commits

Reviewing files that changed from the base of the PR and between 9c86469 and af47f17.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • .github/workflows/bench-integration.yml
  • .github/workflows/codspeed.yml
  • tests/bench-integration/Cargo.toml
  • tests/bench-integration/benches/integration.rs
  • tests/bench-integration/src/counting_alloc.rs
  • tests/bench-integration/src/main.rs
💤 Files with no reviewable changes (3)
  • .github/workflows/bench-integration.yml
  • tests/bench-integration/src/counting_alloc.rs
  • tests/bench-integration/src/main.rs

Comment thread .github/workflows/codspeed.yml
@codspeed-hq

codspeed-hq Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Merging this PR will not alter performance

✅ 176 untouched benchmarks
🆕 12 new benchmarks

Performance Changes

Mode Benchmark BASE HEAD Efficiency
🆕 Memory connect_to_ready N/A 605.7 KB N/A
🆕 Memory reconnect N/A 86.1 KB N/A
🆕 Memory send_and_receive[1] N/A 13.7 KB N/A
🆕 Memory send_and_receive[20] N/A 65.5 KB N/A
🆕 Memory send_message[1] N/A 12.7 KB N/A
🆕 Memory send_message[20] N/A 64.8 KB N/A
🆕 Simulation connect_to_ready N/A 88.4 ms N/A
🆕 Simulation reconnect N/A 2.4 ms N/A
🆕 Simulation send_and_receive[1] N/A 836.3 µs N/A
🆕 Simulation send_and_receive[20] N/A 5.9 ms N/A
🆕 Simulation send_message[1] N/A 590.7 µs N/A
🆕 Simulation send_message[20] N/A 5.4 ms N/A

Comparing bench/port-integration-to-codspeed (f220ef7) with main (b88629b)

Open in CodSpeed

@cubic-dev-ai cubic-dev-ai 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.

1 issue found across 7 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name=".github/workflows/codspeed.yml">

<violation number="1" location=".github/workflows/codspeed.yml:75">
P2: Pin the mock-server container image to a fixed version tag or digest instead of `:latest` so benchmark runs stay reproducible across CI executions.</violation>
</file>

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread .github/workflows/codspeed.yml
…easured region

The integration job's `cargo codspeed run` discovered no benchmarks
("No benchmarks found for the simulation mode") because
tests/bench-integration is not a workspace default-member, so a bare
run ignores it. Select it explicitly with `-p bench-integration`,
matching the build step.

Also convert connect_to_ready, send_message and send_and_receive to the
Bencher setup-outside pattern (like reconnect already does) so runtime
construction and the pair connect + Signal warmup run before the
measured closure rather than being charged to the first iteration.

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d881a473a9

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread tests/bench-integration/benches/integration.rs 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.

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 `@tests/bench-integration/benches/integration.rs`:
- Around line 120-137: The send_message benchmark function reuses a shared pair
without draining inbound messages received by guard.b, causing accumulated state
to leak across iterations and distort results. After the bencher.bench_local
closure completes, add explicit cleanup to consume any pending inbound events
from guard.b, or alternatively modify the benchmark to create a fresh pair for
each iteration instead of reusing the shared pair() so each sample starts from a
clean state.
🪄 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: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 023c1d48-76d0-40a6-b0ed-86f1cd8f0b9e

📥 Commits

Reviewing files that changed from the base of the PR and between af47f17 and d881a47.

📒 Files selected for processing (2)
  • .github/workflows/codspeed.yml
  • tests/bench-integration/benches/integration.rs

Comment thread tests/bench-integration/benches/integration.rs

@cubic-dev-ai cubic-dev-ai 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.

1 issue found across 2 files (changes from recent commits).

Reply with feedback, questions, or to request a fix.

Re-trigger cubic

Comment thread tests/bench-integration/benches/integration.rs
send_message is sender-only and never drains client b, so its delivered
messages accumulate in b's unbounded event channel. With a single shared
pair, send_and_receive reused it and its measured wait_for_text had to
discard that backlog before seeing its own message — leaking send_message's
iteration count (and divan's run order) into the round-trip result. Give the
sender-only and round-trip benches their own warmed pairs so each bench's
measurement is independent of the other.

@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)
tests/bench-integration/benches/integration.rs (1)

132-149: ⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

send_message still accumulates unbounded receiver backlog across samples.

At Line 132-Line 149, guard.b is never drained/reset, so sender-only runs keep growing queued inbound events. That keeps this benchmark stateful over time and can distort CodSpeed memory/simulation outputs even though cross-benchmark leakage is fixed.

Please add a per-sample cleanup/reset strategy for the sender-only pair outside the measured region (or recycle that pair on a controlled cadence) so each sample starts from a bounded baseline.

🤖 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 `@tests/bench-integration/benches/integration.rs` around lines 132 - 149, The
send_message function has an unbounded receiver backlog that accumulates across
benchmark samples because guard.b is never drained or reset. After the measured
async block in bencher.bench_local completes (but outside the timed region), add
cleanup logic to drain or reset guard.b so that each new sample iteration starts
with a bounded baseline state. This ensures the benchmark remains stateless
across samples and prevents memory/simulation distortion from carryover inbound
events.
🤖 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 `@tests/bench-integration/benches/integration.rs`:
- Around line 132-149: The send_message function has an unbounded receiver
backlog that accumulates across benchmark samples because guard.b is never
drained or reset. After the measured async block in bencher.bench_local
completes (but outside the timed region), add cleanup logic to drain or reset
guard.b so that each new sample iteration starts with a bounded baseline state.
This ensures the benchmark remains stateless across samples and prevents
memory/simulation distortion from carryover inbound events.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: a5a6019e-914f-445f-97b9-ca8af2c27ebe

📥 Commits

Reviewing files that changed from the base of the PR and between d881a47 and a5cb9e6.

📒 Files selected for processing (1)
  • tests/bench-integration/benches/integration.rs

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a5cb9e6f22

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread tests/bench-integration/benches/integration.rs Outdated
…vents

send_message never reads its recipient (client b), so b's unbounded event
channel retained every delivered message and grew across samples, letting
CodSpeed memory/simulation numbers depend on how many sends ran earlier.
Spawn a background task that drains the send pair's receiver (left off the
round-trip pair, which consumes b via wait_for_text) so b stays bounded
without adding work to the measured send.

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6c4affc805

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread tests/bench-integration/benches/integration.rs
claude added 2 commits June 18, 2026 15:23
…n-to-codspeed

# Conflicts:
#	Cargo.lock
#	tests/bench-integration/Cargo.toml
The earlier drain only covered client b's incoming messages, but a also
accrues an Event::Receipt for every delivered DM in its own unread channel —
the same unbounded growth across samples, present on both pairs. Drain a's
channel in the background as well (always, since no bench reads it); b stays
conditional, as the round-trip pair consumes it via wait_for_text.

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a79a75e22f

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread tests/bench-integration/benches/integration.rs Outdated
The measured send closures generated each unique body with format! and
text_msg(), charging two harness String allocations per message to the
memory-mode results. Move that generation into divan's with_inputs setup
(unmeasured) and send the pre-built message by value, so the reported
allocations track the send / round-trip path rather than harness overhead.

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e90c82e536

ℹ️ About Codex in GitHub

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

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

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

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

Comment thread tests/bench-integration/benches/integration.rs Outdated
claude added 2 commits June 18, 2026 15:55
reconnect_and_wait() drains its event channel via try_recv at the start of
the call, inside the measured closure — so a sample paid to clear the late
init-IQ responses left buffered by the previous reconnect, making the result
depend on prior-sample traffic. Drain the channel in divan's with_inputs
setup (unmeasured) so each measured reconnect starts from an empty queue.
The integration benches drive the real client (connect/reconnect handshakes)
against the mock server under Valgrind, so the run step is inherently slow and
variable. Add a 30-minute job timeout so a genuinely stuck run fails fast with
a clear signal instead of hanging CI; a healthy run finishes well under it even
on slow runners.
@jlucaso1
jlucaso1 merged commit 931a5d6 into main Jun 18, 2026
14 checks passed
@jlucaso1
jlucaso1 deleted the bench/port-integration-to-codspeed branch June 18, 2026 16:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants