Skip to content

Resolve compiled CPU kernels through a fast path - #769

Merged
maleadt merged 3 commits into
mainfrom
mg/launch-allocations
Sep 15, 2026
Merged

maleadt merged 3 commits into
mainfrom
mg/launch-allocations

Conversation

@giordano

Copy link
Copy Markdown
Collaborator

Part 2 of the redo of #766 in this repo

@giordano
giordano added this pull request to stack #770 September 11, 2026 22:25
@giordano
giordano force-pushed the mg/launch-allocations branch from b8c45de to ef359b7 Compare September 11, 2026 22:25
@github-actions

github-actions Bot commented Sep 11, 2026

Copy link
Copy Markdown
Contributor

Benchmark Results

Show table
main 0bafbf5... main / 0bafbf5...
launch/3D static workgroup, dynamic ndrange 0.0386 ± 0.031 ms 0.0374 ± 0.031 ms 1.03 ± 1.2
launch/3D static workgroup, static ndrange 0.0377 ± 0.031 ms 0.0359 ± 0.029 ms 1.05 ± 1.2
launch/dynamic workgroup, dynamic ndrange 0.0364 ± 0.029 ms 0.0346 ± 0.026 ms 1.05 ± 1.2
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 0.0357 ± 0.031 ms 0.0362 ± 0.032 ms 0.986 ± 1.2
launch/static workgroup, dynamic ndrange 0.0366 ± 0.031 ms 0.0369 ± 0.031 ms 0.991 ± 1.2
launch/static workgroup, static ndrange 0.0365 ± 0.031 ms 0.0365 ± 0.03 ms 0.999 ± 1.2
partition/dynamic workgroup, dynamic ndrange 0.0587 ± 0.0012 μs 0.0727 ± 0.0029 μs 0.807 ± 0.037
partition/static workgroup, dynamic ndrange 0.07 ± 0.012 μs 0.0745 ± 0.012 μs 0.939 ± 0.22
partition/static workgroup, static ndrange 1.56 ± 0.92 ns 2.48 ± 0.001 ns 0.632 ± 0.37
saxpy/default/Float16/1024 0.0642 ± 0.029 ms 0.0558 ± 0.029 ms 1.15 ± 0.8
saxpy/default/Float16/1048576 0.776 ± 0.028 ms 0.765 ± 0.029 ms 1.01 ± 0.053
saxpy/default/Float16/16384 0.0578 ± 0.029 ms 0.0556 ± 0.022 ms 1.04 ± 0.67
saxpy/default/Float16/2048 0.0684 ± 0.026 ms 0.0679 ± 0.026 ms 1.01 ± 0.55
saxpy/default/Float16/256 0.0407 ± 0.032 ms 0.0392 ± 0.03 ms 1.04 ± 1.1
saxpy/default/Float16/262144 0.237 ± 0.03 ms 0.235 ± 0.029 ms 1.01 ± 0.18
saxpy/default/Float16/32768 0.0687 ± 0.028 ms 0.0672 ± 0.019 ms 1.02 ± 0.5
saxpy/default/Float16/4096 0.0617 ± 0.03 ms 0.0559 ± 0.029 ms 1.1 ± 0.79
saxpy/default/Float16/512 0.0427 ± 0.031 ms 0.0408 ± 0.029 ms 1.05 ± 1.1
saxpy/default/Float16/64 0.0394 ± 0.032 ms 0.0358 ± 0.025 ms 1.1 ± 1.2
saxpy/default/Float16/65536 0.091 ± 0.025 ms 0.0886 ± 0.013 ms 1.03 ± 0.32
saxpy/default/Float32/1024 0.0662 ± 0.03 ms 0.0626 ± 0.03 ms 1.06 ± 0.7
saxpy/default/Float32/1048576 0.503 ± 0.038 ms 0.474 ± 0.028 ms 1.06 ± 0.1
saxpy/default/Float32/16384 0.0529 ± 0.027 ms 0.0508 ± 0.023 ms 1.04 ± 0.72
saxpy/default/Float32/2048 0.0611 ± 0.028 ms 0.0601 ± 0.029 ms 1.02 ± 0.67
saxpy/default/Float32/256 0.0407 ± 0.033 ms 0.0381 ± 0.029 ms 1.07 ± 1.2
saxpy/default/Float32/262144 0.164 ± 0.028 ms 0.158 ± 0.027 ms 1.04 ± 0.25
saxpy/default/Float32/32768 0.0595 ± 0.028 ms 0.058 ± 0.026 ms 1.03 ± 0.66
saxpy/default/Float32/4096 0.051 ± 0.027 ms 0.0482 ± 0.027 ms 1.06 ± 0.81
saxpy/default/Float32/512 0.0452 ± 0.033 ms 0.0405 ± 0.032 ms 1.11 ± 1.2
saxpy/default/Float32/64 0.0412 ± 0.033 ms 0.0352 ± 0.024 ms 1.17 ± 1.2
saxpy/default/Float32/65536 0.0745 ± 0.028 ms 0.0715 ± 0.027 ms 1.04 ± 0.55
saxpy/default/Float64/1024 0.0636 ± 0.031 ms 0.0492 ± 0.031 ms 1.29 ± 1
saxpy/default/Float64/1048576 0.546 ± 0.072 ms 0.528 ± 0.079 ms 1.03 ± 0.21
saxpy/default/Float64/16384 0.0502 ± 0.021 ms 0.0495 ± 0.015 ms 1.01 ± 0.53
saxpy/default/Float64/2048 0.0493 ± 0.03 ms 0.0549 ± 0.03 ms 0.897 ± 0.74
saxpy/default/Float64/256 0.0402 ± 0.032 ms 0.0381 ± 0.03 ms 1.05 ± 1.2
saxpy/default/Float64/262144 0.178 ± 0.032 ms 0.17 ± 0.032 ms 1.05 ± 0.27
saxpy/default/Float64/32768 0.0621 ± 0.026 ms 0.0601 ± 0.024 ms 1.03 ± 0.6
saxpy/default/Float64/4096 0.0543 ± 0.026 ms 0.048 ± 0.026 ms 1.13 ± 0.81
saxpy/default/Float64/512 0.0442 ± 0.033 ms 0.0399 ± 0.031 ms 1.11 ± 1.2
saxpy/default/Float64/64 0.0369 ± 0.028 ms 0.0361 ± 0.028 ms 1.02 ± 1.1
saxpy/default/Float64/65536 0.0789 ± 0.027 ms 0.0762 ± 0.026 ms 1.04 ± 0.49
saxpy/static workgroup=(1024,)/Float16/1024 0.062 ± 0.028 ms 0.0447 ± 0.027 ms 1.39 ± 1.1
saxpy/static workgroup=(1024,)/Float16/1048576 0.777 ± 0.03 ms 0.764 ± 0.028 ms 1.02 ± 0.054
saxpy/static workgroup=(1024,)/Float16/16384 0.0552 ± 0.029 ms 0.0527 ± 0.026 ms 1.05 ± 0.74
saxpy/static workgroup=(1024,)/Float16/2048 0.0659 ± 0.027 ms 0.0644 ± 0.027 ms 1.02 ± 0.59
saxpy/static workgroup=(1024,)/Float16/256 0.0414 ± 0.027 ms 0.0399 ± 0.026 ms 1.04 ± 0.95
saxpy/static workgroup=(1024,)/Float16/262144 0.235 ± 0.031 ms 0.223 ± 0.028 ms 1.06 ± 0.19
saxpy/static workgroup=(1024,)/Float16/32768 0.0656 ± 0.027 ms 0.0636 ± 0.019 ms 1.03 ± 0.53
saxpy/static workgroup=(1024,)/Float16/4096 0.0484 ± 0.029 ms 0.0473 ± 0.029 ms 1.02 ± 0.88
saxpy/static workgroup=(1024,)/Float16/512 0.043 ± 0.027 ms 0.0404 ± 0.026 ms 1.06 ± 0.95
saxpy/static workgroup=(1024,)/Float16/64 0.0405 ± 0.028 ms 0.0391 ± 0.028 ms 1.04 ± 1
saxpy/static workgroup=(1024,)/Float16/65536 0.0877 ± 0.025 ms 0.0849 ± 0.012 ms 1.03 ± 0.32
saxpy/static workgroup=(1024,)/Float32/1024 0.0604 ± 0.028 ms 0.0555 ± 0.028 ms 1.09 ± 0.76
saxpy/static workgroup=(1024,)/Float32/1048576 0.48 ± 0.022 ms 0.467 ± 0.023 ms 1.03 ± 0.07
saxpy/static workgroup=(1024,)/Float32/16384 0.0486 ± 0.024 ms 0.0475 ± 0.02 ms 1.02 ± 0.67
saxpy/static workgroup=(1024,)/Float32/2048 0.055 ± 0.028 ms 0.0544 ± 0.028 ms 1.01 ± 0.73
saxpy/static workgroup=(1024,)/Float32/256 0.0413 ± 0.027 ms 0.0397 ± 0.026 ms 1.04 ± 0.95
saxpy/static workgroup=(1024,)/Float32/262144 0.159 ± 0.028 ms 0.151 ± 0.025 ms 1.05 ± 0.26
saxpy/static workgroup=(1024,)/Float32/32768 0.0563 ± 0.025 ms 0.055 ± 0.022 ms 1.02 ± 0.62
saxpy/static workgroup=(1024,)/Float32/4096 0.0459 ± 0.026 ms 0.045 ± 0.025 ms 1.02 ± 0.81
saxpy/static workgroup=(1024,)/Float32/512 0.0445 ± 0.029 ms 0.0412 ± 0.027 ms 1.08 ± 0.99
saxpy/static workgroup=(1024,)/Float32/64 0.0405 ± 0.025 ms 0.0402 ± 0.026 ms 1.01 ± 0.91
saxpy/static workgroup=(1024,)/Float32/65536 0.0691 ± 0.027 ms 0.0679 ± 0.025 ms 1.02 ± 0.55
saxpy/static workgroup=(1024,)/Float64/1024 0.0583 ± 0.031 ms 0.0545 ± 0.029 ms 1.07 ± 0.8
saxpy/static workgroup=(1024,)/Float64/1048576 0.592 ± 0.12 ms 0.539 ± 0.072 ms 1.1 ± 0.27
saxpy/static workgroup=(1024,)/Float64/16384 0.0506 ± 0.026 ms 0.0483 ± 0.02 ms 1.05 ± 0.68
saxpy/static workgroup=(1024,)/Float64/2048 0.0474 ± 0.028 ms 0.0554 ± 0.028 ms 0.856 ± 0.67
saxpy/static workgroup=(1024,)/Float64/256 0.0448 ± 0.027 ms 0.0419 ± 0.026 ms 1.07 ± 0.92
saxpy/static workgroup=(1024,)/Float64/262144 0.18 ± 0.031 ms 0.172 ± 0.032 ms 1.05 ± 0.27
saxpy/static workgroup=(1024,)/Float64/32768 0.0598 ± 0.026 ms 0.0577 ± 0.023 ms 1.04 ± 0.61
saxpy/static workgroup=(1024,)/Float64/4096 0.0497 ± 0.026 ms 0.0449 ± 0.025 ms 1.11 ± 0.84
saxpy/static workgroup=(1024,)/Float64/512 0.0499 ± 0.029 ms 0.0411 ± 0.027 ms 1.21 ± 1.1
saxpy/static workgroup=(1024,)/Float64/64 0.042 ± 0.027 ms 0.0403 ± 0.026 ms 1.04 ± 0.95
saxpy/static workgroup=(1024,)/Float64/65536 0.0769 ± 0.027 ms 0.0757 ± 0.025 ms 1.02 ± 0.49
time_to_load 0.763 ± 0.00024 s 0.776 ± 0.035 s 0.984 ± 0.045
main 0bafbf5... main / 0bafbf5...
launch/3D static workgroup, dynamic ndrange 7 allocs: 0.297 kB 5 allocs: 0.141 kB 2.11
launch/3D static workgroup, static ndrange 8 allocs: 0.328 kB 6 allocs: 0.172 kB 1.91
launch/dynamic workgroup, dynamic ndrange 17 allocs: 0.469 kB 15 allocs: 0.312 kB 1.5
launch/dynamic workgroup, dynamic ndrange, workgroupsize given 3 allocs: 0.172 kB 1 allocs: 16 B 11
launch/static workgroup, dynamic ndrange 3 allocs: 0.172 kB 1 allocs: 16 B 11
launch/static workgroup, static ndrange 4 allocs: 0.203 kB 2 allocs: 0.0469 kB 4.33
partition/dynamic workgroup, dynamic ndrange 2 allocs: 0.0625 kB 2 allocs: 0.0625 kB 1
partition/static workgroup, dynamic ndrange 2 allocs: 32 B 2 allocs: 32 B 1
partition/static workgroup, static ndrange 0 allocs: 0 B 0 allocs: 0 B
saxpy/default/Float16/1024 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float16/1048576 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float16/16384 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float16/2048 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float16/256 18 allocs: 0.484 kB 16 allocs: 0.328 kB 1.48
saxpy/default/Float16/262144 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float16/32768 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float16/4096 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float16/512 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float16/64 18 allocs: 0.484 kB 16 allocs: 0.328 kB 1.48
saxpy/default/Float16/65536 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float32/1024 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float32/1048576 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float32/16384 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float32/2048 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float32/256 18 allocs: 0.484 kB 16 allocs: 0.328 kB 1.48
saxpy/default/Float32/262144 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float32/32768 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float32/4096 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float32/512 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float32/64 18 allocs: 0.484 kB 16 allocs: 0.328 kB 1.48
saxpy/default/Float32/65536 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float64/1024 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float64/1048576 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float64/16384 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float64/2048 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float64/256 18 allocs: 0.484 kB 16 allocs: 0.328 kB 1.48
saxpy/default/Float64/262144 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float64/32768 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float64/4096 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float64/512 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/default/Float64/64 18 allocs: 0.484 kB 16 allocs: 0.328 kB 1.48
saxpy/default/Float64/65536 26 allocs: 0.609 kB 24 allocs: 0.453 kB 1.34
saxpy/static workgroup=(1024,)/Float16/1024 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float16/1048576 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float16/16384 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float16/2048 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float16/256 3 allocs: 0.172 kB 1 allocs: 16 B 11
saxpy/static workgroup=(1024,)/Float16/262144 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float16/32768 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float16/4096 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float16/512 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float16/64 3 allocs: 0.172 kB 1 allocs: 16 B 11
saxpy/static workgroup=(1024,)/Float16/65536 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float32/1024 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float32/1048576 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float32/16384 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float32/2048 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float32/256 3 allocs: 0.172 kB 1 allocs: 16 B 11
saxpy/static workgroup=(1024,)/Float32/262144 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float32/32768 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float32/4096 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float32/512 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float32/64 3 allocs: 0.172 kB 1 allocs: 16 B 11
saxpy/static workgroup=(1024,)/Float32/65536 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float64/1024 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float64/1048576 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float64/16384 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float64/2048 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float64/256 3 allocs: 0.172 kB 1 allocs: 16 B 11
saxpy/static workgroup=(1024,)/Float64/262144 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float64/32768 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float64/4096 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float64/512 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
saxpy/static workgroup=(1024,)/Float64/64 3 allocs: 0.172 kB 1 allocs: 16 B 11
saxpy/static workgroup=(1024,)/Float64/65536 6 allocs: 0.219 kB 4 allocs: 0.0625 kB 3.5
time_to_load 0.201 k allocs: 11.8 kB 0.201 k allocs: 11.8 kB 1

