Skip to content

Node Lookups & CI Hardening - #775

Merged
ashvardanian merged 7 commits into
mainfrom
main-dev
Jul 10, 2026
Merged

Node Lookups & CI Hardening#775
ashvardanian merged 7 commits into
mainfrom
main-dev

Conversation

@ashvardanian

@ashvardanian ashvardanian commented Jul 10, 2026

Copy link
Copy Markdown
Member

Several older failure modes have been validated to be stable now. Thanks to @sergey-v9, @GraDea, @tang-hi, @chakshu-dhannawat, and @desertfury for patches 🤗

Closes #355, #454, #494, #514, #562, #700, #702, #767, #770

sergey-v9 and others added 7 commits May 28, 2026 12:10
Co-authored-by: Sergey Vershinin <4435150+sergey-v9@users.noreply.github.com>
The `build_javascript` job exported `CC=gcc`/`CXX=g++` for every OS. On
Windows `node-gyp` ignores both and builds with MSVC, but NumKong's ISA
probe reads the compiler from `$CC` while still emitting MSVC flag
syntax, so it shells out to `gcc /c /arch:AVX2 ... /nologo`. Every probe
fails, the failures are swallowed, and `nk_probes.h` lands with all 39
`NK_TARGET_*` set to zero.

The addon still builds and passes the test suite -- dynamic dispatch just
has no kernels to choose from -- so the result is a scalar-only binary
shipped to every Windows npm user. Scope the variables to the Linux step
and let the probe fall back to `cl.exe`, which enables Haswell and
Skylake.

Co-authored-by: Evgeniy Peshkov <2716874+GraDea@users.noreply.github.com>
Co-authored-by: Ash Vardanian <1983160+ashvardanian@users.noreply.github.com>
Co-Authored-By: Tang Donghai <72755185+tang-hi@users.noreply.github.com>
`std::hash` is the identity for integers on libstdc++ and libc++. Our open-addressing
tables mask that hash into a power-of-2 slot count and probe linearly until an empty
slot, so consecutive keys land in adjacent slots and coalesce into a single contiguous
run. Insertions and lookups both scan that run end to end, making the whole build
quadratic. Closes #770.

Co-Authored-By: Chakshu Dhannawat <65147507+chakshu-dhannawat@users.noreply.github.com>
Co-Authored-By: Ash Vardanian <1983160+ashvardanian@users.noreply.github.com>
`remove` marks a slot deleted but leaves it populated, so probes walk past it. The
resize decision only counted live entries, and under `remove`+`add` churn the live
count stays flat, so the table never grew and never rehashed. Tombstones accumulated
until no empty slot remained; probes could then no longer terminate, `equal_range`
returned `end()` for a key that was still live, and `remove` took the empty-range
branch reporting nothing removed. The entry became a ghost: `contains` kept finding
it, `remove` silently no-oped, and `size()` drifted above the true live count.

Closes #753

Co-Authored-By: Misha Chichvarin <6496186+desertfury@users.noreply.github.com>
Co-Authored-By: Ash Vardanian <1983160+ashvardanian@users.noreply.github.com>
Closes #702

Co-Authored-By: Tang Donghai <72755185+tang-hi@users.noreply.github.com>
The Python wheel jobs broke because `pip install cibuildwheel` is unpinned
and drifted onto 4.x, which removed the `cpython-freethreading` enable group
(now a hard parse error) and dropped the experimental CPython 3.13t
free-threaded builds entirely. Pin `cibuildwheel~=4.1` so the major version
no longer moves under us, drop the now-unbuildable `313t` matrix entries, and
keep `314t` (3.14+ free-threading builds with no flag in 4.x). Verified build
identifier selection against pyproject.toml with cibuildwheel 4.1.

cibuildwheel 4.x also newly defaults the Windows `repair-wheel-command` to
delvewheel, which bundles the MSVC runtime and fails on win_arm64 (no ARM64
msvcp140.dll to vendor on the runner). Earlier versions ran no Windows repair,
so set it to empty to preserve that behavior.

Refresh the rest of the CI toolchains to current best-practice versions,
prioritising anything at or near end-of-life:

- Node 20 -> 24: Node 20 reached EOL in April 2026; 24 (Krypton) is the
  active LTS and already used by the publish job. package.json `engines`
  floor raised 20 -> 22 (oldest still-maintained LTS).
- .NET 8 -> 10: .NET 10 is the current LTS (Nov 2025). Test project retargeted
  net8.0 -> net10.0 and its stale test deps bumped (Test.Sdk 17.3 -> 18.7,
  xunit 2.4 -> 2.9, runner 2.4 -> 3.1, coverlet 3.1 -> 10.0); C# LangVersion
  10 -> 13. Verified: dotnet build + 41/41 tests pass on net10.
- Go 1.22 -> 1.25: 1.22 is past the two-release support window. Verified
  build + module graph on the go 1.26 toolchain.
- Android NDK r26 -> r27c (27.2.12479018): r27 is the current LTS line.
- Emscripten 3.1.47 -> 6.0.2: the 3.1.x line is long superseded. Verified by
  running the release WASM build locally; produces valid wasm objects.
- Rust edition 2021 -> 2024: stable since Rust 1.85. Verified with a clean
  cargo check.
- Java JUnit 4.13.2 -> JUnit 5 (Jupiter 5.12.2) with useJUnitPlatform();
  Spotless 6.25 -> 8.8 (indentWithSpaces was removed, renamed to
  leadingTabsToSpaces). Assertions reordered to JUnit 5's message-last
  signature. Verified: gradle spotlessCheck + full test suite pass.
- MinGW: unpin the stale 12.2.0 and move to setup-mingw@v3, letting the
  action install the runner's current MinGW-w64 default. The existing DLL
  architecture check still guards the output.
@ashvardanian
ashvardanian merged commit d92b549 into main Jul 10, 2026
29 checks passed
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.

Removing items from the index leaves the index with an inconsistent size...and therefore state

6 participants