Commit Graph

229 Commits

Author SHA1 Message Date
Martin Vogel 978baaa2f7 fix(ci): classify large pull requests safely
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-13 02:21:25 +02:00
Martin Vogel fff4761d37 fix(ci): issue labeler no-oped on every issue — (?i) is invalid in JS RegExp
DCO / dco (push) Has been cancelled
github/issue-labeler compiles patterns with JavaScript RegExp, which
rejects PCRE-only inline (?i) groups with SyntaxError: Invalid group, so
the workflow failed before evaluating any rule and no issue ever got an
area label (#764).

Replace the third-party action with first-party actions/github-script:
the same config rules are compiled with the i flag applied centrally
(case-insensitivity preserved), labels stay additive-only via addLabels,
and a pattern that fails to compile now fails the run loudly instead of
silently no-oping. Strip (?i) from all 7 config patterns and document
the line format the workflow parses.

Verified locally: all 7 rules compile and match expected labels across
sample issue texts; the old pattern reproduces the SyntaxError.

Closes #764

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-10 00:03:43 +02:00
Martin Vogel 1a8ff1a08e Merge pull request #890 from dpersek/codex/issue-860-test-tsan
ci: wire the test-tsan target
2026-07-09 17:59:00 +02:00
Martin Vogel 620179fc05 Merge pull request #959 from DeusData/fix/smoke-defender-engine-error
ci(smoke): fail soft when the Windows Defender scan engine can't run
2026-07-09 17:16:10 +02:00
Martin Vogel 2304a4b5e9 chore(ci): attest release artifacts in build workflow
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-08 23:34:10 +02:00
Martin Vogel 1015dd28c7 ci(smoke): fail soft when the Windows Defender scan engine can't run
DCO / dco (push) Has been cancelled
The Defender step treated any non-zero MpCmdRun exit as 'flagged binary!'
and failed the job. But MpCmdRun -Scan returns 2 for a real detection and
0 for clean; any other non-zero means the scan engine itself could not run
(e.g. hr=0x800106ba: the Defender antimalware service is unavailable on the
runner), which is a transient runner-side flake, not a detection. This
false-failed the v0.9.0 release on its first attempt. Only exit 2 now hard-
blocks; an engine failure emits a warning and continues.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-08 15:39:18 +02:00
Martin Vogel 73a636f2a0 fix(smoke): derive arch from CI matrix, not emulated uname (arm64 12a)
DCO / dco (push) Has been cancelled
The persistent windows-11-arm smoke Phase 12a failure was a 404, not a network
error: it requested codebase-memory-mcp-windows-amd64.zip on the arm64 leg. Cause:
DL_ARCH came from `uname -m`, which on windows-11-arm is an emulated x86_64 MSYS2
uname reporting "x86_64" -> wrong (amd64) archive -> 404 (server has arm64). Phase
14 worked because the binary's own detect_arch() is native. Prefer SMOKE_ARCH
(passed from the smoke workflow's matrix.arch) over uname; fall back to uname for
local runs. This is the real cause the earlier curl/proxy/ipv4 attempts masked --
the 404 was swallowed by 2>/dev/null until #905 surfaced it.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-06 09:56:58 +02:00
Martin Vogel 594949d277 fix(smoke): use native mingw curl in windows smoke (arm64 emulation)
DCO / dco (push) Has been cancelled
Root cause of the windows-11-arm smoke Phase 12a failure: the smoke `curl` was
curl-8.20.0 from the base MSYS2 (msys) repo, which on an ARM64 host runs as an
x86_64 binary under emulation, and its networking could not reach the local
http.server -- while every NATIVE ARM64 process did (python's http.server bound
and served, and the product binary's own downloader completed Phase 14's update
from the same 127.0.0.1:18080). Install the native mingw-w64-clang-<arch>-curl so
the smoke curl is native (aarch64 on windows-11-arm), matching python and the
product binary. It takes PATH precedence over the base msys curl in the CLANG*
environments. amd64 gets the native x86_64 curl (already worked, now explicit).
Last red legs in the release dry run.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-06 06:16:23 +02:00
Martin Vogel 47dddf1cdf fix(smoke): pin windows smoke server+URL to IPv4 (arm64 Phase 12a)
DCO / dco (push) Has been cancelled
curl (already installed) failed instantly in smoke Phase 12a on windows-11-arm
while the server was up and the binary's own downloader reached it -- the classic
localhost->::1 (IPv6) resolution: msys2 curl tried IPv6 but python's http.server
was IPv4-only. Bind the server to 127.0.0.1 and use a 127.0.0.1 SMOKE_DOWNLOAD_URL
so both ends are explicit IPv4. amd64 windows is unaffected (already reached via
IPv4). These were the last red legs in the release dry run.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-06 04:26:13 +02:00
Martin Vogel 8248e15e04 fix(smoke): install curl in the windows smoke env (arm64 Phase 12a)
DCO / dco (push) Has been cancelled
The smoke-windows job's msys2 install list omitted curl, relying on an ambient
curl that resolves on CLANG64 (amd64) but not on CLANGARM64 (windows-11-arm).
Phase 12a's `curl` download failed there even though the server was up -- the
binary's own downloader (Phase 14) succeeded against the same server. Install
curl explicitly so both arches use the msys2 curl in the same network namespace
as the local http.server. These were the last two red legs in the release dry
run (everything else -- test, build incl build-windows-arm64, all smoke, and
soak incl soak-quick-windows-arm64 -- is green).

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-06 02:38:12 +02:00
Martin Vogel 4fac943314 ci: green the dry-run smoke gate + ship native windows-arm64
DCO / dco (push) Has been cancelled
Two release-blockers surfaced once #882 made every smoke leg a required gate
(continue-on-error previously masked them):

- smoke-unix ran the *dynamic* linux binary on ubuntu-22.04 / 22.04-arm, where
  it cannot start (it links glibc 2.38+) -> Phase 1 died. Older-glibc coverage
  is the -portable (static) binary's job and is green via the smoke-linux-portable
  broad legs, so drop the impossible dynamic broad legs (keep macOS).
- the ClamAV scan died on every linux leg: apt auto-starts the clamav-freshclam
  daemon which holds the freshclam log lock, so the manual freshclam failed with
  "Failed to lock the log file ... Resource temporarily unavailable". Stop the
  daemon first.

Also add native ARM64 Windows as a first-class release target -- the one platform
we test (windows-11-arm) but never shipped:
- build-windows-arm64 job (CLANGARM64) producing codebase-memory-mcp[-ui]-windows-arm64.zip
- smoke-windows is now arch-aware: windows-11-arm smokes the NATIVE arm64 binary
  instead of the x86_64 binary under emulation
- a native soak-quick-windows-arm64 leg (no sanitizer -- ASan is unavailable on
  native ARM64 Windows)
- arm64 detection in install.ps1

release.yml already publishes windows-arm64 (asset filter + merge-multiple) and
build_update_url/detect_arch already resolve it; npm/pip/install.sh compute arm64
already. scoop/winget/chocolatey per-version manifests are updated at release time.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-06 00:31:40 +02:00
Martin Vogel a50f97c9fb fix(smoke): serve the -portable linux asset from the artifact server
DCO / dco (push) Has been cancelled
The dry-run smoke Phase 14 runs the binary's real `update` command, which on
linux downloads the fully-static "-portable" asset (build_update_url in
src/cli/cli.c appends -portable on linux; _build.yml's build-linux-portable job
ships codebase-memory-mcp[-ui]-linux-<arch>-portable.tar.gz). The smoke artifact
server only served the non-portable name, so `update` 404'd and the config-
refresh assertion failed on every linux smoke leg. The mismatch (the smoke half
of the -portable delivery change) was masked until every smoke leg became a
required gate.

Mirror the tarball under the -portable name on linux (standard and ui) so the
served names match build_update_url; checksums.txt globs *.tar.gz and picks up
the new files. Verified the fixed logic serves the exact name the binary
requests for both variants; the gating smoke Phase 14 is the regression guard.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-05 20:46:05 +02:00
Flipper 14142b33ee fix(win): deliver non-ASCII CLI paths end-to-end (wide argv + CreateProcessW)
Closes #423, #20. A non-ASCII repo path passed to
`codebase-memory-mcp cli index_repository "<json>"` was mangled on Windows, so the
command failed with "repo_path is required" instead of indexing the real directory.
POSIX is unaffected (argv is already UTF-8). Two boundaries had to be fixed:

1. argv read: main() took only the narrow `int main(int argc, char **argv)`, so the
   CRT handed it argv in the active ANSI code page. On Windows main() now rebuilds
   argv from the wide command line (GetCommandLineW + CommandLineToArgvW) and
   converts each element to UTF-8 (cbm_wide_to_utf8).

2. worker spawn: the index supervisor (and the UI index thread) spawned the worker
   via CreateProcessA, which re-interpreted the UTF-8 command line through the ANSI
   code page -- re-mangling the path at the parent->worker boundary even after (1).
   Both spawns now build a wide command line (cbm_utf8_to_wide) and use CreateProcessW.

Without (2) the default (supervisor-enabled) path stayed broken while only the
in-process path worked, so this is the complete end-to-end fix, not just argv.

Promotes tests/windows/test_cli_non_ascii_arg.py from an opt-in known-red to a green
Windows guard (scripts/test-windows.ps1 + the test-windows-guards CI job). The guard
now exercises the DEFAULT supervised path (it drops the suite's CBM_INDEX_SUPERVISOR=0
so it actually crosses the worker-spawn boundary). Verified on native Windows: RED
before the fix, GREEN after (a non-ASCII repo indexes, nodes>0). Also adds -lshell32
explicitly (main.c now uses CommandLineToArgvW) and refreshes RED_TEST_ANALYSIS.md.

Signed-off-by: Flipper <jacobphilipp@ymail.com>
2026-07-05 18:51:23 +02:00
Dustin Persek 22506b9ff9 Merge branch 'main' into codex/issue-860-test-tsan 2026-07-05 12:24:06 -04:00
Dustin Persek 3d5af94773 ci: wire test-tsan target
Signed-off-by: Dustin Persek <dustin.persek@protonmail.com>
2026-07-05 12:18:43 -04:00
Martin Vogel 16cf03fa74 Merge pull request #884 from DeusData/feat/pr-smoke
ci(pr): light smoke on PRs (build prod + smoke, 3 native platforms, path-gated)
2026-07-05 15:46:56 +02:00
Martin Vogel 147c2c1fb9 ci(pr): light smoke on PRs — build prod + smoke on 3 native platforms
PR CI ran tests but never built the binary or smoke-tested it, so built-binary
regressions only surfaced at the release dry run — e.g. the Windows
CreateProcess argv-quoting bug (worker got mangled JSON) slipped all the way to
the release gate.

Add a path-gated light smoke: on PRs that touch product code (src/, internal/,
Makefile.cbm, build.sh, smoke-test.sh, env.sh), build the PRODUCTION binary and
run scripts/smoke-test.sh on ubuntu-latest + macos-14 + windows-latest (native,
reliable — not the flaky broad/emulated legs). Every leg gates. Docs/CI/test PRs
skip it and stay fast (gh pr diff --name-only filter). The full broad/emulated
smoke stays in the release dry run.

SMOKE_DOWNLOAD_URL is intentionally unset so smoke-test.sh's download/update
phases self-skip; the core index/search/trace phases (which catch the
CreateProcess class) still run. ci-ok now treats skipped as OK so PRs that skip
smoke still pass.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-05 14:00:23 +02:00
Martin Vogel d39d9b6d3b ci(smoke): make every smoke leg a required gate + fix matrix collapse
DCO / dco (push) Has been cancelled
Two defects let the release dry run report green despite real smoke failures:

1. Matrix collapse — the smoke matrices used {variant:[standard,ui],
   include:$OS_LIST}. GitHub's include-merge overwrites the variant combos
   last-wins with each OS entry, so only the LAST OS ran (both variants) and the
   earlier ones were silently dropped. In broad mode windows smoke only ran
   windows-11-arm (emulated x86_64), never windows-latest (native); unix only
   macos-15; portable only ubuntu-22.04-arm. Rebuild each matrix as an explicit
   os x variant cartesian so every leg actually runs.

2. Optional escape hatch — the broad legs carried optional:true +
   continue-on-error: matrix.optional, so a failing leg didn't fail _smoke.yml
   and didn't gate the dry run or a release. Removed all optional flags + the
   continue-on-error lines; every product-smoke leg now gates.

smoke-packages stays continue-on-error (external Glama directory image, not the
shipped product). fail-fast:false kept so all legs still run for a full picture.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-05 13:21:56 +02:00
Martin Vogel 0789c6380c ci(test): make the broad dry-run matrix all-required (no optional legs)
DCO / dco (push) Has been cancelled
The release dry run must be all-green on every platform — drop the
optional/continue-on-error flags from the broad matrix legs (ubuntu-22.04,
ubuntu-22.04-arm, macos-15, windows-2025) so a failure on any of them gates
the run. Only affects broad_platforms=true (the dry run); the core PR-CI
matrix is unchanged.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-05 04:14:32 +02:00
Martin Vogel 9ebe206ef5 Merge pull request #864 from DeusData/compliance/license-audit
chore(release): compute grammar count in SBOM + complete non-MIT license summary
2026-07-05 02:41:37 +02:00
Martin Vogel e549b44daf Merge pull request #865 from DeusData/chore/remove-libgit2
chore: drop optional libgit2 dependency (keep git log fallback)
2026-07-05 01:55:17 +02:00
Martin Vogel 2e055d771f chore: drop optional libgit2 dependency, keep git log fallback
DCO / dco (push) Has been cancelled
libgit2 is licensed GPLv2-with-linking-exception, and this project is
deliberately GPL-free (see scripts/license-policy.json). libgit2 was only
an OPTIONAL, faster git-history code path guarded by HAVE_LIBGIT2 and
auto-detected via pkg-config; it always shipped with a popen("git log ...")
fallback that release binaries already used (they were built without
libgit2). Making that popen fallback the SOLE git-history implementation
means there is NO change to shipped behavior.

Changes:
- pass_githistory.c: collapse the HAVE_LIBGIT2 #ifdef so only the popen
  parse_git_log remains; drop the now-unused <git2.h>/<time.h> includes.
- cbm.c / cbm.h / main.c / subprocess.c / index_supervisor.h: remove the
  libgit2 mimalloc allocator bind and its >=1.7.0 version guards; keep the
  tree-sitter + sqlite3 binds; correct the comments.
- Makefile.cbm: remove the optional-libgit2 pkg-config detection block,
  the REQUIRE_LIBGIT2 error gate, and all LIBGIT2 CFLAGS/LIBS/FLAGS.
- .github/workflows/_test.yml: drop the REQUIRE_LIBGIT2 test-matrix leg
  plus its libgit2-dev/pkg-config apt install (lower CI cost, no new
  gating, no trigger change).
- flake.nix: drop libgit2/pkg-config from the dev shell (now-dead dep).

HAVE_LIBGIT2 no longer exists anywhere in the tree.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-05 00:37:59 +02:00
Martin Vogel dbfe5e355d Merge pull request #531 from DeusData/dependabot/github_actions/actions/checkout-7.0.0
build(deps): bump actions/checkout from 6.0.2 to 7.0.0
2026-07-05 00:31:55 +02:00
Martin Vogel cef0768249 Merge pull request #644 from DeusData/dependabot/github_actions/actions/cache-6.1.0
build(deps): bump actions/cache from 5.0.5 to 6.1.0
2026-07-05 00:31:52 +02:00
Martin Vogel d95e686d11 Merge pull request #837 from DeusData/dependabot/github_actions/github/codeql-action/upload-sarif-4.36.3
build(deps): bump github/codeql-action/upload-sarif from 4.36.2 to 4.36.3
2026-07-05 00:31:50 +02:00
Martin Vogel ca126f581b Merge pull request #643 from DeusData/dependabot/github_actions/actions/setup-python-6.3.0
build(deps): bump actions/setup-python from 6.2.0 to 6.3.0
2026-07-05 00:31:47 +02:00
Martin Vogel 14b26c064c Merge pull request #642 from DeusData/dependabot/github_actions/actions/attest-build-provenance-4.1.1
build(deps): bump actions/attest-build-provenance from 4.1.0 to 4.1.1
2026-07-05 00:31:45 +02:00
Martin Vogel 239d99a18a chore(release): compute grammar count in SBOM, complete non-MIT license summary
DCO / dco (push) Has been cancelled
The SBOM hardcoded '158-grammars' for the tree-sitter-grammars aggregate;
the true count is now 159 (Mojo + InterSystems ObjectScript vendored, nim
dropped since the literal was last set), so the shipped SBOM under-counted.
Compute the count from the vendored grammar directories so it cannot drift
again. Also correct the non-MIT summary, which named only clojure CC0-1.0 +
jinja2/just Apache-2.0 while omitting fennel (CC0), the other eight Apache
grammars, fish (Unlicense) and pine/templ (ISC); it now lists the full
non-MIT family set and is explicitly non-exhaustive, deferring to
MANIFEST.md as authoritative. Data-only change to generated sbom.json; no
build or gating behavior changes.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-07-05 00:11:13 +02:00
dependabot[bot] 03862979eb build(deps): bump actions/checkout from 6.0.2 to 7.0.0
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 7.0.0.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v6.0.2...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-04 17:45:56 +00:00
Flipper 0eb2c58913 test(windows): convert fixed reds to green guards, wire CI, rewrite drive test
Rebased onto current main and reworked in response to review. Three of the four
Windows reds were fixed upstream since the branch was cut at b075f05, so they are
now green regression guards; the fourth stays a genuine known-red.

- test_non_ascii_path.py (#636/#357): green guard - fixed by #700 (per-pass
  readers now route through cbm_fopen -> _wfopen). Re-verified green on main.
- test_hook_augment.py (#618): green guard - fixed by #619 (cbm_is_walkable_abs_path
  accepts drive-letter X:/ cwd). Re-verified green on main.
- test_ui_drive_listing.py (#548): rewritten. The fix exposes drives via a new
  roots[] field, not the dirs[] array the old test asserted (which would stay red
  against fixed code). Now asserts every fixed drive is in roots and browsable.
  Re-verified green on main (drives C:/D:/E:).
- test_cli_non_ascii_arg.py (#423/#20): unchanged - main() is still narrow-argv
  with no wide command line, so this remains genuinely red (the keeper).

- scripts/test-windows.ps1: split green guards (gate CI) from opt-in known-reds;
  add -GuardsOnly; run indexing in-process (CBM_INDEX_SUPERVISOR=0) so a guard
  reflects the path/hook/drive fix under test, not the index-worker spawn path.
- .github/workflows/_test.yml: new test-windows-guards job builds the product+UI
  binary (scripts/build.sh --with-ui) and runs the guards with -GuardsOnly so
  #700/#619/#548 stay enforced on Windows CI.
- RED_TEST_ANALYSIS.md: refreshed to record the landed fixes and current status.

Signed-off-by: Flipper <jacobphilipp@ymail.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-04 13:22:41 +02:00
dependabot[bot] 78c54c8ee6 build(deps): bump github/codeql-action/upload-sarif
Bumps [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) from 4.36.2 to 4.36.3.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/github/codeql-action/compare/8aad20d150bbac5944a9f9d289da16a4b0d87c1e...54f647b7e1bb85c95cddabcd46b0c578ec92bc1a)

---
updated-dependencies:
- dependency-name: github/codeql-action/upload-sarif
  dependency-version: 4.36.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-07-04 05:42:55 +00:00
Dustin Persek 87ec7bc464 fix(build): gate libgit2 allocator support
Signed-off-by: Dustin Persek <dustin.persek@protonmail.com>
2026-07-03 18:51:47 -04:00
SS-42 14828822bf fix(ci): query CodeQL runs by head SHA
Signed-off-by: SS-42 <noreply@incogni.to>
2026-07-03 22:35:31 +03:00
Martin Vogel 6c18baea34 docs: make maintainer policy project-oriented
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-29 00:00:10 +02:00
Martin Vogel 6ccf81d841 docs: add maintainer ownership policy
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-28 23:55:29 +02:00
Martin Vogel f7d6d34457 feat(diag): persistent memory trajectory + query-leak CI soak for #581
DCO / dco (push) Has been cancelled
#581 (query-path memory growth) does not reproduce in our soak: a 10-min,
200-file query-only run shows RSS flat-to-shrinking and committed plateauing
(mimalloc already purges on free, purge_delay=0). Rather than ship speculative
mitigations for a leak we cannot measure, this adds the observability to find it
where it actually occurs, plus a continuous guard.

- diag: the diagnostics writer now appends a PERSISTENT NDJSON memory trajectory
  (one sample / 5s: rss, committed, peak fields, page_faults, fd, queries), kept
  on exit (rotates to a .1 generation past 8 MB) so users can send the time
  series post-mortem. The previous latest-snapshot file was overwritten every 5s
  and deleted on stop.
- ci: the soak now also runs a read-only query-leak leg (CBM_SOAK_MODE query-leak,
  no reindex/mutate) on every platform including Windows, so a regression that
  introduces a query-path leak is caught. soak-test.sh RESULTS_DIR is now
  env-overridable so both legs keep separate artifacts.
- docs: README Troubleshooting and Diagnostics section + a bug-report field
  explain the no-telemetry stance and how to capture and share the trajectory.

Build clean; unit suite 5714/0; trajectory verified to persist post-exit.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-28 23:28:01 +02:00
Martin Vogel fd412d0667 ci: raise heavy-job timeouts to 4h (ARM + ASan exceeds 60m)
The ubuntu-24.04-arm test leg (native ARM64 Linux running the full suite under
AddressSanitizer + the FastAPI incremental index) exceeds the 60-minute job
timeout and was killed, failing ci-ok even though the suite was on track to pass.
ARM + ASan is legitimately 2-3x slower than x86-64.

Raise the substantial compute jobs (test, build, bug-repro board, soak's short
legs, security/codeql, cross-platform smoke, fast-repro) to a generous 240-minute
(4h) cap so a slow-but-correct runner can't false-timeout. Trivial aggregator
jobs (5/10/15m: setup-matrix, ci-ok, dco, lint, license-gate, quick smokes) and
the intentional soak caps (300/320m) are unchanged.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-28 17:13:16 +02:00
Martin Vogel 60eedf1b67 ci(test): run native ARM64 Windows without ASan (unavailable for win-arm64)
The native CLANGARM64 toolchain compiles the project fine, but linking the test
build fails: LLVM ships no AddressSanitizer runtime for aarch64-w64-windows-gnu
(libclang_rt.asan_dynamic.dll.a not found). ASan also cannot intercept under
x86-64 emulation, so Windows ARM64 has no working ASan by any toolchain.

Run the windows-11-arm leg with SANITIZE= (no sanitizer) so it builds and runs
the full suite natively as a real, required functional gate. ASan/UBSan coverage
is provided by the other nine legs, including native-ARM Linux/macOS; x86-64
Windows keeps full sanitizers.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-28 15:15:48 +02:00
Martin Vogel 8276afc93f ci(test): build windows-11-arm with the native ARM64 toolchain (CLANGARM64)
windows-11-arm is an ARM64 runner but the test matrix built it with the x86-64
msys2 environment (CLANG64), so the binary ran under Windows-on-ARM x86-64
emulation. AddressSanitizer's function interception cannot patch the emulated
system DLLs there (interception_win: unhandled instruction -> asan_malloc_win.cpp
CHECK failed), crashing in ASan init before any test ran. That was being hidden
behind optional:true.

Pin each Windows leg's msys2 environment + package arch to the RUNNER
architecture: x86-64 runners use CLANG64 (mingw-w64-clang-x86_64-*), the ARM64
runner uses CLANGARM64 (mingw-w64-clang-aarch64-*). The windows-11-arm binary is
now native ARM64, so ASan instruments native code and the leg is a real,
non-optional gate (matching smoke.yml, which already uses CLANGARM64 for it).
Every other matrix leg already used a toolchain matching its runner arch.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-28 14:44:03 +02:00
dependabot[bot] 33322501ab build(deps): bump actions/cache from 5.0.5 to 6.1.0
Bumps [actions/cache](https://github.com/actions/cache) from 5.0.5 to 6.1.0.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/27d5ce7f107fe9357f9df03efb73ab90386fccae...55cc8345863c7cc4c66a329aec7e433d2d1c52a9)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: 6.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-27 05:42:54 +00:00
dependabot[bot] 84e250fd99 build(deps): bump actions/setup-python from 6.2.0 to 6.3.0
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 6.2.0 to 6.3.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/a309ff8b426b58ec0e2a45f0f869d46889d02405...ece7cb06caefa5fff74198d8649806c4678c61a1)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-27 05:42:50 +00:00
dependabot[bot] 022801e75a build(deps): bump actions/attest-build-provenance from 4.1.0 to 4.1.1
Bumps [actions/attest-build-provenance](https://github.com/actions/attest-build-provenance) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/actions/attest-build-provenance/releases)
- [Changelog](https://github.com/actions/attest-build-provenance/blob/main/RELEASE.md)
- [Commits](https://github.com/actions/attest-build-provenance/compare/a2bbfa25375fe432b6a289bc6b6cd05ecd0c4c32...0f67c3f4856b2e3261c31976d6725780e5e4c373)

---
updated-dependencies:
- dependency-name: actions/attest-build-provenance
  dependency-version: 4.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-27 05:42:39 +00:00
Martin Vogel 06ea36d237 ci: CBM_REPRO_ONLY suite filter + reliable (ASan) fast lane
- repro_main: RUN_SUITE honors CBM_REPRO_ONLY (comma list of suite-name
  substrings) for fast targeted validation of a single fix.
- fast-repro.yml: ASan single-platform (the no-sanitizer build crashed some
  suites); single-platform is the speedup vs the 5-platform board.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-26 23:46:19 +02:00
Martin Vogel ed94b40707 ci: per-suite summary in repro runner + lane branches skip the full board
DCO / dco (push) Has been cancelled
Fast Repro / fast (push) Has been cancelled
- repro_main.c: redefine RUN_SUITE to print '[SUITE] <name> P passed, F failed'
  so board/fast-lane output is greppable for which suites still have reds.
- bug-repro.yml: exclude qa/fast-** / qa/soak-** / qa/smoke-** from the board
  push trigger (those branches run only their dedicated lane workflow).

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-26 23:37:18 +02:00
Martin Vogel 054075e290 ci: fast single-platform no-ASan repro lane for quick fix iteration
Avoids waiting ~15min for the full 5-platform ASan board just to see whether a
fix dropped the red count. Pushing a qa/fast-** branch builds+runs test-repro on
ubuntu-latest without sanitizers (~5min). The full bug-repro.yml board stays the
comprehensive all-platform check.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-26 23:31:34 +02:00
Martin Vogel 75fac86b53 ci: broaden dry-run + release platform matrices (non-gating broad legs)
dry-run.yml and release.yml now pass broad_platforms:true to _test.yml + _smoke.yml,
which add (via a dynamic setup-matrix job) ubuntu-22.04 (older glibc / AlmaLinux
class), ubuntu-22.04-arm, macos-15, windows-2025, windows-11-arm on top of the core
set — a broader 'does it run everywhere' picture. The PR gate (pr.yml) and the
shipped release-binary targets (_build.yml) are unchanged. Broad-only legs are
tagged optional + continue-on-error, so a flaky/less-common runner is visible but
never blocks a release.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-26 22:08:01 +02:00
Martin Vogel cee59ee2fd test(smoke): binary-doesn't-fail invariants across all GitHub platforms
- scripts/smoke-invariants.sh: 30-check battery against the PROD binary —
  --version/--help, MCP initialize handshake with stdin OPEN (#513), tools/list
  (all 14), EVERY tool invocable with valid JSON-RPC + no crash, index→non-empty
  graph, malformed-input resilience (bad JSON / empty / huge line / binary /
  non-UTF8 / missing path), clean EOF exit, shared-lib resolution, install
  dry-run. Bounded waits (read -t / timeout), no sleep loops; msys2-safe.
- .github/workflows/smoke.yml: runs it on the WIDEST runner matrix — ubuntu
  22.04+24.04 (x64+arm64; 22.04 = older glibc / AlmaLinux class), macos
  14/15/15-intel, windows 2022/2025 + windows-11-arm (experimental). A FAIL on
  any platform is a binary a user would receive. workflow_dispatch + qa/smoke-**.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-26 13:39:43 +02:00
Martin Vogel 010318e4d5 ci(soak): run #581 soak on ALL platforms incl. Windows
#581 explicitly crashes Windows (50+ GB virtual memory → crash), so Windows is
the most important soak target — the earlier 2-platform cap (ubuntu+macos) missed
exactly where the bug manifests. Expand to the full matrix: linux amd64+arm64,
darwin arm64+amd64, and a windows-latest msys2 job (mirrors _soak.yml's windows
build + .exe binary-path detection). All legs run the query-leak mode, 320-min
budget.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-26 12:59:54 +02:00
Martin Vogel 3b3df03b3d ci(soak): fix soak.yml startup failure — literal timeout-minutes
timeout-minutes is evaluated at workflow setup, where the inputs context is null
on push events; fromJSON(inputs.duration_minutes || '240') + 60 was a startup
failure (0 jobs), so the soak never ran on qa/soak-** either. Use a fixed 320-min
budget (covers the 240-min default soak + build + analysis).

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-26 12:21:21 +02:00
Martin Vogel 23333bc7f3 test(soak): real multi-hour #581 soak (query-leak mode) + fix soak timeout cap
- _soak.yml: timeout-minutes was 30 (soak-quick) / 45 (asan) while nightly passes
  duration_minutes=240 — every 'nightly 4h soak' was silently KILLED at 30 min and
  never ran multi-hour. Raise to 300/60 so the soak can actually complete.
- soak-test.sh: add CBM_SOAK_MODE=query-leak (default unchanged). It indexes once
  then hammers read-only tools (search_graph/query_graph/trace_path/
  get_code_snippet/search_code) with NO reindex/mutation — so index_repository's
  cbm_mem_collect never runs to sweep the query-only leak #581 implicates. The
  existing RSS ceiling/slope/ratio checks become the #581 detector.
- soak.yml: workflow_dispatch (duration_minutes, mode) + push to qa/soak-** ;
  builds the prod binary and runs the soak with timeout = duration + 60, on
  ubuntu + macos. Pushing a qa/soak-* branch starts a real multi-hour run.

Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
2026-06-26 12:15:33 +02:00