Skip to content

Commit efb3e13

Browse files
authored
Merge branch 'main' into feat/pkl-call-extraction
2 parents a700bff + 4203752 commit efb3e13

176 files changed

Lines changed: 47510 additions & 3564 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/_build.yml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ jobs:
5353
# runner); revisit the Intel leg before that retirement.
5454
timeout-minutes: 240
5555
steps:
56-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
56+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
5757

5858
- name: Install deps (Ubuntu)
5959
if: startsWith(matrix.os, 'ubuntu')
@@ -128,7 +128,7 @@ jobs:
128128
runs-on: windows-latest
129129
timeout-minutes: 240
130130
steps:
131-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
131+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
132132

133133
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
134134
with:
@@ -201,7 +201,7 @@ jobs:
201201
runs-on: windows-11-arm
202202
timeout-minutes: 240
203203
steps:
204-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
204+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
205205

206206
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
207207
with:
@@ -278,7 +278,7 @@ jobs:
278278
runs-on: ${{ matrix.runner }}
279279
timeout-minutes: 240
280280
steps:
281-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
281+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
282282

283283
- name: Install deps
284284
run: sudo apt-get update && sudo apt-get install -y zlib1g-dev

‎.github/workflows/_lint.yml‎

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
runs-on: ubuntu-latest
1414
timeout-minutes: 15
1515
steps:
16-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
16+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
1717

1818
# Tests must pass or fail — no SKIPs except genuinely platform-specific
1919
# ones (SKIP_PLATFORM / #ifdef). Fails the lint phase on any plain SKIP().
@@ -49,3 +49,28 @@ jobs:
4949

5050
- name: Lint (cppcheck + clang-format, no clang-tidy — enforced locally)
5151
run: scripts/lint.sh --ci CLANG_FORMAT=clang-format-20
52+
53+
# Memory-analyzer gate (user decision 2026-08-03: runner cost accepted).
54+
# Path-sensitive clang-analyzer over the memory checks only: leak paths,
55+
# null derefs, uninitialized reads. Its first run produced 9 real fixes;
56+
# the gate is green because every false positive was RESTRUCTURED for
57+
# provability (never suppressed — the NOLINT ban applies here too).
58+
# Vendored-tree diagnostics are path-filtered, mirroring .cppcheck.
59+
lint-mem:
60+
runs-on: ubuntu-latest
61+
timeout-minutes: 60
62+
steps:
63+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
64+
65+
- name: Install build deps
66+
run: sudo apt-get update && sudo apt-get install -y zlib1g-dev
67+
68+
- name: Install LLVM 22 (pinned analyzer toolchain)
69+
run: |
70+
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
71+
echo "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-22 main" | sudo tee /etc/apt/sources.list.d/llvm-22.list
72+
sudo apt-get update
73+
sudo apt-get install -y clang-tidy-22
74+
75+
- name: Memory-analyzer gate
76+
run: scripts/ci/lint-mem.sh clang-tidy-22

‎.github/workflows/_security.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
runs-on: ubuntu-latest
1515
timeout-minutes: 5
1616
steps:
17-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
17+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
1818
- name: "Layer 1: Static allow-list audit"
1919
run: scripts/security-audit.sh
2020
- name: "Layer 6: UI security audit"
@@ -26,7 +26,7 @@ jobs:
2626
runs-on: ubuntu-latest
2727
timeout-minutes: 240
2828
steps:
29-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
29+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
3030
- name: Install ScanCode Toolkit
3131
run: pipx install scancode-toolkit
3232
- name: "Gate self-test (a planted violation must be detected)"

‎.github/workflows/_smoke.yml‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ jobs:
9999
# Budget doctrine: the timeout sits above the worst case, twice over.
100100
timeout-minutes: 30
101101
steps:
102-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
102+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
103103

