v1.108.301 — Green on a defect, three times
Green on a defect, three times. Three green signals sat on top of real defects this release, and that is the release.
search_ast served an empty table for every language and every preset — #553, @RascoApps
The compact encoder declared table key results / result_count / files_searched; the tool has always returned matches / total_matches / files_scanned. Every call over the compact path produced a header and no rows. Reproduced on a clean index: 2 matches in, 0 rows out.
The fail-closed guard is structurally blind to this class. It raises when a table has rows but no declared column was populated (#354) — a wrong key yields no rows at all, so out_rows is empty and the check never runs. Cross-checked all 17 schemas; this was the only one. The runtime guard is tracked separately in #555.
The reported fix would have been worse than the defect. Six columns were inferred from two presets, where the match dict carries sixteen keys across ten detectors — and five are pattern-specific (marker, value, callee, loop_depth, nesting_depth), the ones that say what the finding actually found. Dropping them still populates file and line, so the guard stays quiet: a total, loud loss becomes a partial, silent one.
It already had a green round-trip test. Its fixture was fabricated in the schema's image, so both sides were wrong identically; and its assertion looped over a hardcoded list of five table keys, of which matches was not one — the loop body ran zero times and the case asserted nothing.
The Racket descent guard, restored — #554, @otherjoel
The declared-forms block replaced the descent guard instead of preceding it, so the walker descended into every unrecognised form and emitted internal definitions as importable bindings. All eight CI jobs and the full 8,482-test local suite were green on it. Deleting the guard leaves 86 of 87 Racket tests passing, because every assertion on that path is positive. Corpus effect: extra 0 → 5, wrong_span 0 → 26, and those five were the exact names #548's guard was added to suppress — a silent revert of a shipped fix.
Caught by reading the diff. The fix closes the route as well as the defect: the CI-safe fidelity harness was equally blind, so guards.rkt now fails on a machine with no Racket installed.
Also in this release
racket_definition_forms(#554, @otherjoel) — declare a Racket project's own defining macros so what they bind becomes searchable. The kind is declared; the name position is read from the source, because one form appears in both shapes..mtsand.ctsindexed as nothing. TypeScript's ESM and CommonJS module extensions sat in the reindex hook's watched set and in no extension-to-language map, so editing one reported success and indexed nothing. The import half is inseparable: a TypeScript specifier names the emitted file, so.mtsis imported as./foo.mjs.
Tests
8482 passed, 13 skipped, 0 failed (8495 total), ruff clean. All eight CI matrix jobs green.