Benchmark Plots

A plot of the benchmark results have been uploaded as an artifact to the workflow run for this PR.
Go to "Actions"->"Benchmark a pull request"->[the most recent run]->"Artifacts" (at the bottom).

@giordano
giordano force-pushed the mg/launch-allocations branch from ef359b7 to 15be7fd Compare September 12, 2026 17:30
@codecov

codecov Bot commented Sep 12, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 61.28%. Comparing base (4135768) to head (0bafbf5).
⚠️ Report is 3 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #769      +/-   ##
==========================================
- Coverage   63.73%   61.28%   -2.45%     
==========================================
  Files          23       23              
  Lines        1941     2162     +221     
==========================================
+ Hits         1237     1325      +88     
- Misses        704      837     +133     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Base automatically changed from mg/launch-allocations-p1 to main September 13, 2026 12:21
Every launch went through `clfunction`, which built a compiler config,
looked up the method instance, allocated a `CompilerJob`, queried
GPUCompiler's cache and hashed its way into `_kernel_instances` before
returning the `HostKernel` it had returned last time. Keep the resolved
`HostKernel` per `HostKernel{F, tt}` type together with the world age and
context it was resolved in, and return it directly while no method has
been defined since and the context is unchanged. Reflection (a set
`compile_hook`) and explicit compiler keywords bypass the fast path.