104104
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
105105
with:
@@ -180,7 +180,7 @@ jobs:
180180
# Budget doctrine: the timeout sits above the worst case, twice over.
181181
timeout-minutes: 30
182182
steps:
183-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
183+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
184184

185185
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
186186
with:
@@ -285,7 +285,7 @@ jobs:
285285
# Budget doctrine: the timeout sits above the worst case, twice over.
286286
timeout-minutes: 30
287287
steps:
288-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
288+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
289289

290290
- uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
291291
with:
@@ -342,7 +342,7 @@ jobs:
342342
timeout-minutes: 10
343343
continue-on-error: true
344344
steps:
345-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
345+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
346346
- name: Build Glama image and verify MCP introspection
347347
run: bash pkg/glama/verify.sh
348348
- name: Test homebrew installation

‎.github/workflows/_soak.yml‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ jobs:
5959
# inputs context is not reliably available at job-setup time): 560.
6060
timeout-minutes: 560
6161
steps:
62-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
62+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
6363
- name: Install deps (Linux)
6464
if: startsWith(matrix.os, 'ubuntu')
6565
run: sudo apt-get update && sudo apt-get install -y zlib1g-dev python3 git
@@ -91,7 +91,7 @@ jobs:
9191
# 240-min legs need ~480 min + build; 300 silently killed the second leg.
9292
timeout-minutes: 560
9393
steps:
94-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
94+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
9595

9696
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
9797
with:
@@ -148,7 +148,7 @@ jobs:
148148
# Budget doctrine (see soak-quick): per-leg duration, two legs, 560.
149149
timeout-minutes: 560
150150
steps:
151-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
151+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
152152

153153
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
154154
with:
@@ -232,7 +232,7 @@ jobs:
232232
# soak-quick 30→240 mismatch above — keep the timeout above the run length.)
233233
timeout-minutes: 240
234234
steps:
235-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
235+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
236236
- name: Install deps (Linux)
237237
if: startsWith(matrix.os, 'ubuntu')
238238
run: sudo apt-get update && sudo apt-get install -y zlib1g-dev python3 git
@@ -263,7 +263,7 @@ jobs:
263263
# never truncated.
264264
timeout-minutes: 240
265265
steps:
266-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
266+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
267267

268268
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
269269
with:

‎.github/workflows/_test.yml‎

Lines changed: 128 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ jobs:
101101
continue-on-error: ${{ matrix.optional == true }}
102102
timeout-minutes: 240
103103
steps:
104-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
104+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
105105

