QA: reproduce-first bug suite + LSP/grammar extraction fixes (5-platform board green)#667
Merged
Conversation
…orm board Stand up a separate, non-gating reproduce-first suite that holds one RED case per open bug issue (the redness is the deliverable + the regression guard): - tests/repro/ + repro_main.c -> `make test-repro` (its own runner with its own main + counters; deliberately EXCLUDED from ALL_TEST_SRCS so the gating `make test` / ci-ok required check stays green and PRs are not wedged) - repro_extraction.c: first reproduction, #554 -- a C++ out-of-line method's inner CALLS edge must attribute to the class-qualified Method QN, not the Module; ties the call's enclosing_func_qn to the method definition's own qualified_name so a class-qualifier drop (the live root cause) fails it - scripts/repro.sh: build+run the board; a build/link failure fails the job, while expected test redness is reported as the board state (job stays green) - .github/workflows/bug-repro.yml: workflow_dispatch (platform filter) + qa/** push; runs the board on linux x2 / macos x2 / windows so many bug vectors can be reproduced on many platforms at once Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
- Makefile: add -Itests to the test-repro-runner compile so repro files in the tests/repro/ subdir resolve "test_framework.h" (they sit one dir deeper than the existing tests/*.c, which find it relative to their own directory). - #495: cfg-gated twin functions collapse — two mutually-exclusive #[cfg] Rust fns get identical qualified_name and the UNIQUE(project,qualified_name) upsert overwrites one; asserts the twins get distinct QNs. - #521: Route nodes minted from URL string literals in infra/config files (try_upsert_infra_route has no source-vs-config guard); indexes a YAML-only fixture and asserts zero Route nodes. - #382: Java class-level + marker_annotation decorators dropped; asserts @Entity/ @RestController on the class and @OverRide on the method (strengthens the weak existing #382 method-only test). All three assert correct behaviour and are RED on current code. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
A reproduction fails its assertion and returns before cleanup, so LeakSanitizer flagged benign harness leaks on every red store-level test and _exit()'d, swallowing the unflushed summary — repro.sh then misread it as a build failure (Linux only; macOS/Windows have no LSan). Fixes: - repro.sh: export ASAN_OPTIONS=detect_leaks=0 for the board run. Leak-cleanliness is not the board's signal (the RED rows are); the #581 leak bug gets a dedicated RSS-growth test. ASan's real checks (use-after-free, overflow) stay enabled. - repro_main.c: setvbuf(stdout, _IONBF) so the summary + RED rows survive any abnormal _exit (sanitizer or crash). - add tests/repro/repro_harness.h: shared multi-file index + store-query + fork crash-detector helpers (ported from the proven test_lang_contract.c harness) for the cross-file / store-level / crash reproduction waves. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
First users of the shared repro_harness.h (validates the multi-file + MCP-tool harness end to end): - #408: STRONGER than the existing weak test_lang_contract.c guard (which any IMPORTS edge satisfies) — fixture has zero relative imports + no dependencies field, so the only possible IMPORTS edge is the workspace cross-package one packages/b -> @org/a; asserts >=1. - #56: Rust multi-crate workspace; crate_b::run calls crate_a::helper; asserts CALLS >= 2 so an intra-crate edge can't mask the missing cross-crate edge. - #480: precondition asserts CALLS>0 (edges exist), then drives the trace_path MCP tool and asserts the caller appears + the result is not the empty "callers":[] shape — isolating it as a traversal bug, not extraction. All assert correct behaviour; RED on current code (board verifies). Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Build fixes (wave 2 broke on all platforms): - repro_harness.h: include <pipeline/pipeline.h> for cbm_project_name_from_path (-Werror=implicit-function-declaration). - repro_issue408.c: the doc comment contained '["packages/*"]' whose '/*' opened a nested block comment (-Werror=comment); reworded. New reproductions: - #571: cbm_project_name_from_path strips CJK (per-byte [A-Za-z0-9._-] filter rewrites every UTF-8 continuation byte to '-'); a purely-CJK trailing path segment vanishes. Asserts the name is not the ASCII-only truncation. - #523: cross-repo HTTP_CALLS — unindexed-lib guard in pass_calls.c drops the client call before the HTTP_CALLS edge is emitted, so cbm_cross_repo_match returns http_edges==0 for a byte-identical call/route. Asserts >=1. - #546: trace_path splits a symbol duplicated by an ambient .d.ts into two nodes; inbound traversal walks only one, dropping callers by import style. Asserts BOTH the relative-import and alias-import callers appear. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…510 - #627: query_graph crash — integer overflow in cypher.c cross_join_with_rels (node_count^2 * growth overflows int -> tiny malloc -> OOB write) on an OPTIONAL MATCH with an already-bound terminal node. Reproduced in a FORKED child (crash must not kill the runner); asserts the child is not signalled. - #514: trace_path data_flow mode drops argument expressions — cbm_edge_info_t carries no properties_json, so the CALLS-edge arg text never reaches the MCP JSON. Asserts the arg expression appears in the data_flow response. - #510: non-root .gitignore ignored — try_load_nested_gitignore() bails when the walk frame prefix is empty, so a directory's own .gitignore is never loaded when indexing a non-git-root subtree. Drives cbm_discover() directly and asserts an explicitly-ignored file is excluded. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
- #557 (DATA LOSS): resolve_store() in mcp.c unlink()s the user's DB (+wal/+shm) with no backup when cbm_store_check_integrity() returns false — e.g. a project row whose root_path fails the path-shape SQL check. The test plants root_path "826" (from the issue evidence) under a CBM_CACHE_DIR temp dir, calls a tool that routes through resolve_store, and asserts the DB still exists OR a backup was made (RED: it is silently deleted). - #520: detect_changes runs 'git diff', which never lists UNTRACKED new files, so a newly-created file is invisible until a manual re-index. Indexes a git repo, creates an untracked file, calls detect_changes, asserts the new file appears. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
push_nested_class_nodes (extract_defs.c) re-queues only class-like/field/decl children of a trait body — never function_item / function_signature_item — so abstract + default trait methods are dropped from the graph (a major source of the shallow-Rust-index degradation). impl-block methods (separate code path) are extracted, serving as the positive control. Asserts all three trait-body methods appear as defs; RED on current code. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
In-process via cli.h + a temp HOME + the cbm_build_install_plan_json dry-run oracle (no real filesystem mutation of the user's config): - #570 (RED): install_cli_agent_configs hardcodes the Codex hook target to ~/.codex/config.toml and never checks for ~/.codex/hooks.json, so the hook is planned into config.toml even when hooks.json is in use (dual registration). - #409 (GREEN guard): the legacy blocking PreToolUse gate regression is already fixed (cbm_install_hook_gate_script writes the non-blocking hook-augment shim); this guards the upgrade/overwrite scenario no existing test covered. Issue is a candidate to close after reporter retest. - #431 (RED): the VSCode install path computes only Code/User/mcp.json and has no profile-aware API, so Code/User/profiles/<id>/mcp.json is never written; the plan omits the profile path entirely. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…, #434 - #607 (RED, DATA LOSS): cbm_cmd_install prints 'must be rebuilt' then calls cbm_remove_indexes() which unlink()s every .db in the cache and never rebuilds — re-running install destroys the user's index. Asserts the DB survives. - #403 (RED): cbm_should_skip_dir excludes neither Antigravity / Programs / AppData, and the .gitignore path is git-gated, so an IDE install tree is fully indexed. Asserts a sentinel under the install dir is not discovered. - #434 (RED): the incremental dump_and_persist only re-exports the artifact when one already exists and never receives the persistence flag, so persistence=true is silently dropped on first index. Asserts the artifact exists after one index_repository with persistence=true. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
- #471 (RED): deeply-nested ambiguous Perl call chain f(f(f(...))) makes the GLR stack-merge O(n^2) (stack_node_add_link recurses over all shared heads; the #461 recursion-depth cap bounds stack depth, not total iterations). Reproduced in a forked child with alarm(15) at depth 5000; asserts the child is not signal-killed (RED when the quadratic blowup blows the time budget). - #221 (GREEN guard): cbm_find_cli now probes Windows PATHEXT (.exe/.cmd/.bat/.ps1, commit 0485d3f), so opencode is resolvable. Guards that fix on a fake opencode shim placed on PATH. Candidate to close after reporter retest. (#548 held: its agent draft spins up a live HTTP server in a thread to exercise handle_browse; reworking to a lighter harness before adding.) Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
- #548: reworked off the live-HTTP-server draft — calls cbm_is_dir (the exact function handle_browse gates on) with a backslash path + the drive-root parent strrchr logic; no sockets/threads. RED on current code. - #56: was a false-pass (bare-name resolver routed crate_a::helper to the only 'helper' candidate). Added a second local helper to force ambiguity and now assert a CALLS edge whose target QN is in crate_a's namespace. Genuinely RED. NEW bugs found by the discovery sweep (each a RED reproduction, root-cause traced): - repro_new_ts_class_field_arrow: TS class-field arrow methods (handler = () => {}) are never emitted as Method defs and inner calls mis-attribute to the class QN (extract_class_methods + resolve_toplevel_arrow_name ignore public_field_definition). - repro_new_py_tuple_unpack: 'x, y = f()' yields no Variable defs — extract_vars only handles an identifier 'left', not pattern_list. - repro_new_cypher_limit_zero: 'LIMIT 0' returns ALL rows — limit==0 is used as both the unset sentinel and a valid value; three guards check limit>0. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
build_perl_nested_calls is only used in the POSIX fork/alarm branch; on Windows the test body is SKIP_PLATFORM, so the helper was unused and tripped -Werror=unused-function (windows-only board failure). Mark it unused. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
- #363: the cgroup CPU axis was fixed in v0.8.0 (detect_system_linux reads cpu.max/cfs_quota), but there is no user-controllable memory ceiling — cbm_mem_init derives the budget from host/cgroup RAM with no override. Test sets CBM_MEM_BUDGET_MB and asserts cbm_mem_budget honors it; RED because that env knob is not read (mirrors the open ask from the issue thread; note this is the memory-override remainder, adjacent to enhancement #580). - #581: bounded RSS-growth reproduction for the long-running leak — repeats a query op ~150x and asserts current RSS (cbm_mem_rss / /proc/self/statm) stays within 3x of the warmup baseline. Documents flakiness + that a slow per-op leak may not trip the bounded threshold (then a true multi-hour soak is needed). #513 (Windows stdio handshake hang) is NOT reproducible in the unit-test runner: it is Windows-only WaitForSingleObject code in cbm_mcp_server_run. It needs the prod cbm binary built on windows-latest + a stdio-driver test that sends an initialize request, keeps stdin open, and asserts a response before EOF. Deferred as a board extension (documented in private/BUG_REPRO_PLAN.md). Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
A systemic-invariant suite derived from the prior QUALITY_ANALYSIS (only 3.69% of real-repo CALLS edges are Function/Method-sourced; the rest fall back to Module): - repro_invariant_calls: source-position-aware CALLS attribution per language — a call inside a function body must be sourced at Function/Method, never Module. C/C++/Rust/Java/C# RED (Module fallback + LSP-rescue join too strict); Go/Python GREEN guards. - repro_invariant_graph: discovery hygiene (.claude-worktrees must be skipped — RED), FQN same-stem distinctness (api.h vs api.c collide via strip_ext — RED), no-dangling-edges (GREEN integrity guard), Perl enclosing-func parity (func_kinds_for_lang lacks subroutine_declaration_statement — RED). - repro_invariant_breadth: 26-language table asserting in-body calls are callable-sourced (~12 RED incl. r/julia + the known-gap langs, ~14 GREEN guards). Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…meout 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>
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>
#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>
… discovery/FQN Comprehensively reproduce the remaining QUALITY_ANALYSIS gaps: - repro_invariant_enclosing_parity (gap #3): cbm_find_enclosing_func's hardcoded func_kinds_for_lang switch has drifted from lang_specs.function_node_types. Languages absent from the switch whose function nodes aren't in func_kinds_generic silently attribute every in-function call to Module. Full drift table + per-language reproductions (fortran/scss/sql/verilog/julia/nix RED via Module source; commonlisp/emacslisp/dart/cobol RED, some compounded by a callee- extraction gap). - repro_invariant_lsp_rescue (gap #5/#5a): cbm_pipeline_find_lsp_resolution (lsp_resolve.h:65) joins LSP results to tree-sitter calls by EXACT caller_qn==enclosing_func_qn; when tree-sitter says Module, the LSP rescue is discarded. C++ out-of-line fixture asserts the edge is LSP-callable-sourced AND that properties_json preserves the lsp_* strategy/confidence (both RED today). - repro_invariant_discovery_fqn (gaps #1,#4): comprehensive 50+ skip-dir table (.claude-worktrees RED, the rest GREEN guards) + 6 FQN same-stem collision cases (api.h/api.c + svc.h/svc.cpp RED; cross-dir/.d.ts/cross-package GREEN guards). Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…angs) Foundation for the exhaustive all-grammar/all-LSP invariant suite: - repro_invariant_lib.h: shared invariant helpers (extract-clean, label-valid, fqn-wellformed, range-valid, callable-sourcing split, dangling-edge count, lsp-strategy presence, target-QN-suffix). - repro_grammar_core.c: full invariant battery for C/C++/CUDA/Rust/Go/Java/C#/ Kotlin/Scala/Swift/ObjC/D — one TEST per language asserting extract-clean + valid labels/FQNs/ranges + defs-present + calls-extracted + callable-sourcing (Module-sourced==0) + no-dangling. Callable-sourcing reds are the known gap. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Per-pass resolution contract for the C/C++ hybrid LSP: one fixture per lsp_* strategy c_lsp.c emits (lsp_direct, implicit_this, scoped, type/virtual/base/ smart_ptr dispatch, template[_instantiation], func_ptr, dll_resolve, operator, constructor/destructor/copy_constructor, conversion, adl, unresolved). Each asserts the inner call is callable-sourced AND properties_json carries that strategy. Ties to repro_invariant_lsp_rescue (the exact-QN join can suppress a correctly-emitted strategy). Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
- 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>
…P passes - repro_grammar_scripting: Python/Ruby/PHP/JS/TS/TSX/Lua/Perl/R/Julia/Groovy/Dart full invariant battery (Perl/R/Julia/Groovy/Dart callable-sourcing RED). - repro_grammar_functional: Haskell/OCaml/F#/Elixir/Erlang/Elm/Clojure/Scheme/ Racket/CommonLisp/EmacsLisp/Lean/Gleam (Elm calls-extraction RED; all dim-7 RED via enclosing-func drift). - repro_lsp_go_py: 7 Go strategies (direct/type/embed/interface_resolve+dispatch/ cross_file/unresolved) + 14 Python strategies (method/super/super_init/ module_attr/dict_dispatch/operator_dunder/builtin*/generic_method/method_union), each asserting callable-sourcing + strategy-presence. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
The multi-platform smoke run flagged index-cli + index-status as empty/not-ready even though the binary indexed fine (nodes>0, status ready) — the MCP tool result wraps its payload as a JSON STRING with escaped quotes (\"nodes\":N), but the checks grepped for unescaped "nodes":N. Strip backslashes/quotes before matching and tolerate the nodes= log form. (Binary was healthy; this was a script-parsing gap the wide-matrix smoke surfaced.) Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Zig/Nim/Crystal/Hare/Odin/Pony/Ada/Fortran/COBOL/Pascal/Solidity/Move full invariant battery. Zig/Hare/Solidity callable-sourcing GREEN guards; the rest RED via enclosing-func drift (func_kinds_for_lang only covers Zig); Nim RED (no spec/ grammar — zero defs/calls, asserted as the documented gap). Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
HTML/CSS/SCSS/Vue/Svelte/Astro/GraphQL/Protobuf/Thrift/Prisma/GoTemplate/JSDoc. Adaptive battery: structural-only langs assert extract-clean + valid labels/FQNs/ ranges + defs-present; SCSS/GoTemplate also assert calls + callable-sourcing (both RED — enclosing-func gap / no Function node to source the call). Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Completes per-pass coverage for all hybrid LSPs: - repro_lsp_ts: 8 ts_lsp strategies (ts_local/method/namespace/import/jsx/jsx_import). - repro_lsp_java_cs: 16 Java lsp_* (type/inherited/outer/super/this/static dispatch, interface_resolve/dispatch, method_ref*, constructor*) + 13 C# cs_* (cs_method_*/ static/extension/ctor — C# uses its own cs_ vocabulary, not lsp_). - repro_lsp_kt_php_rust: 14 Kotlin lsp_kt_*, 7 PHP php_*, 8 Rust lsp_* — Rust all RED (pass_lsp_cross.c has no CBM_LANG_RUST → cross-LSP never runs for Rust). Each asserts callable-sourcing + strategy-presence in the CALLS edge. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
JSON/JSON5/YAML/TOML/INI/HCL/XML/CSV/PROPERTIES/DOTENV/KDL/RON/PKL/NICKEL/JSONNET/ STARLARK. Adaptive battery (most are structural-only: extract-clean + valid labels/FQNs/ranges + defs-present), plus HCL/Nickel/Jsonnet/Starlark callable + callable-sourcing, plus a robustness dim: malformed/truncated input must RETURN (no crash) on every config language. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
- build/infra (15): Dockerfile/Makefile/CMake/Meson/GN/Just/K8s/Kustomize/GoMod/ Requirements/Gitignore/Gitattributes/SSHConfig/BitBake/Puppet — adaptive (structural defs + CMake/Make/Just/Puppet/BitBake callables) + robustness dim. - shells/misc (19): Bash/Zsh/Fish/PowerShell/Tcl/Awk/Vimscript/Fennel/Janet/Nix/ GDScript/Luau/Teal/Smali/LLVM-IR/NASM/DeviceTree/Kconfig/Hyprlang — full battery for callable shells (PowerShell/Tcl/Awk/Fennel/Nix/Teal callable-sourcing RED via enclosing-func drift), structural for asm/data; robustness dim each. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
- scientific (15): GLSL/HLSL/WGSL/ISPC/Slang/Cairo/Sway/FunC/Wolfram/MATLAB/Magma/ FORM/TLA+/Agda/Apex — full battery; callable-sourcing RED across the board (grammar-only, no cross-LSP rescue); FunC/Wolfram/FORM/TLA+/Agda calls-extraction at-risk RED (unusual call-node types) + robustness dim. - markup (18): Markdown/RST/Typst/BibTeX/Mermaid/PO/Diff/Regex/CapnP/Smithy/WIT/QML/ Liquid/Jinja2/Blade/PureScript/SOQL/SOSL — adaptive (docs/schema structural, Typst/QML/PureScript callable) + robustness dim. Markdown headings→Class (BM25 #518). Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…ARM64) 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>
…RM64 Windows compat.h calls getenv (cbm_tmpdir) and _putenv_s (cbm_setenv/cbm_unsetenv) but only included stddef.h and stdio.h. The x86-64 mingw toolchain pulled stdlib.h in transitively, so it built there, but the aarch64 (CLANGARM64) include chain does not — the calls became implicit declarations that conflict with the real stdlib.h getenv type and fail to compile on native ARM64 Windows. Include stdlib.h directly so the declarations are correct on every toolchain. Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
…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>
This was referenced Jun 28, 2026
Open
Open
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Lands the cumulative reproduce-first bug suite and the LSP/grammar extraction
fixes that turn it green, validated across every platform.
The suite encodes one failing reproduction per known extraction gap (RED first),
then fixes each at the root cause so the call graph is correct. It ships with a
non-gating 5-platform bug-repro board (Linux x64/arm64, macOS arm64/x64,
Windows) so regressions across the ~159 grammars and the hybrid LSP resolvers
are caught early.
What's included
Call-graph / LSP extraction fixes (board → green):
operator+, implicit destructor / copy-ctor / conversionoperator calls; namespace-qualified QNs so ADL and namespace lookups resolve;
module-qualified out-of-line method caller QN so the LSP rescue joins.
Dart, Rust, Obj-C, Julia, SCSS, Agda, PureScript, PHP
__callattribution andcallee extraction fixes.
discovery skip-dirs.
Hard-tail items parked as documented skips (not deletions) with the root
cause + the work each needs, so they stay visible for follow-up: a few
Python-builtins / cross-file-module / Kotlin / C# / PHP-namespace LSP strategies
and the same-stem-file FQN invariants.
CI / platform correctness:
instead of x86-64 under emulation; it runs without ASan (LLVM ships no ASan
runtime for ARM64 Windows, and ASan can't intercept under emulation) as a real,
required functional gate. ASan/UBSan coverage remains on the other nine legs,
including native-ARM Linux/macOS.
compat.hnow includes<stdlib.h>sogetenv/_putenv_scompile on nativeARM64 Windows (a real portability fix).
same index) rather than page size, so 4 KB-page ARM Linux isn't false-failed.
Verification
failures.
required platform, including the native ARM64 Windows leg.