2026년 7월 19일부터 현재 버전 1.3.1까지 ivygrep의 7개 버전을 모았습니다. 모든 버전은 제공사의 공식 설치 파일로 연결됩니다.
| 버전 | 날짜 | 크기 | 파일 |
|---|---|---|---|
| 1.3.1최신 | 2026년 10월 28일 | — | 64비트 ZIP 릴리스 노트### Changed
• Release retrieval checks audit candidate coverage consistently across search modes and retain per-query metrics when a validation gate fails. Final top-20 recall remains a separate metric.
• `ig --status` no longer reads every page of a large SQLite store. It measured the store tiers (stored chunks, graph, auxiliary) with three full `dbstat` passes, which took 450 seconds for an index with an 8.3 GB store. The MCP status tool, the web UI, and the progress display of a first index ran the same passes. A status listing now measures the tiers in one pass, and only for a store up to 256 MiB. For a larger store, `index_components` has no `stored_chunks_bytes`, `graph_bytes`, or `sqlite_auxiliary_bytes`, and the text output shows the size of the whole store. `ig --doctor` always measures the tiers. The legacy call graph check reads only the legacy tables, so a current store costs no pass.
• A search, `ig --interactive`, or `ig --add` that would index your home directory, a directory that contains it, or the filesystem root now asks for confirmation first. A search in the wrong directory could start hours of indexing and use many gigabytes. Without a terminal, `ig` does not build that index and reports the reason. Pass `--yes` (`-y`) to build it without the question. An index of such a directory that already exists is used as before, unless the command rebuilds it (`--add --force`) or adds the ignored files to it (`--skip-gitignore`).
• An index run of a clean Git checkout starts 6 Git processes instead of 16. One `git status` gives the commit and the state of the worktree, one `git rev-parse` gives both Git paths, and one `git config` gives `core.excludesFile` and the sparse-checkout settings. Before the clean-checkout shortcut returns, and after an index update, ivygrep no longer reads the complete state a second time. It runs one `git status` and reads the Git index and the ignore files again.
• On macOS, a lexical index commit waits for fewer drive cache flushes. Tantivy ended every segment file and metadata write with `F_FULLFSYNC`. Those writes now end with `F_BARRIERFSYNC`, which keeps their order on the drive. The full flush before `meta.json` names a new segment remains. On an Apple M5 Max, a one-file update of a 200-file workspace issued 28 full flushes and now issues 1 full flush and 29 barriers. The time in durability calls fell from 119 ms to 40 ms on a loaded host. Other platforms do not change.
• The daemon soak, the MCP session soak, the resource-load benchmark, and the million-chunk benchmark sample processes on macOS through libproc. The soaks and the resource-load benchmark required Linux `/proc`, and the million-chunk benchmark recorded no CPU, memory, or I/O on macOS. macOS reports state how each metric is derived. They have no PSS, file-backed RSS, or watcher counts, and the MCP session soak does not gate memory under load there.
• The daemon rejects cache writes from searches that started before cache invalidation.
• Background indexing has a separate admission limit and uses fewer parser threads by default. MCP readiness polling starts at 20 ms and increases to 500 ms. Context packs reuse search readers and parsed input. Content digests prevent reuse after input changes.
• Result caches, neural query caches, and idle search contexts now have byte budgets. Indexing batches use source-byte targets and estimated payload reservations. These limits control retained data, not total process RSS. One oversized indexing payload can proceed alone.
• Semantic search retries ANN with bounded adaptive overfetch when rejected candidates leave too few visible results. Exact scoring remains available when retries underfill. Debug diagnostics record stage timings, recovery frequency, and scanned-key counts.
• The documentation and website explain search, context packs, memory limits, and model behavior in simpler language. A new resource report includes repeated released-binary measurements and a separate source |
| 1.3.0 | 2026년 9월 26일 | — | 64비트 ZIP 릴리스 노트### Upgrade notes
• The default neural model is now `potion-code-16m-v2`. Indexes keep working without a rebuild and the index format is unchanged:search ignores neural vectors built by `static-retrieval-v1` and answers from lexical, literal, symbol, and hash evidence until the next neural enhancement re-embeds the index, which the daemon schedules after the first search (done within 8 seconds for 11,214 chunks in a local run; a direct rebuild embeds 25,460 chunks in 6 seconds). Until then `--force-neural` reports an incompatible neural model, and `ig --status` and `ig --doctor` report a healthy index that still lists `static-retrieval-v1`. The first neural use downloads 33.5 MB instead of 125.7 MB. Hosts without network access need the new model in the Hugging Face cache (`uv run scripts/cache_neural_model.py --profile potion-code-v2 --cache "$HF_HOME"`); without it neural enhancement fails and search stays on lexical and hash results. Set `IVYGREP_MODEL_PROFILE=static-retrieval-v1` (or `static`) to keep the previous model, its cached download, and existing vectors.
### Changed
• Neural search results now depend on how good the embedding model is, and the default neural profile is `potion-code-16m-v2` instead of `static-retrieval-v1`; an unset or unknown `IVYGREP_MODEL_PROFILE` selects it (see the upgrade notes). Until now the neural tier was one reciprocal-rank vote of weight 1.0 among lexical, literal, path, and symbol votes worth several times more, and only files among the 50 nearest chunks got it, so a better model changed almost nothing:on the public benchmarks `potion-code-v2` beat `static-retrieval-v1` by .003 nDCG@10 in default mode although its own ranking is far better. A late dense-fusion stage now runs after the ranking heuristics and before result filtering and the learned reranker. Search scores every candidate that lexical, literal, path, or symbol search found against the neural query vector, then reorders files by two signals. A file whose best cosine beats the runner-up file by a ratio of 1.05 moves to the first position. Profiles with a measured calibration (`DenseFusionCalibration` in `src/embedding.rs`; `potion-code-16m-v2` uses 0.25 for pasted source and for multi-line or long prose) also add a standing reciprocal-rank vote, and search consults them for every query whose route allows neural retrieval instead of only when lexical confidence is low. `static-retrieval-v1` and unmeasured profiles have no standing vote and keep the lexical-confidence gate. Only files that direct search found, that pass the result filter's authority test, and that have the most authoritative path role among the direct candidates take part, and they are reordered among the positions they already hold, so cosine alone never promotes a file and documentation, tests, and support files never move relative to the implementation. Short natural-language queries skip the stage. Scores are reassigned by position, so the adaptive score filter and the learned reranker see the same distribution as before. All figures are measured on top of the long-query lexical vote in this release, against `static-retrieval-v1` as the default without the new stage. On 923 held-out public queries (the public-core halves the reranker was not fit on, four `sota-challenge` samples, and CodeSearchNet Python and Java), default-mode nDCG@10 rises by .011 (102 queries up, 68 down; CodeSearchNet-java .677 to .727, codefeedback-st .779 to .803, codetrans-contest .588 to .609): .008 from the new stage with the same model (.009 with `--force-neural`) and .003 from the model. On the file-localization benchmark default mode goes from Acc@1 .367 to .400, Acc@5 .767 to .800, Acc@10 .767 to .833, and MRR .524 to .551. On MemoryQuest notes retrieval nDCG@10 goes from .435 to .455 and recall@20 from .753 to .764. The self-repository relevance gate ranks every query the same in every mode, and lexical, hash, and hybrid results without neural vectors are identical. With |
| 1.2.16 | 2026년 9월 15일 | — | 64비트 ZIP 릴리스 노트### Upgrade notes
• Existing indexes rebuild once on first use for index format v30.
• The Web UI requires the session token on loopback listeners too. Open the URL that `ig --web` prints; a bare `http://127.0.0.1:4747/` returns 401.
• v1.2.15 was tagged but not published:its CUDA Linux binary exceeded the release size budget. This release includes every change listed here.
### Security
• The Web UI requires the session token on loopback listeners too. Other local users could previously read indexed files, list directories, search, and launch the editor through `127.0.0.1`. Open the URL printed by `ig --web`; bare `http://127.0.0.1:4747/` returns 401. The printed URL contains the token, so keep terminal output and logs that capture it private.
• `ig --web` opens the browser through an owner-only HTML redirect file under the ivygrep app home instead of passing the tokenized URL to `xdg-open`, `open`, or `ShellExecuteW`, so the token no longer appears in process arguments other local users can read. On Unix the file is mode 0600 in a 0700 `browser/` directory; a later launch removes files older than two minutes. `IVYGREP_NO_BROWSER=1` skips the launch and the file.
• The token URL answers with a same-origin page that sets the HttpOnly `SameSite=Strict` cookie and refreshes to the app without the token. A redirect lost the cookie when the URL was opened from a local file, as the launcher's redirect page does. The cookie is named per listener port (`ivygrep_session_<port>`), so daemons on different ports keep separate sessions.
• Model downloads use rustls 0.23.45, which fixes RUSTSEC-2026-0285:rustls accepted TLS 1.3 handshake messages sent at the wrong encryption level when they followed a key-changing message in the same record. The handshake transcript stays authenticated, so an attacker could not alter or complete a handshake.
### Added
• **Optional PotionCode v2 static embeddings.** `IVYGREP_MODEL_PROFILE=potion-code-v2` runs the revision-pinned `minishlab/potion-code-16M-v2` Model2Vec profile (256 dimensions, float16 weights widened to f32, unweighted token mean). The default profile is unchanged.
### Changed
• Release binaries build with one codegen unit instead of Cargo's default of 16, shrinking them by about 4%. A local x86_64 Linux release build goes from 73.88 MiB to 70.63 MiB. The CUDA Linux binary grew to 81.64 MiB in v1.2.15, above its 81 MiB budget, and fits again.
• Query expansion no longer maps phrases to identifiers from ivygrep's own source or the Linux kernel relevance fixture (`cpu_permits`, `vector_store`, `daemon_request`, `daemon_response`, `indexable`, `doctor`, `block_io`, `workqueue`). Two phrase aliases that tokenization could never match are removed. Self-repository relevance gate floors are lowered to match. Many remaining phrase aliases still come from the same fixture-fitting history and are candidates for corpus-derived expansion.
### Fixed
• Queries whose retrieval text is one line no longer give a fusion vote to hash-vector matches on candidates that lexical, literal, path, or symbol search already found, including when neural retrieval runs. Hash vectors hash the same words BM25 scores, so since the hash graph started returning real neighbors these votes counted prose evidence twice and pulled clusters of near-duplicate, term-dense functions above the relevant one. Multi-line queries, including pasted error output after runtime values are dropped, keep the vote, since hash overlap on pasted identifiers still separates the matching snippet. Neural matches still vote from the neural tier's own rank, and hash-only discoveries still vote. On public-core cosqa (3 runs each), neural recall@20 rises from `.3487` to `.3520`, back above the `.35` gate floor, and hash, hybrid, and blended recall@20 rise from `.3587`, `.3580`, and `.3527` to `.3640`, `.3647`, and `.3560`. No codefeedback-st, codetrans-contest, or codetrans-dl query gains or loses a relevant file in the top 20 in any mode.
• Reb |
| 1.2.14 | 2026년 9월 10일 | — | 64비트 ZIP 릴리스 노트### Fixed
• Symbol definitions, references, and callers preserve Unicode identifiers, including combining marks and qualified names, instead of dropping or conflating them. Existing dollar-sigil aliases remain supported. Index format v27 rebuilds unchanged files to repair previously truncated symbol keys.
• Rust context dependencies resolve `crate::` imports within the owning Cargo target, including workspace members and custom library and binary paths. Library-name imports from other targets resolve against the package library, and custom crate-root module declarations resolve beside the target file. Index format v28 rebuilds existing indexes once to replace stale cross-package dependency edges.
• Incremental dependency graphs refresh unchanged importers when a newly added file takes precedence over an existing target. Deletion, reintroduction, and worktree restoration keep outgoing dependencies and reverse dependents consistent. Python package initializers take precedence over same-named modules, matching runtime imports. Index format v29 rebuilds existing indexes once to retain resolved import specifications and corrected Python targets.
• Go caller searches recognize explicit generic invocations, including qualified, parenthesized, and zero-argument calls, when the generic function is defined in the index. Generic type conversions, collection indexing, and uncalled function values remain excluded. Go reference searches exclude type, alias, and interface method declaration names while preserving their uses.
• Local indexing and first-query recovery rebuild saved stores when a tracked directory changes between a linked worktree and a standalone checkout, preserving workspace settings and removing the obsolete layout.
• Clean Git checkouts reindex files included through `.ignore` whitelists and observe ancestor ignore-rule changes. Files hidden from Git status by index flags also refresh correctly, including when a worktree reuses its base.
• Context packs apply the indexer's ignore rules to changed files, explicit paths, and live dependency expansion, keeping excluded source out of CLI and MCP output unless `--skip-gitignore` is requested.
• Literal searches apply the hit limit before building excess snippets and keep parallel partial results bounded, avoiding memory growth with every matching line while preserving deterministic result order.
• Web context requests acquire workspace leases before CPU capacity, preventing a deadlock with concurrent indexing when search capacity is exhausted. Both resources remain held through context generation.
• Failed main-index publication now forces complete recovery before reusing Git state or creating worktree overlays. Doctor detects unfinished publication instead of reporting stale stores as healthy.
• Daemon hybrid searches refresh workspace and base-index identity when a checkout is replaced or its Git pointer changes, preventing missing results and stale matches without requiring a daemon restart.
• Background hash and neural enhancement discard obsolete work when an index is removed or rebuilt, including worktree overlays and reused generation numbers. Model computation still runs alongside lexical indexing; checkpoints and completion publish under the index lock.
### Testing
• Windows cross-platform E2E allows 60 minutes for the expanded test suite instead of cancelling a still-passing run at the previous 30-minute limit.
• Linux ARM release acceptance runs its procedures and daemon-equivalence check offline in an image containing both Git and Python.
• Release evidence hashing excludes Git-ignored build outputs while still including tracked and nonignored source inputs, so clean tag checkouts reproduce locally generated evidence. |
| 1.2.12 | 2026년 8월 20일 | — | 64비트 ZIP 릴리스 노트### Security
• Upgraded the Hugging Face HTTP dependency chain to eliminate `RUSTSEC-2026-0258` from the inherited `h2` dependency.
### Fixed
• CLI search, task context, and MCP now preserve brace-alternative globs, mixed path filters, character classes, and escaped commas.
• Semantic filtering retains include-glob alternatives and filename-based language overrides without incorrectly narrowing complex patterns.
• Linked Git worktrees complete background neural enhancement and safely share base-index search leases.
• Neural query caches invalidate when model identity changes, watcher failures are retried, regex candidate coverage is complete, and index storage stays excluded from indexed workspaces.
### Performance
• Reuse embeddings when unchanged source chunks shift and keep AST chunk generation bounded.
• Seek directory-scoped and selective glob searches through indexed SQLite ranges instead of scanning candidate paths.
• Retain hot query, neural, readiness, workspace, and search-context entries with bounded LRU caches.
• Adapt Tantivy writer parallelism and memory to changed source size, reducing measured fresh-index latency by 22% at 30,001 chunks and 33% at 100,001 chunks.
• Speed up all-workspace discovery and avoid redundant generated-corpus benchmark compilation.
### Testing
• Required CI now enforces lexical/hash and verified neural retrieval relevance, including nDCG, MRR, candidate recall, and zero-hit thresholds.
• Fresh-index profiling reports individual SQLite, Tantivy, vector-counting, merge, and publication phases.
• CI workflows cancel superseded pull-request runs and distinguish every platform/backend matrix job. |
| 1.2.11 | 2026년 8월 14일 | — | 64비트 ZIP |
| 1.2.6 | 2026년 7월 19일 | — | 64비트 ZIP |