Skip to content

v3.2.1 — repair the test suite on Linux and macOS arm64 - #1

Merged
dansupergameprogrammer merged 3 commits into
masterfrom
release/3.2.1
Jul 21, 2026
Merged

v3.2.1 — repair the test suite on Linux and macOS arm64#1
dansupergameprogrammer merged 3 commits into
masterfrom
release/3.2.1

Conversation

@dansupergameprogrammer

Copy link
Copy Markdown
Owner

Two defects shipped inside the v3.2.0 tag. Both were introduced by the 3.2.0 allocation-coverage cells, and both live in tests/test_main.cpp.

git diff v3.2.0..HEAD -- include/ src/ docs/ is empty: the shipped library is byte-identical to 3.2.0. Anyone building against v3.2.0 has correct code. The break affected anyone who ran the test suite off x86 Windows — which the README invites, since it offers the suite as evidence.

macOS arm64 — link failure. The kernel allocation cell referenced DotF32ScalarAvx2 and its siblings without an architecture guard. Those are the x86 reference halves of the AVX2 paths and are compiled out on ARM, so the suite failed to link rather than failing a test. Guarded the same way every other AVX2 reference in the suite is.

Linux — stack buffer overrun. The header-only-math cell declared float decoded[24], sized to dims, and passed it to DequantizeRowAsQuery, which writes targetPaddedDims floats and zeroes the tail — 32 on a 24-dim int8 bank. Eight floats past the end, on every call. glibc's stack protector aborted the suite on both Linux jobs; MSVC and macOS did not detect it. Confirmed under AddressSanitizer, and the buffer is now sized from constexpr PaddedDims so it tracks the contract instead of a literal.

Also folds in the coherence checks for this repository's own CI, which previously ran only in the consuming plugin repo against a vendored copy.

Verified: 84,770 checks / 0 failures locally, and clean under AddressSanitizer on the previously-aborting configuration.

Two defects shipped inside the v3.2.0 tag, both introduced by the
allocation-coverage cells and both in tests/test_main.cpp. The shipped library
(include/, src/) is byte-identical to 3.2.0 -- anyone building against v3.2.0
has correct code; the break bit anyone who RAN the suite off x86 Windows.

- The kernel allocation cell referenced the *ScalarAvx2 mirrors unguarded. They
  compile out on ARM, so the suite failed to link on macos-arm64.
- The header-only-math cell sized its decode buffer to dims where
  DequantizeRowAsQuery writes paddedDims -- an 8-float stack overrun that
  aborted the suite under glibc's stack protector on both Linux jobs.

version.h, its coherence assertion, and the CHANGELOG move to 3.2.1 together.
A README edit was paying for four platforms including a TSan run. A "changes"
job now decides once whether library or build inputs moved, and each build job
gates its steps on that.

Deliberately not paths-ignore: these are required status checks, and a check
skipped by a path filter never reports, so a docs-only PR would wait forever for
a verdict that never arrives. Every job still runs and still reports -- it just
finishes in seconds with nothing to do. The push path fails OPEN (builds
everything) when it cannot determine a base, since over-building is the safe
direction for a filter guarding a test suite.
The edit that added "if: needs.changes.outputs.code" to each build step matched
too broadly and caught the changes job's own checkout. That job has no needs, so
the expression was empty, the checkout was skipped, and the filter step ran with
no working tree: "fatal: not a git repository", exit 128.

The gate belongs only in the four build jobs, each of which declares
needs: changes. Verified: gates appear in those four and nowhere else.
@dansupergameprogrammer
dansupergameprogrammer merged commit e092443 into master Jul 21, 2026
13 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.

2 participants