release notes · v0.5.4
skylakegrep 0.5.4 — full doc-surface completion + streaming cold-start UX
Two threads in one ship:
-
Doc-surface completion for 0.5.3. 0.5.3 shipped working code with the doc surfaces only partially swept; this release brings every surface in
docs/RELEASING.mdinto sync. -
Streaming cold-start UX (small code change). Reported by the user mid-bench:
skygrep '我有没有跟"tax-2024"有关的文件?'sat silent for ≥ 30 s on a never-indexed dir before any output appeared. The fix is described in detail below — the cold-start path now prints (a) an immediate🔍 scanning…line, (b) the preliminaryrg+ filename matches as soon asrgreturns (typically < 1 s), (c) the🌊 / 💧 / ⚡lazy progress lines already added in 0.5.3, and (d) the lazy-refined matches as soon as the embed pass finishes — instead of waiting for the whole pipeline to complete and dumping everything at once.
What changed (eight surfaces audit)
The 0.5.3 ship updated:
- pyproject.toml (version bump)
- docs/skylakegrep-0.5.3.md + .html (release notes)
- docs/changelog.html (release card)
- docs/index.html line 731 (one of the Why skylakegrep? table cells)
The 0.5.3 ship MISSED — fixed in 0.5.4:
-
docs/index.htmlhero eyebrow (wasv0.2.13). Anyone landing on the GitHub Pages homepage saw a 0.2-era eyebrow over a project that's now at 0.5.x. Now readsv0.5.4 · 100% local · …. -
docs/index.html"Benchmarks summary" big numbers. The 30 / 30 fully-indexed peak was the only headline number. Added a second bench-stat for the new 0.5.3 cold-start lazy tier:+4 / 10 lazy auto-trigger over rg cold-start (0.5.3)with the Django vocab-mismatch oracle attribution. Also extended the section's lead paragraph to mention the three-tier model (rg cold ~100 ms / lazy cold ~5–30 s / fully-indexed cascade ~100 ms). -
og:description+twitter:descriptionmeta tags. Both previously claimed only the30/30 (100%) recallheadline; both now also call out the cold-start lazy tier so social-card previews reflect what 0.5.x actually shipped. -
docs/cli.htmlcheatsheet. Added rows for--lazy / --no-lazy,--rg-shortcut / --no-rg-shortcut,--filename-shortcut / --no-filename-shortcut. Added a newEnvironment variables (0.5.x)table coveringSKYGREP_DB_PATH,SKYGREP_PROACTIVE_DIRS,SKYGREP_LLM_ROUTER_MODEL,OLLAMA_URL,OLLAMA_EMBED_MODEL. -
docs/benchmarks.html. New<h3>section0. Cold-start lazy auto-trigger (NEW in 0.5.3)with the apples-to-apples real-CLI table: ---no-lazy(rg-only): 0 / 10, 4.85 s avg - default (auto-trigger): 4 / 10, 20.76 s avg - delta: +4 / 10, +15.9 s / query Also bumped the page intro fromfour reproducible benchmarkstofiveand lists the specific hits (Q1 resolvers.py, Q3 migration.py + executor.py, Q4 backends.py, Q7 base.py) plus an honest "still misses" list. -
README.mdheadline tagline. Was30 / 30 public-OSS recall · ~1 s warm · 100 % local · 14 releases. Now reads30 / 30 fully-indexed · +30 % lazy over rg cold-start (0.5.3) · ~1 s warm · 100 % local · 18 releases shipped. The added line surfaces the 0.5.3 measured improvement at the very top of the README so anyone scrolling past sees the new tier. -
docs/index.htmlWhy skylakegrep?table version pill: bumpedv0.5.3→v0.5.4. (The 0.5.3 release got this from 0.5.2; 0.5.4 keeps it current.) -
docs/changelog.htmlrelease card (this card you're reading the link from).
Streaming cold-start output (the second thread)
Before 0.5.4 (what the user saw):
$ skygrep '我有没有跟"tax-2024"有关的文件?'
← silent for 5–30 s
← prompt looks frozen
... (eventually all output appears at once) ...
After 0.5.4:
$ skygrep '我有没有跟"tax-2024"有关的文件?'
🔍 ripgrep cold-start · scanning project keywords… ← t = 0
▾ preliminary keyword matches (lazy semantic refinement starting…):
╭─ <path>:<lines> ──────────── 1.000 ← t ≈ 1 s
╭─ <path>:<lines> ──────────── 1.000
🔍 lazy auto-trigger · scanning project structure…
🌊 4 subprocesses · N LLM-routed · M token-shortcut · K seeds total
💧 diffused +N import neighbours
⚡ embedding K files (1 Ollama call)…
▾ refined matches from lazy semantic search:
╭─ <path> ──────────────────── 0.682 ← t ≈ 30 s
╭─ <path> ──────────────────── 0.667
[37.1 s · ripgrep cold-start + lazy auto (σ=0.014, conf=medium, …)]
User-visible improvements:
- t = 0: explicit "scanning…" message — no more silent prompt.
- t ≈ 1 s: preliminary rg + filename hits show immediately
whenever lazy is going to fire. User has something to read.
- t ≈ 1 s: explicit "lazy semantic refinement starting…" header
so the user knows there's a 5–30 s wait coming and doesn't kill
the process thinking it hung.
- t ≈ 5–30 s: the 🌊 / 💧 / ⚡ progress lines from 0.5.3 stream
to stderr while embed runs.
- t ≈ 30 s: lazy-refined matches print under a "▾ refined
matches…" header. Already-printed paths from the preliminary
block are de-duplicated so the same file never appears twice.
When rg is strong (no lazy fires) the streaming layer is bypassed
and output prints in one block as before — zero latency cost on the
fast path. The same is true for --json (one-shot, no streaming
markers).
Why this is a separate ship
Per the project's release protocol (docs/RELEASING.md): every
version must do commit + tag + push + PyPI upload + GitHub Release
with attached artifacts + a rendered themed HTML release-notes
page + sweep all eight surfaces. 0.5.3 missed surfaces 1, 2, 3, 4,
5, 6 above. Rather than amend a published tag (which PyPI doesn't
permit and which leaves the GitHub release page stale), 0.5.4 is a
clean docs-only patch shipping the missing surfaces.
Numbers
Same as 0.5.3 — no code changes, no bench changes:
pytest tests/— 217 / 217 pass- Django oracle bench (real CLI, fresh DB per query): rg-only 0 / 10 → auto-trigger 4 / 10 at +15.9 s / query
Compatibility
- All public APIs unchanged from 0.5.3.
- Same wheel + sdist file layout.
- Index format unchanged.
- 0.5.3-built indexes work without re-indexing.
Verified
- Every surface listed above visually inspected on the rendered GitHub Pages site after push.
pytest tests/— 217 / 217 (no code changes, baseline preserved).- PyPI install of 0.5.4 in fresh venv reports correct version.
Pending for 0.6
Unchanged from 0.5.3:
- Q2 / Q5 / Q6 / Q8 / Q9 / Q10 still don't hit on the Django bench — qwen 2.5:3b can't reliably pick the right dir for those specific oracle phrasings even after deterministic dir-token routing + simplification. Larger router model (qwen 7B+) or chain-of-thought prompt would likely lift these.
- Embedding chunk strategy is whole-file-truncate-2400; a structural-extraction (docstring + function signatures only) would likely lift cosine ranking among in-pool seeds.
- New proactive enhancer
cross_folder_semanticthat wrapslazy_explore_cross_folderfor the warm-cascade path (currently only fires post-cascade if cascade gap < tau).