v0.10.0
Search a parent dir holding many repos: each indexes as its own corpus. Multi-GiB folder corpora no longer wedge. CLI errors actually tell you what went wrong. seek gc shows you what it evicted.
Upgrade. Folder corpora indexed under v0.9.x re-index once on first search (cache layout v2 → v3). Git corpora untouched. CLI flags and on-disk paths unchanged.
What changes for you
- Multi-repo parent folders.
seek 'foo' ~/devnow discovers nested git repos inside the parent and indexes each one separately — gitignore honored per repo, results disambiguated by corpus. Capped at 64 nested repos per query (Warn on cap). - No more wedged folder searches. The deadlock that hung indefinitely on multi-GiB folder corpora is fixed. Per-corpus content cap raised 5 GiB → 10 GiB; peak RSS still bounded.
- Multi-corpus searches run in parallel. Up to 4 corpora index concurrently. Same physical repo reached via symlinks or multiple operands indexes once.
- CLI errors that help.
seek gcc→unknown subcommand "gcc" (did you mean "gc"?)seek --verbos foo→unknown flag: --verbos (did you mean --verbose?)seek -file:test(single-dash Zoekt query) still passes through unchanged.
seek gc --forceis no longer silent. Live banner + per-corpus table + summary, same shape as--dry-run. ACTION column:evicted/kept/locked/gone/trashed: <err>/failed: <err>.- Wedged-indexer signal. A stuck indexer used to silently degrade every search to stale shards forever. Now you get a Warn naming the lock so you can find and kill it.
seek gcsubcommand. Promoted to a real subcommand with--force,--dry-run,--all. Alias:garbage-collect.
Performance
Microbenchmarks (Apple M1 Max, benchstat over 5 samples):
| Benchmark | Δ ns/op |
|---|---|
FolderCorpus_ColdIndex |
−41.0% |
FolderCorpus_WarmSearch |
−20.1% |
SmallRepo executeParsedSearchScoped |
−52.7% |
SmallRepo planCurrentGitCorpus |
−21.3% |
SmallRepo ensureUntrackedCache |
−31.6% |
SmallRepo indexUncommitted_1file |
−12.1% |
SmallRepo postVerify_restat |
−21.5% |
PlannedGitCorpus_DirtyReindex |
−9.2% |
| geomean (16 benches) | −18.4% |
Field benchmarks — git + non-git, PR-scale dirty re-index at 1% and 10%:
| Kind | Workload | Files | Cold index | Warm search | Dirty 1% | Dirty 10% |
|---|---|---|---|---|---|---|
| git | spf13/cobra | 66 | 470ms | 80ms | 120ms | 130ms |
| git | prometheus/prometheus | 1,635 | 1.8s | 90ms | 150ms | 380ms |
| git | kubernetes/kubernetes | 30,507 | 11.0s | 180ms | 700ms | 4.3s |
| folder | synthetic-10k | 10,000 | 6.0s | 100ms | 250ms | 750ms |
| folder | synthetic-100k | 100,000 | 33.5s | 250ms | 1.3s | 7.8s |
Reproduce: ./cicd/bench-field.sh [--no-linux] [--keep].
Breaking
- Cache layout
v2 → v3— folder corpora re-index once on first search. - Internal Go API:
streamFilesrequirescontext.Context;acquireSearchLockrequiresindexDir string;fileContent.weightRelease contract (see docstring);gitPaths.ExcludePathremoved.
Dev/test
- 19 new test files: cancellation with goleak, pressure (4 MiB swap), property/fuzz, deadlock guard, discovery fixtures, git-boundary detection, Cobra CLI surface, soak (gated
//go:build soak+SEEK_SOAK=1). cicd/bench-field.sh— self-contained field-benchmark harness, sandboxed viaSEEK_CACHE_DIR.make test-bench-comparewrapsbenchstat.- New deps: cobra, pflag, goleak (test-only).
Full changelog: v0.9.0...v0.10.0