Reading the `compile_hook` scoped value allocates, so it is only read
when a dynamic scope is active. The `Ref` used to find the kernel for the
current context and the `@something` in `compile_or_lookup` are replaced
with plain control flow, which also removes a boxed variable captured by
the `get!` closure.

A warm launch now allocates once, for the event handle.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VHciC8x39gm97sABrSvBkt
@vchuravy
vchuravy force-pushed the mg/launch-allocations branch from 15be7fd to 4cf9918 Compare September 13, 2026 12:21
@vchuravy
vchuravy requested a review from maleadt September 13, 2026 12:28

@maleadt maleadt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This looks questionable. AFAIU, it adds an ad-hoc caching layer over GPUCompiler, for the sake of saving 2 tiny (and thus fast) allocations? That doesn't seem worth it. It's also wrong: _kernel_fastpath is only caching on HostKernel{F,tt}, so distinct callable objects with the same type therefore return the first cached HostKernel, including its stored f.

Avoid duplicating GPUCompiler cache invalidation in a separate fast path. Instead, let compile_or_lookup specialize on the bounded back-end job type so CompilerJob remains allocation-free, and keep the method out of line to avoid duplicating it per kernel.

This also preserves distinct HostKernel instances for same-type callables carrying different state.
@maleadt maleadt self-assigned this Sep 14, 2026
Use a separate recursive helper so a leading Int kernel argument is not interpreted as the argument index.
@maleadt

maleadt commented Sep 14, 2026

Copy link
Copy Markdown
Member

I don't think this needs a secondary cache, just some tweaks on how things are specialized.

@maleadt

maleadt commented Sep 14, 2026

Copy link
Copy Markdown
Member

Benchmarks look good.

@giordano

Copy link
Copy Markdown
Collaborator Author

Is this good to go now? 👀

@maleadt
maleadt merged commit 4745c08 into main Sep 15, 2026
83 of 84 checks passed
@maleadt
maleadt deleted the mg/launch-allocations branch September 15, 2026 09:57
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