106106
- name: Install deps (Ubuntu)
107107
if: startsWith(matrix.os, 'ubuntu')
@@ -183,6 +183,129 @@ jobs:
183183
# platform can surface a race the others miss. Windows has no TSan runtime on
184184
# any toolchain (documented irreducible gap); this shared-code coverage is
185185
# its substitute.
186+
# Memory-diagnostics lane (user decision 2026-08-03: runner cost accepted).
187+
# Newest pinned LLVM sanitizer runtime + straighter stacks over the full
188+
# parallel suite — catches what an older compiler-rt can miss. Same
189+
# canonical scripts/test.sh wave as every other leg.
190+
test-diag:
191+
runs-on: ubuntu-latest
192+
timeout-minutes: 120
193+
steps:
194+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
195+
196+
- name: Install deps
197+
run: sudo apt-get update && sudo apt-get install -y zlib1g-dev ccache
198+
199+
- name: Install LLVM 22 (pinned diagnostic toolchain)
200+
run: |
201+
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | sudo tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
202+
echo "deb http://apt.llvm.org/noble/ llvm-toolchain-noble-22 main" | sudo tee /etc/apt/sources.list.d/llvm-22.list
203+
sudo apt-get update
204+
sudo apt-get install -y clang-22
205+
206+
- name: Compiler cache (content-verified, restore)
207+
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
208+
with:
209+
path: ${{ github.workspace }}/.ccache
210+
key: ccache-diag-${{ github.ref }}-${{ github.sha }}
211+
restore-keys: |
212+
ccache-diag-${{ github.ref }}-
213+
ccache-diag-
214+
215+
# Also enables the ASan checks that are off by default in every other
216+
# lane: stack-use-after-return, stack-use-after-scope, and strict string
217+
# checks. Mirrors `make -f Makefile.cbm diag`, including its reasoning
218+
# for leaving detect_invalid_pointer_pairs out.
219+
- name: Test (clang-22, ASan+UBSan + off-by-default ASan checks)
220+
env:
221+
ASAN_OPTIONS: "detect_stack_use_after_return=1:strict_string_checks=1:detect_stack_use_after_scope=1"
222+
run: |
223+
scripts/test.sh CC=clang-22 CXX=clang++-22 \
224+
SANITIZE="-fsanitize=address,undefined -fno-omit-frame-pointer -fno-optimize-sibling-calls"
225+
226+
- name: Compiler cache (save)
227+
if: always()
228+
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
229+
with:
230+
path: ${{ github.workspace }}/.ccache
231+
key: ccache-diag-${{ github.ref }}-${{ github.sha }}
232+
233+
# MemorySanitizer lane (stage 2). Uninitialized READS are the one
234+
# memory-error class no other lane covers dynamically. The image carries
235+
# MSan-instrumented libc++/libc++abi/libunwind + zlib (vendored C deps
236+
# instrument in-tree); scripts/msan.sh drives the build and the suite.
237+
#
238+
# THIS JOB IS THE AUTHORITATIVE VENUE for the lane. It previously ran WITHOUT
239+
# the script's default exclusions to settle whether those were an aarch64
240+
# artifact — the local ladder cannot answer that, having no faithful x86-64
241+
# emulation. It has now answered it, and the answer SPLIT the list:
242+
#
243+
# - the five deep-recursion suites overflow their thread stacks on x86-64
244+
# too, so that limit is NOT architectural;
245+
# - `cli` does not overflow here at all — it fails in the install path for
246+
# an unrelated, still-undiagnosed reason;
247+
# - `incremental` was a shadow-memory RSS artifact, now fixed in the test
248+
# itself rather than skipped, so it stays in the lane.
249+
#
250+
# Per-cause detail lives in scripts/msan.sh, which is the single authoritative
251+
# list both venues now share. Zero use-of-uninitialized-value findings were
252+
# reported across the lane on either architecture.
253+
test-msan:
254+
runs-on: ubuntu-latest
255+
timeout-minutes: 180
256+
steps:
257+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
258+
259+
- name: Buildx cache
260+
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
261+
with:
262+
path: /tmp/.buildx-msan
263+
key: buildx-msan-${{ hashFiles('test-infrastructure/Dockerfile.msan') }}
264+
265+
- name: Build MSan image (cached layers)
266+
run: scripts/ci/msan-lane.sh build
267+
268+
- name: MSan suite (exclusions per scripts/msan.sh)
269+
run: scripts/ci/msan-lane.sh run
270+
271+
# macOS leak coverage. LeakSanitizer runs by default under ASan on Linux, so
272+
# test-unix's ubuntu legs have always had it; on macOS it is off by default
273+
# and Apple's clang refuses to turn it on, which left an entire platform with
274+
# zero leak detection. Upstream (Homebrew) LLVM supports LSan on darwin/arm64,
275+
# so this leg is the ordinary ASan suite built with that toolchain and run
276+
# with detect_leaks=1. Mirrors the local `make -f Makefile.cbm test-lsan`.
277+
test-lsan-macos:
278+
runs-on: macos-latest
279+
timeout-minutes: 120
280+
steps:
281+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
282+
283+
- name: Install LSan-capable toolchain
284+
run: brew install llvm ccache
285+
286+
- name: Compiler cache (content-verified, restore)
287+
uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
288+
with:
289+
path: ${{ github.workspace }}/.ccache
290+
key: ccache-lsan-${{ github.ref }}-${{ github.sha }}
291+
restore-keys: |
292+
ccache-lsan-${{ github.ref }}-
293+
ccache-lsan-
294+
295+
- name: Test (Homebrew clang, ASan + LeakSanitizer)
296+
env:
297+
ASAN_OPTIONS: "detect_leaks=1:halt_on_error=1"
298+
run: |
299+
LLVM_PREFIX="$(brew --prefix llvm)"
300+
scripts/test.sh CC="$LLVM_PREFIX/bin/clang" CXX="$LLVM_PREFIX/bin/clang++"
301+
302+
- name: Compiler cache (save)
303+
if: always()
304+
uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
305+
with:
306+
path: ${{ github.workspace }}/.ccache
307+
key: ccache-lsan-${{ github.ref }}-${{ github.sha }}
308+
186309
test-tsan:
187310
strategy:
188311
fail-fast: false
@@ -194,7 +317,7 @@ jobs:
194317
runs-on: ${{ matrix.os }}
195318
timeout-minutes: 120
196319
steps:
197-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
320+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
198321

