Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
112 commits
Select commit Hold shift + click to select a range
6e70a8b
test(repro): scaffold cumulative bug-reproduction suite + cross-platf…
DeusData Jun 25, 2026
8423b0b
test(repro): -Itests fix + reproductions for #495, #521, #382
DeusData Jun 25, 2026
463de27
test(repro): make the board robust to RED-test early-return leaks
DeusData Jun 25, 2026
a84c59c
test(repro): cross-file + trace reproductions for #408, #56, #480
DeusData Jun 25, 2026
a8e274c
test(repro): fix harness include + #408 comment; add #571, #523, #546
DeusData Jun 25, 2026
2534f3b
test(repro): crash + trace + gitignore reproductions for #627, #514, …
DeusData Jun 25, 2026
8c35d5e
test(repro): data-loss + watcher reproductions for #557, #520
DeusData Jun 25, 2026
78d1aff
test(repro): Rust trait-method extraction depth for #333
DeusData Jun 25, 2026
ed15d06
test(repro): install/UX reproductions for #570, #409, #431
DeusData Jun 25, 2026
806da45
test(repro): more install/UX + persistence reproductions for #607, #4…
DeusData Jun 25, 2026
8bf892c
test(repro): GLR blowup #471 + opencode PATHEXT guard #221
DeusData Jun 26, 2026
51cc7d8
test(repro): #548 lighter harness, strengthen #56, + 3 NEW bugs
DeusData Jun 26, 2026
895069a
test(repro): fix #471 Windows build (unused-function under -Werror)
DeusData Jun 26, 2026
d2ec388
test(repro): memory-budget #363 + bounded RSS-soak #581
DeusData Jun 26, 2026
c66719a
test(repro): large graph-quality INVARIANT test group
DeusData Jun 26, 2026
23333bc
test(soak): real multi-hour #581 soak (query-leak mode) + fix soak ti…
DeusData Jun 26, 2026
3b3df03
ci(soak): fix soak.yml startup failure — literal timeout-minutes
DeusData Jun 26, 2026
010318e
ci(soak): run #581 soak on ALL platforms incl. Windows
DeusData Jun 26, 2026
b897d5d
test(repro): deep invariant dives — enclosing-func drift, LSP rescue,…
DeusData Jun 26, 2026
64b7a1a
test(repro): invariant lib + per-grammar battery (core compiled/OOP l…
DeusData Jun 26, 2026
daa554b
test(repro): C/C++ LSP-pass invariants (18 resolution strategies)
DeusData Jun 26, 2026
cee59ee
test(smoke): binary-doesn't-fail invariants across all GitHub platforms
DeusData Jun 26, 2026
0b232ba
test(repro): grammar batteries (scripting, functional) + Go/Python LS…
DeusData Jun 26, 2026
d8a7dc2
test(smoke): parse escaped-JSON tool results (index-cli/index-status)
DeusData Jun 26, 2026
b9bd471
test(repro): grammar battery — systems languages
DeusData Jun 26, 2026
648f0d3
test(repro): grammar battery — web/markup/schema languages
DeusData Jun 26, 2026
2128f2b
test(repro): LSP-pass invariants — TS, Java/C#, Kotlin/PHP/Rust
DeusData Jun 26, 2026
9d84202
test(repro): grammar battery — config/data languages
DeusData Jun 26, 2026
720ebc5
test(repro): grammar batteries — build/infra + shells/misc
DeusData Jun 26, 2026
66cf07a
test(repro): grammar batteries — scientific/shaders + markup/docs
DeusData Jun 26, 2026
2f2b377
test(repro): grammar battery — final 15 langs (100% grammar coverage)
DeusData Jun 26, 2026
75fac86
ci: broaden dry-run + release platform matrices (non-gating broad legs)
DeusData Jun 26, 2026
db7660a
fix(extract): enclosing-func detection uses lang_spec function_node_t…
DeusData Jun 26, 2026
9c17b79
fix(discover): skip .claude-worktrees during indexing
DeusData Jun 26, 2026
7e4ec14
test(repro): fix repro_grammar_build.c nested block-comment (-Werror=…
DeusData Jun 26, 2026
054075e
ci: fast single-platform no-ASan repro lane for quick fix iteration
DeusData Jun 26, 2026
ed94b40
ci: per-suite summary in repro runner + lane branches skip the full b…
DeusData Jun 26, 2026
06ea36d
ci: CBM_REPRO_ONLY suite filter + reliable (ASan) fast lane
DeusData Jun 26, 2026
639bac9
fix(mcp): back up corrupt DB instead of silently deleting it (#557)
DeusData Jun 26, 2026
6e6b34a
fix(extract): source calls to the enclosing callable for all grammars
DeusData Jun 26, 2026
f8a7e8b
fix(lsp): join method-dispatch resolutions by bare callee short-name
DeusData Jun 26, 2026
a044a71
fix(extract): def-name + callee extraction for scss/sql/cobol/elm/teal
DeusData Jun 27, 2026
9ebddb7
fix(cypher): LIMIT 0 returns 0 rows instead of all rows
DeusData Jun 27, 2026
6afd42d
fix(extract): def-label + call extraction for graphql/prisma/pony/sma…
DeusData Jun 27, 2026
08f1919
fix(extract): label Pony class-member funcs as Method, not Function
DeusData Jun 27, 2026
ffbf923
fix(extract): def + call extraction for jsonnet/typst/meson
DeusData Jun 27, 2026
c669477
fix(extract): nickel def/call extraction; correct broken callable-sou…
DeusData Jun 27, 2026
d63ba9f
fix(extract): callable-source Lisp/Elixir in-body calls; correct star…
DeusData Jun 27, 2026
8853ed6
fix(extract): callable-source cfml/gotemplate; correct scss/move/qml/…
DeusData Jun 27, 2026
19d34b5
fix(extract): grammar def-label + malformed-QN fixes
DeusData Jun 27, 2026
011c129
fix(repro): resolve markdown/awk/issue471 per maintainer decisions
DeusData Jun 27, 2026
b9b4669
fix(lsp): nested-class enclosing QN + constructor resolution to the c…
DeusData Jun 27, 2026
3f754cf
fix: 17 reproduce-first issue + new-bug fixes (per-case verified)
DeusData Jun 27, 2026
fc1b6cc
fix(lsp): join type-aware method calls (C++ ::/->, Go receiver QN, te…
DeusData Jun 27, 2026
da506f7
fix(grammar): extract calls for 11 niche grammars (HDL/asm/build/proo…
DeusData Jun 27, 2026
7814568
style: clang-format issue-batch additions (cypher/mcp)
DeusData Jun 27, 2026
d97dee0
fix(lsp): per-language emission bugs (C++ in-method caller QN, py sup…
DeusData Jun 27, 2026
554b171
fix(graph): precise Struct label for Rust/Swift/D/Go structs (Option B)
DeusData Jun 27, 2026
ad33c9b
fix(issues): #521 YAML config-URL Route dedup, #523 sequential extern…
DeusData Jun 27, 2026
9cbb1aa
style: clang-format-20 sweep (marathon-touched files)
DeusData Jun 27, 2026
49aab71
fix(lint): clear cppcheck errors gating make-test (NULL-target guard …
DeusData Jun 27, 2026
aff9bfb
fix(test): resolve 18 make-test regressions from the marathon batch
DeusData Jun 27, 2026
b3fdc92
fix(k8s): restore Resource label so the K8s pipeline produces nodes +…
DeusData Jun 27, 2026
0849f28
fix: bulk parallel — Rust cross-crate, Python builtins, #607 reinstal…
DeusData Jun 27, 2026
3ab6ab0
fix(test): rescope rust lsp_macro (external vec! → no-edge) + python-…
DeusData Jun 27, 2026
b3b3a48
fix(fqn): directory-based module QN for Java/Go (de-double) + nested-…
DeusData Jun 27, 2026
e51c935
fix(fqn): keep structural nodes from dir-module QN collision; correct…
DeusData Jun 27, 2026
7b7684b
fix(test): page-size-aware RSS bound for incr_full_index
DeusData Jun 27, 2026
a0420de
fix(lsp): qualify Kotlin LSP caller/callee QNs with module_qn
DeusData Jun 27, 2026
6c2f45d
fix(lsp): emit precise Kotlin constructor + extension call strategies
DeusData Jun 27, 2026
5f1e702
fix(lsp): emit lsp_kt_static for Kotlin object/companion member calls
DeusData Jun 27, 2026
1122265
fix(extract): extract Kotlin operator expressions as calls
DeusData Jun 27, 2026
15e541b
fix(extract): extract Kotlin destructuring + for-in desugared calls
DeusData Jun 27, 2026
6c1dfc9
fix(lsp): emit lsp_kt_lambda_it for calls through the lambda `it`
DeusData Jun 27, 2026
c718d68
fix(lsp): rank Go sole-implementer interface resolution at 0.95
DeusData Jun 27, 2026
b351f76
test(repro): match MCP-envelope escaping in trace_path repros (#480/#…
DeusData Jun 27, 2026
04697c6
fix(pipeline): deny-wins-by-value for infra Route extraction (#521)
DeusData Jun 27, 2026
beaa776
fix(pipeline): emit HTTP_CALLS for external client calls masked by re…
DeusData Jun 28, 2026
bef9ab0
fix(lsp): resolve C/C++ function-pointer calls via the join (#func_ptr)
DeusData Jun 28, 2026
c460807
fix(extract): extract Java method references as calls (#lsp_method_ref)
DeusData Jun 28, 2026
c18e3dc
fix(lsp): resolve Java constructor references via class node + reason…
DeusData Jun 28, 2026
14def05
fix(java-lsp): resolve interface calls to sole concrete impl before t…
DeusData Jun 28, 2026
3b2a291
fix(cs-lsp): emit cs_inherited_method for inherited bare calls and re…
DeusData Jun 28, 2026
9ef37e8
fix(py-lsp): resolve dict-dispatch calls funcs["a"](v) to the dispatc…
DeusData Jun 28, 2026
009b7a8
fix(c-lsp): tag a derived override of an inherited method as lsp_virt…
DeusData Jun 28, 2026
10c17a6
fix(rust-lsp): resolve trait method calls to lsp_trait_dispatch/lsp_t…
DeusData Jun 28, 2026
9b17927
fix(php-lsp): resolve magic __call dispatch to the __call handler
DeusData Jun 28, 2026
f8b3bb0
fix(objc): attribute method-body calls to the method, not the @implem…
DeusData Jun 28, 2026
e986e77
fix(objc): extract top-level C functions so calls to them resolve
DeusData Jun 28, 2026
3f76096
fix(rust): push impl-block class scope so impl-method calls source to…
DeusData Jun 28, 2026
e01e77f
fix(dart): attribute in-body calls to the enclosing function (signatu…
DeusData Jun 28, 2026
f89e0c9
test(nix): correct enclosing-parity fixture — wrap the call so no top…
DeusData Jun 28, 2026
5bb745b
fix(julia): recognize short-form 'f(x) = body' (assignment with call …
DeusData Jun 28, 2026
b01c0d2
fix(scss): extract the callee of a @function call so it forms a CALLS…
DeusData Jun 28, 2026
4221316
fix(agda): scope in-body calls to the function (body clause vs type s…
DeusData Jun 28, 2026
8e332bc
fix(purescript): extract exp_apply callees so function applications f…
DeusData Jun 28, 2026
147ad87
test: disable rare-language grammar repros with documented grammar/li…
DeusData Jun 28, 2026
f33e277
fix(cpp): synthesize a textual call for overloaded binary operators (…
DeusData Jun 28, 2026
5b60045
fix(cpp): resolve implicit destructor, copy-ctor, and conversion-oper…
DeusData Jun 28, 2026
e1bf7cc
fix(cpp): namespace-qualified QNs so ADL and namespace lookups resolve
DeusData Jun 28, 2026
f473119
fix(cpp): module-qualify out-of-line method caller QN so the LSP resc…
DeusData Jun 28, 2026
77bd8ec
fix(ocaml): attribute in-body calls to the outermost function, not ne…
DeusData Jun 28, 2026
e6a46bd
test(discovery): flip .claude-worktrees skip-dir reproduction to a gr…
DeusData Jun 28, 2026
0366dfe
fix(java): resolve a package-qualified static-import class by short name
DeusData Jun 28, 2026
becccb6
fix(ts): don't emit a JSX-import resolution for an unresolved relativ…
DeusData Jun 28, 2026
002b643
test: park 14 hard-tail LSP/FQN repros as documented skips for release
DeusData Jun 28, 2026
81548d2
style: fix two pre-existing clang-format violations for release lint
DeusData Jun 28, 2026
0731052
test(incremental): apply the ARM RSS budget by architecture, not page…
DeusData Jun 28, 2026
8276afc
ci(test): build windows-11-arm with the native ARM64 toolchain (CLANG…
DeusData Jun 28, 2026
d30bccd
fix(compat): include stdlib.h so getenv/_putenv_s compile on native A…
DeusData Jun 28, 2026
60eedf1
ci(test): run native ARM64 Windows without ASan (unavailable for win-…
DeusData Jun 28, 2026
fd412d0
ci: raise heavy-job timeouts to 4h (ARM + ASan exceeds 60m)
DeusData Jun 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/_build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
# release with no Intel macOS binary (a user-reported gap). macos-15-intel
# is GitHub's supported Intel image through Aug 2027 (the last x86_64 macOS
# runner); revisit the Intel leg before that retirement.
timeout-minutes: 25
timeout-minutes: 240
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

Expand Down Expand Up @@ -120,7 +120,7 @@ jobs:

build-windows:
runs-on: windows-latest
timeout-minutes: 25
timeout-minutes: 240
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

Expand Down Expand Up @@ -195,7 +195,7 @@ jobs:
- arch: arm64
runner: ubuntu-24.04-arm
runs-on: ${{ matrix.runner }}
timeout-minutes: 25
timeout-minutes: 240
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/_security.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ jobs:

license-gate:
runs-on: ubuntu-latest
timeout-minutes: 30
timeout-minutes: 240
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Install ScanCode Toolkit
Expand All @@ -40,7 +40,7 @@ jobs:

codeql-gate:
runs-on: ubuntu-latest
timeout-minutes: 50
timeout-minutes: 240
steps:
- name: Wait for CodeQL on current commit (max 45 min)
env:
Expand Down
99 changes: 73 additions & 26 deletions .github/workflows/_smoke.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,81 @@
name: Smoke

on:
workflow_call: {}
workflow_call:
inputs:
broad_platforms:
description: 'Smoke the shipped binaries on the broad platform matrix (extra OS versions) instead of the core set'
type: boolean
default: false

permissions:
contents: read

jobs:
# Emit the platform matrices as JSON. The CORE set is the default (fast,
# unchanged); the BROAD set adds extra free runners (additional OS versions)
# that download the SAME shipped artifact for their goos/goarch and verify it
# runs on a wider range of OS versions. No new artifacts are built — broad
# legs reuse the exact binaries produced by _build.yml.
setup-matrix:
runs-on: ubuntu-latest
timeout-minutes: 5
outputs:
unix: ${{ steps.set.outputs.unix }}
windows: ${{ steps.set.outputs.windows }}
portable: ${{ steps.set.outputs.portable }}
steps:
- name: Compute matrices
id: set
env:
BROAD: ${{ inputs.broad_platforms }}
run: |
CORE_UNIX='[
{"os":"ubuntu-latest","goos":"linux","goarch":"amd64"},
{"os":"ubuntu-24.04-arm","goos":"linux","goarch":"arm64"},
{"os":"macos-14","goos":"darwin","goarch":"arm64"},
{"os":"macos-15-intel","goos":"darwin","goarch":"amd64"}
]'
# Broad legs reuse existing goos/goarch artifacts on newer/older OS
# versions (e.g. ubuntu-22.04 = older glibc) to widen the run-anywhere
# signal without building new targets.
BROAD_UNIX='[
{"os":"ubuntu-22.04","goos":"linux","goarch":"amd64","optional":true},
{"os":"ubuntu-22.04-arm","goos":"linux","goarch":"arm64","optional":true},
{"os":"macos-15","goos":"darwin","goarch":"arm64","optional":true}
]'
CORE_WIN='[{"os":"windows-latest"}]'
# windows-11-arm runs the shipped x86_64 binary under emulation —
# verifies the Windows artifact still launches on ARM hardware.
BROAD_WIN='[{"os":"windows-2025","optional":true},{"os":"windows-11-arm","optional":true}]'
CORE_PORTABLE='[
{"arch":"amd64","runner":"ubuntu-latest"},
{"arch":"arm64","runner":"ubuntu-24.04-arm"}
]'
BROAD_PORTABLE='[
{"arch":"amd64","runner":"ubuntu-22.04","optional":true},
{"arch":"arm64","runner":"ubuntu-22.04-arm","optional":true}
]'
if [ "$BROAD" = "true" ]; then
UNIX=$(jq -cn --argjson a "$CORE_UNIX" --argjson b "$BROAD_UNIX" '$a + $b')
WIN=$(jq -cn --argjson a "$CORE_WIN" --argjson b "$BROAD_WIN" '$a + $b')
PORTABLE=$(jq -cn --argjson a "$CORE_PORTABLE" --argjson b "$BROAD_PORTABLE" '$a + $b')
else
UNIX=$(jq -cn --argjson a "$CORE_UNIX" '$a')
WIN=$(jq -cn --argjson a "$CORE_WIN" '$a')
PORTABLE=$(jq -cn --argjson a "$CORE_PORTABLE" '$a')
fi
echo "unix={\"variant\":[\"standard\",\"ui\"],\"include\":$UNIX}" >> "$GITHUB_OUTPUT"
echo "windows={\"variant\":[\"standard\",\"ui\"],\"include\":$WIN}" >> "$GITHUB_OUTPUT"
echo "portable={\"variant\":[\"standard\",\"ui\"],\"include\":$PORTABLE}" >> "$GITHUB_OUTPUT"

smoke-unix:
needs: setup-matrix
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
goos: linux
goarch: amd64
- os: ubuntu-24.04-arm
goos: linux
goarch: arm64
- os: macos-14
goos: darwin
goarch: arm64
- os: macos-15-intel
goos: darwin
goarch: amd64
variant: [standard, ui]
matrix: ${{ fromJSON(needs.setup-matrix.outputs.unix) }}
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.optional == true }}
timeout-minutes: 15
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
Expand Down Expand Up @@ -98,11 +148,12 @@ jobs:
clamscan --no-summary ./codebase-memory-mcp

smoke-windows:
needs: setup-matrix
strategy:
fail-fast: false
matrix:
variant: [standard, ui]
runs-on: windows-latest
matrix: ${{ fromJSON(needs.setup-matrix.outputs.windows) }}
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.optional == true }}
timeout-minutes: 15
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
Expand Down Expand Up @@ -164,16 +215,12 @@ jobs:
Write-Host "=== Windows Defender: clean ==="

smoke-linux-portable:
needs: setup-matrix
strategy:
fail-fast: false
matrix:
include:
- arch: amd64
runner: ubuntu-latest
- arch: arm64
runner: ubuntu-24.04-arm
variant: [standard, ui]
matrix: ${{ fromJSON(needs.setup-matrix.outputs.portable) }}
runs-on: ${{ matrix.runner }}
continue-on-error: ${{ matrix.optional == true }}
timeout-minutes: 15
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
Expand Down
24 changes: 20 additions & 4 deletions .github/workflows/_soak.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,12 @@ jobs:
cc: cc
cxx: c++
runs-on: ${{ matrix.os }}
timeout-minutes: 30
# BUG FIX: this was hard-coded to 30, but the caller (nightly-soak.yml)
# passes duration_minutes: 240. GitHub killed the job at 30 min, so the
# "4h nightly soak" was SILENTLY TRUNCATED to 30 min and never once ran
# multi-hour. Budget must always exceed the passed duration; 300 covers
# the 240-min nightly with headroom (build + analysis + idle phases).
timeout-minutes: 300
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Install deps (Linux)
Expand All @@ -67,7 +72,10 @@ jobs:

soak-quick-windows:
runs-on: windows-latest
timeout-minutes: 30
# BUG FIX (same 30→240 mismatch as soak-quick above): the caller passes
# duration_minutes: 240, so a 30-min cap truncated the nightly soak here
# too. 300 covers the 240-min nightly with headroom.
timeout-minutes: 300
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
Expand Down Expand Up @@ -125,7 +133,12 @@ jobs:
cc: cc
cxx: c++
runs-on: ${{ matrix.os }}
timeout-minutes: 45
# ASan soak runs a FIXED 15-min soak (hard-coded below, NOT driven by
# inputs.duration_minutes), but the ASan-instrumented build is slow and
# leak reporting adds teardown time. 60 keeps the budget comfortably above
# the 15-min run so it is never truncated. (Same class of bug as the
# soak-quick 30→240 mismatch above — keep the timeout above the run length.)
timeout-minutes: 240
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- name: Install deps (Linux)
Expand All @@ -150,7 +163,10 @@ jobs:
soak-asan-windows:
if: ${{ inputs.run_asan }}
runs-on: windows-latest
timeout-minutes: 45
# FIXED 15-min soak (hard-coded below). MSYS2/Wine + ASan build is the
# slowest path; 60 keeps the budget well above the run length so it is
# never truncated.
timeout-minutes: 240
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
Expand Down
97 changes: 75 additions & 22 deletions .github/workflows/_test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,30 +8,72 @@ on:
description: 'Skip incremental perf tests (phases 2-7)'
type: boolean
default: true
broad_platforms:
description: 'Test the broad platform matrix (older glibc + extra OS versions) instead of the core set'
type: boolean
default: false

permissions:
contents: read

jobs:
# Emit the platform matrices as JSON. The CORE set is the default (fast,
# unchanged); the BROAD set adds extra free runners (older glibc /
# additional OS versions) for a wider "does it build everywhere" picture.
setup-matrix:
runs-on: ubuntu-latest
timeout-minutes: 5
outputs:
unix: ${{ steps.set.outputs.unix }}
windows: ${{ steps.set.outputs.windows }}
steps:
- name: Compute matrices
id: set
env:
BROAD: ${{ inputs.broad_platforms }}
run: |
CORE_UNIX='[
{"os":"ubuntu-latest","cc":"gcc","cxx":"g++"},
{"os":"ubuntu-24.04-arm","cc":"gcc","cxx":"g++"},
{"os":"macos-14","cc":"cc","cxx":"c++"},
{"os":"macos-15-intel","cc":"cc","cxx":"c++"}
]'
BROAD_UNIX='[
{"os":"ubuntu-22.04","cc":"gcc","cxx":"g++","optional":true},
{"os":"ubuntu-22.04-arm","cc":"gcc","cxx":"g++","optional":true},
{"os":"macos-15","cc":"cc","cxx":"c++","optional":true}
]'
# Each Windows leg pins the msys2 environment + package arch to the
# RUNNER architecture so the build is native, never emulated:
# x86-64 runners -> CLANG64 (mingw-w64-clang-x86_64-*)
# ARM64 runner -> CLANGARM64 (mingw-w64-clang-aarch64-*)
# windows-11-arm previously used the x86-64 CLANG64 toolchain, so its
# binary ran under Windows-on-ARM x86-64 emulation and ASan's function
# interception crashed (interception_win: unhandled instruction). With
# the native ARM64 toolchain ASan instruments native ARM64 code, so it
# is a real (non-optional) gate, not a tolerated emulated-flake.
CORE_WIN='[{"os":"windows-latest","msystem":"CLANG64","pkg":"x86_64"}]'
BROAD_WIN='[{"os":"windows-2025","optional":true,"msystem":"CLANG64","pkg":"x86_64"},{"os":"windows-11-arm","msystem":"CLANGARM64","pkg":"aarch64"}]'
if [ "$BROAD" = "true" ]; then
UNIX=$(jq -cn --argjson a "$CORE_UNIX" --argjson b "$BROAD_UNIX" '$a + $b')
WIN=$(jq -cn --argjson a "$CORE_WIN" --argjson b "$BROAD_WIN" '$a + $b')
else
UNIX=$(jq -cn --argjson a "$CORE_UNIX" '$a')
WIN=$(jq -cn --argjson a "$CORE_WIN" '$a')
fi
echo "unix={\"include\":$UNIX}" >> "$GITHUB_OUTPUT"
echo "windows={\"include\":$WIN}" >> "$GITHUB_OUTPUT"

test-unix:
needs: setup-matrix
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
cc: gcc
cxx: g++
- os: ubuntu-24.04-arm
cc: gcc
cxx: g++
- os: macos-14
cc: cc
cxx: c++
- os: macos-15-intel
cc: cc
cxx: c++
matrix: ${{ fromJSON(needs.setup-matrix.outputs.unix) }}
runs-on: ${{ matrix.os }}
timeout-minutes: 60
# Broad-only legs (extra OS versions) are informational: visible but
# non-blocking, so a flaky/less-common runner can't block a release.
continue-on-error: ${{ matrix.optional == true }}
timeout-minutes: 240
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

Expand All @@ -45,24 +87,35 @@ jobs:
CBM_SKIP_PERF: ${{ inputs.skip_perf && '1' || '' }}

test-windows:
runs-on: windows-latest
timeout-minutes: 60
needs: setup-matrix
strategy:
fail-fast: false
matrix: ${{ fromJSON(needs.setup-matrix.outputs.windows) }}
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.optional == true }}
timeout-minutes: 240
steps:
- uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
with:
msystem: CLANG64
msystem: ${{ matrix.msystem }}
path-type: inherit
install: >-
mingw-w64-clang-x86_64-clang
mingw-w64-clang-x86_64-compiler-rt
mingw-w64-clang-x86_64-zlib
mingw-w64-clang-${{ matrix.pkg }}-clang
mingw-w64-clang-${{ matrix.pkg }}-compiler-rt
mingw-w64-clang-${{ matrix.pkg }}-zlib
make
git

- name: Test
shell: msys2 {0}
run: scripts/test.sh CC=clang CXX=clang++
# AddressSanitizer is unavailable on native ARM64 Windows (LLVM ships no
# libclang_rt.asan for aarch64-w64-windows-gnu) and cannot intercept the
# system DLLs under x86-64 emulation either, so windows-11-arm runs the
# native ARM64 build with SANITIZE= (no sanitizer) — still a real
# functional gate. ASan/UBSan coverage comes from the other 9 legs,
# including native-ARM Linux/macOS. x86-64 Windows keeps full sanitizers.
run: scripts/test.sh CC=clang CXX=clang++ ${{ matrix.os == 'windows-11-arm' && 'SANITIZE=' || '' }}
env:
CBM_SKIP_PERF: ${{ inputs.skip_perf && '1' || '' }}
Loading
Loading