v0.20.0 catches a model provider that reports success and returns wrong numbers, which retires the macOS 15 arm64 known issue from the last two releases. It also stops an interrupted publish serving results from the wrong commit, and cuts the cost of searches that never use meaning-based data.
Changes
- Seek compares the Core ML provider with the CPU provider before it trusts one, and runs the model on the CPU when they disagree on direction or magnitude. This catches ONNX Runtime issue 32569, which earlier releases could not see. The check runs once for each model, run-time version, and operating system build, and adds about half a second to that first search. Later searches keep watching: Seek now refuses model output that carries no direction, and two such batches within seven days stop this host using the accelerated provider.
SEEK_PROVIDERpins one provider, so a bug report names one. Every build acceptscpuandauto; a build with Core ML also acceptscoreml-mlprogram-static. A name this build cannot use stops a search with exit code 2, and leavesseek gc,--lexical-only, and other commands that never load the model alone.- A search now reads its committed commit from the shards, not from the
.headsidecar. A crash between the two writes left one commit's shards beside a sidecar naming another, and the corpus then served that content without a sign. Reproduced on 9 of 10 targeted crash injections. - A weak model expansion is rejected. Without a strict all-word result, the best score must pass 0.600 for combined search or 0.575 for lexical re-ranking; both limits admitted 0 of 71 wrong-project descriptions. A strict result survives the rejection. A description left with nothing prints nothing and exits 1, which is not proof of absence. The candidate pool now uses the model's full 128 rows and covered 72 of 72 calibration targets, against 70 before.
- A search builds vectors only when it can read them. A cold
sym:query over 250 files fell from 3,255 ms to 352 ms. Model re-ranking of text results is unchanged. - A failed or drifted build keeps what the next build needs to make a delta. Ten folder searches under a writer touching one file every 20 ms averaged 132 ms and now average 94 ms. The first clean search after a HEAD move plus drift fell from 1,598 ms to 1,201 ms.
- Fine vectors are stored as signed int16. Combined search plans its final 128-file set before it reads sources, and the CLI streams results instead of building one corpus-sized string.
seek gcremoves compiled Core ML models under<seek-cache>/reranker/coreml/that no search has used within the unused age. Each is tens of megabytes, and a system update stranded the previous one.seek gc --dry-runis now read-only.
Upgrade
The first meaning-based search rebuilds older meaning-based data once, because semantic format 5, the run-time version, and a new model hash all enter the generation key. The text index stays valid, so only the meaning-based half repeats. It can take tens of seconds and several GiB of memory on a large repository; --lexical-only skips it.
The rebuilt FP16 model produces the same numbers as the one it replaces: the largest difference over an 8-row batch is zero on both providers. Ranking does not move.
On Apple Silicon the first search also compiles the Core ML model again, because its cache key now carries the operating system build. seek gc ages the old one out on the unused age, 14 days by default.
Source builds still need Go 1.27 or newer, CGO, and a native C compiler; use make build. The lint and test recipes now find the tools make install installs without a separate PATH change.
Packages
Four archives support macOS 15 or newer and glibc Linux on amd64 and arm64. Linux packages were built on Ubuntu 24.04; musl is not supported. The release also includes SHA-256 checksums, a CycloneDX SBOM, build-provenance attestations, and SBOM attestations. Each archive contains the binary, license, and third-party notices. The binary contains its model and native libraries and uses no remote API. Seek needs Universal Ctags to build or update an index and Git 2.36 or later for Git-backed searches.
Install
curl -sSfL \
https://raw.githubusercontent.com/dualeai/seek/v0.20.0/install.sh |
sh -s -- v0.20.0Full changelog: v0.19.0...v0.20.0