VQL: small, and good with Korean and code.
Words, phrases and a few filters. Korean is matched by syllable bigrams; code is matched through camelCase, snake_case and path fragments too.
| Write | Meaning |
|---|---|
| token refresh | All words (use --any for any word) |
| "refresh race" | The exact phrase, case-insensitive |
| file:src/auth.js | Events that touched that file: edits, tool calls that mention it, commit file lists |
| commit:abc1234 · session:ab12 | A commit (7+ chars) or a session id prefix |
| kind:decision,guard.* | Event kinds; * groups them |
| since:30d · until:2026-10-01 | A period: 90m 12h 30d 8w, a date (UTC) or epoch ms |
| status:active|superseded|all | Decision state (plugin extension, default active) |
| error:<fingerprint> | The history of one error fingerprint (plugin extension) |
How results are ranked
- BM25k1 = 1.2, b = 0.75
- × kind weightdecision 1.5 · error 1.4 · commit, contract 1.2 · conversation 1.0 · edit, guard, check 0.8 · tool 0.6
- × recency0.3 + 0.7 × 0.5^(age / 30 days) — never below 0.3, so an old exact match still beats a recent vague one
Semantic search is opt-in (--semantic): BM25 and vector cosine results are merged with RRF (k = 60). The embedding is currently a hash-based stand-in, not a real model.
Numbers, with their conditions.
Synthetic log of 1M events, 107 segments, release build, warm p50 in one process. A server or daemon lives in this state for a long time, so this is the closest to real use. The common term w0 appears in about 30% of documents — more common than in real logs.
| Query | Before | Now |
|---|---|---|
| w0 | 15.7 ms | 3.7 ms |
| w0 w2 | 24.9 ms | 7.8 ms |
| w3 w1 w0 | 30.3 ms | 8.3 ms |
| w3225 (rare term) | 13.7 ms | 6.9 ms |
| "w34 w95" (phrase) | 38.5 ms | 23.5 ms |
| retry | 5.1 ms | 2.0 ms |
| w5000 w0 (missing term) | 20.9 ms | 0.0 ms |
Storage and server
| Full verify, 1M events | ≈ 0.17 s |
| First ingest, 188 MB log, 1M events | 5.9 s |
| Ingest with no new lines | ≈ 7 ms |
| Server idle RSS, 1.1M events open | 14 MB |
| Disk, 1.1M events | 267 MB log → ≈ 475–525 MB total |
| Server, 120k-event project, auth + audit, 2 vCPU VM | 242 / 300 / 298 req/s at 1 / 8 / 32 clients |
The “first ingest”, “no new lines” rows were measured earlier on older data (34 segments); do not compare them with the search timings. Methods and the ideas not yet tried are in the engine’s HANDOFF.md.
Give your sessions a memory.
MIT licensed. Source on GitHub.