199322
- name: Install deps (Ubuntu)
200323
if: runner.os == 'Linux'
@@ -250,7 +373,7 @@ jobs:
250373
continue-on-error: ${{ matrix.optional == true }}
251374
timeout-minutes: 240
252375
steps:
253-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
376+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
254377

255378
# Defender posture: real-time protection is POLICY-LOCKED OFF on hosted
256379
# Windows images (verified 2026-07-27: WinDefend starts and
@@ -367,7 +490,7 @@ jobs:
367490
# The union proof lives in the canonical scripts/ci entry, not inline
368491
# YAML (venue-parity contract) — checkout (into repo/, so the manifest
369492
# download below stays untouched) provides the script.
370-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
493+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
371494
with:
372495
path: repo
373496

@@ -390,7 +513,7 @@ jobs:
390513
runs-on: windows-latest
391514
timeout-minutes: 60
392515
steps:
393-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
516+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
394517

395518
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
396519
with:

‎.github/workflows/bug-repro.yml‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ on:
1515
type: choice
1616
options: ['all', 'linux', 'macos', 'windows']
1717
default: 'all'
18-
# Iteration convenience: any push to a qa/** branch runs the board straight
19-
# from that branch's own copy of this file (no main merge needed). Non-gating.
20-
push:
21-
# Exclude the dedicated lane branches so they only run their own workflow
22-
# (fast-repro / soak / smoke), not the full board too.
23-
branches: ['qa/**', '!qa/fast-**', '!qa/soak-**', '!qa/smoke-**']
18+
# DISPATCH-ONLY by decision (2026-08-02): the board's primary venue is the
19+
# LOCAL multi-leg CI (scripts/repro.sh on macOS/Linux/Windows), which can hold
20+
# the real-repo corpus tier that GitHub runners never can -- the old qa/**
21+
# push trigger auto-ran a board that was structurally red from those corpus
22+
# skips, repainting red that blocked nobody. Manual dispatch remains for
23+
# cross-platform spot checks (gh workflow run bug-repro.yml --ref <branch>).
2424

2525
permissions:
2626
contents: read
@@ -51,7 +51,7 @@ jobs:
5151
runs-on: ${{ matrix.os }}
5252
timeout-minutes: 240
5353
steps:
54-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
54+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
5555

5656
- name: Install deps (Ubuntu)
5757
if: startsWith(matrix.os, 'ubuntu')
@@ -66,7 +66,7 @@ jobs:
6666
runs-on: windows-latest
6767
timeout-minutes: 240
6868
steps:
69-
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
69+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
7070

7171
- uses: msys2/setup-msys2@66cd2cce69caa17b53920067426061ca1de3a884 # v2
7272
with:

0 commit comments

Comments
 (0)