Skip to content

QA: reproduce-first bug suite + LSP/grammar extraction fixes (5-platform board green)#667

Merged
DeusData merged 112 commits into
mainfrom
qa/bug-repro-suite
Jun 28, 2026
Merged

QA: reproduce-first bug suite + LSP/grammar extraction fixes (5-platform board green)#667
DeusData merged 112 commits into
mainfrom
qa/bug-repro-suite

Conversation

@DeusData

Copy link
Copy Markdown
Owner

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):

  • C++: overloaded operator+, implicit destructor / copy-ctor / conversion
    operator calls; namespace-qualified QNs so ADL and namespace lookups resolve;
    module-qualified out-of-line method caller QN so the LSP rescue joins.
  • Java static-import resolved by short-name; TS JSX cross-file import; OCaml,
    Dart, Rust, Obj-C, Julia, SCSS, Agda, PureScript, PHP __call attribution and
    callee extraction fixes.
  • Invariant guards: callable-sourcing, LSP-rescue strategy/confidence,
    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:

  • windows-11-arm now builds with the native ARM64 toolchain (CLANGARM64)
    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.h now includes <stdlib.h> so getenv/_putenv_s compile on native
    ARM64 Windows (a real portability fix).
  • The incremental RSS budget is applied by architecture (ARM uses ~2.4 GB on the
    same index) rather than page size, so 4 KB-page ARM Linux isn't false-failed.
  • Pre-existing clang-format violations cleaned for the release lint gate.

Verification

  • Local repro board: 309 passed, 0 failed (25 documented skips), unit suite 0
    failures.
  • Dry-run pipeline (lint → test → build → smoke/soak + security) green on every
    required platform, including the native ARM64 Windows leg.

DeusData added 30 commits June 26, 2026 00:09
…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>
DeusData added 3 commits June 28, 2026 14:44
…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
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>
@DeusData DeusData merged commit 36d8328 into main Jun 28, 2026
20 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.

1 participant