• v0.41.53 59b8bc3d2d

    code-index v0.41.53
    All checks were successful
    CI / cargo doc (intra-doc links) (push) Has been skipped
    CI / Grammar rebuild from source (nightly) (push) Has been skipped
    CI / OSS corpus tier-3 scale (nightly) (push) Has been skipped
    CI / cargo test (push) Has been skipped
    Package CI / package-corpus (svelte) (push) Successful in 2s
    CI / cargo test (daemon transport) (push) Has been skipped
    CI / Plugin path cost + pool throughput (nightly) (push) Has been skipped
    Package CI / package-corpus (ruby) (push) Successful in 2s
    CI / Report scheduled failures (push) Has been skipped
    Package CI / package-corpus (python) (push) Successful in 3s
    Package CI / package-corpus (rust) (push) Successful in 3s
    Package CI / package-corpus (xaml) (push) Successful in 1s
    Package CI / package-corpus (vue) (push) Successful in 3s
    Package CI / package overhead budgets (nightly, one package at a time) (push) Has been skipped
    Package CI / package-corpus (typescript) (push) Successful in 3s
    Package CI / package-corpus (timeline) (push) Successful in 3s
    Package CI / Report scheduled failures (push) Has been skipped
    Pilot plugin compatibility / Fetch the pinned runtime once (push) Successful in 17s
    Pilot plugin compatibility / Pilot compatibility (csharp) (push) Successful in 9s
    Pilot plugin compatibility / Pilot compatibility (timeline) (push) Successful in 11s
    Pilot plugin compatibility / Pilot compatibility result (push) Successful in 1s
    Release Build / Generate Version (push) Successful in 7s
    Release Build / Required CI green (push) Successful in 29s
    Release Build / Build linux-aarch64 (push) Successful in 11m42s
    Release Build / Build windows-x86_64 (push) Successful in 26m33s
    Release Build / Build linux-x86_64-musl (push) Successful in 16m36s
    Release Build / Build linux-x86_64 (push) Successful in 17m39s
    Release Build / Assemble the release archives (push) Successful in 41s
    Release Build / Windows archive smoke (msvc) (push) Successful in 54s
    Release Build / Seed the package channel (push) Successful in 12s
    Release Build / Create Forgejo Release (push) Successful in 26s
    Pilot plugin compatibility / Pilot scope (push) Successful in 12s
    CI (Windows) / changes (what this run must test) (push) Successful in 17s
    CI (Windows) / fmt + clippy + build + test (windows) (push) Has been skipped
    CI / changes (what this run must test) (push) Successful in 18s
    Package CI / package suites (clippy) (push) Has been skipped
    Package CI / changes (which packages this run must test) (push) Successful in 18s
    Package CI / package (csharp) (push) Successful in 1s
    Package CI / package (php) (push) Successful in 2s
    Package CI / package (svelte) (push) Successful in 1s
    Package CI / package (rust) (push) Successful in 1s
    Package CI / package (javascript) (push) Successful in 3s
    Package CI / package (ruby) (push) Successful in 4s
    Package CI / package (python) (push) Successful in 3s
    Package CI / package (timeline) (push) Successful in 2s
    Package CI / package (vue) (push) Successful in 2s
    Package CI / package (typescript) (push) Successful in 2s
    Package CI / package (xaml) (push) Successful in 3s
    CI / cargo fmt (push) Successful in 26s
    CI / cargo clippy (push) Has been skipped
    Package CI / package-corpus (php) (push) Successful in 2s
    CI / cargo check (MSRV 1.99.1) (push) Has been skipped
    CI / cargo check (windows-gnu) (push) Has been skipped
    CI / cargo test (abi, 32-bit + wasm32) (push) Has been skipped
    CI / cargo deny (push) Has been skipped
    CI / OSS corpus (tier 1) (push) Has been skipped
    Package CI / package-corpus (javascript) (push) Successful in 3s
    Package CI / package-corpus (csharp) (push) Successful in 4s
    CI / CI lane wall-clock headroom (push) Has been skipped
    CI / guest crates (fmt, clippy, doc) (push) Has been skipped
    Stable

    buildagent released this 2026-11-14 11:56:23 +01:00 | 0 commits to master since this release

    code-index v0.41.53

    Build: v0.41.53+2639

    Installer: install.sh and checksum. Both come from this release commit. To pin the installed binaries too, run it with --tag v0.41.53.

    Windows installer: install.ps1 and checksum, from the same release commit. It installs AND updates — the same code does both — verifies the archive against its published .sha256 before unpacking, refuses hostile archive members (absolute paths, .. escapes, symlinks and reparse points, which Expand-Archive does not protect you from), and grants nothing when it installs a package: the bytes go into the machine's store and the approving line is PRINTED for you to run from inside a project. -Help lists the flags; -Tag v0.41.53 pins the binaries.

    Four-binary release: code-index-mcp (MCP stdio bridge — the usual entry), code-index-daemon (long-lived watcher + RPC server, auto-spawned), code-index-plugin-host (bounded worker for plugin packages, spawned by the daemon), and code-index (CLI: init, index, watch, doctor, link, plugin).

    Compared with v0.41.52:

    Removed

    • code-index skill is removed (operator decision, #571). The agent skill is served over MCP as skill://code-index/SKILL.md, with skills/list and skills/get; a client that does not read MCP resources can save that resource's text itself. code-index doctor no longer compares an installed copy. Running the old command gives the ordinary "unrecognized subcommand" error.

    Announced for the next release

    • Six configuration keys have no effect: watcher.mode, watcher.poll_interval_ms, logging.level, logging.format, workspace.name, plugins[].file. This release still accepts them; the warning now says they will be refused from the next release on (#570). Remove them from .code-index.toml.

    Daemon restarts and filters (#584, a customer report)

    • A filter was refused as "the running daemon predates the … filter" for the rest of a session after one call had met a daemon that was just starting. The client remembered a failed capability request as "this daemon has no filters". It now remembers only a real answer, for one daemon identity, and asks again after a reconnect to another daemon. A request that fails for a transient reason returns that reason.
    • Every "the daemon is older than this client" verdict now needs the daemon's own "unknown method" answer; an unrelated error whose text contained those words could produce it before.
    • A call from an existing session that arrives while another client's replacement daemon is starting was refused at once. It now waits for that daemon, at most 10 s and never longer than the call's own budget, and answers. The same wait covers a daemon that was killed and has not released its lock yet: when it does, the call starts the replacement itself. A call that still gives up is a retryable daemon_restarting refusal in every case; it was an internal_error when the previous daemon had been killed.
    • Every daemon_restarting refusal carries retryable: true, waited_ms and startup_phase.
    • While an index starts, state_detail names the startup phase and the time spent in it (language_enablement, parity_enablement, bundled_adoption, package_discovery, indexing, census; listed in docs/operations.md).

    Background update (#586, #520)

    • With nothing to update, the background update that runs after a daemon start installed and conformance-checked every catalog package again, twice, and read every installed archive many times: 43 s on a machine with 45 installed packages, at every daemon start, since v0.41.24. A package that is already in the store with a valid verdict for this engine is no longer installed or checked again, each package is handled once per run, and a run reads an archive at most once. Measured on the same store: 43 s before, 1.4 s after; 584 complete archive reads before, 7 after. The run prints what it did (update_work 7 compared, 7 already verified, 0 installed, 0 conformance-checked).
    • The background update held the project's plugin lock for its whole run, so approve and link add were refused with plugin_mutation_busy for minutes. It now prepares without the lock and takes it only to publish, after checking that approvals, links, enablement and the automatic policy did not change meanwhile.
    • A plugin writer that finds the lock held waits for it (up to 120 s) instead of failing at once; a refusal names the holder, its operation and how long it has held the lock.
    • plugin status and plugin doctor read each installed archive once (doctor: 164 reads before, 45 after, on that store).

    Configuration file and links (#585)

    • code-index link add on a project without .code-index.toml created the file from a template that contained enabled = [], which is an explicit decision: every language of the project stopped being indexed. The template no longer carries a language decision; a file without the key means the same as no file. A test drives every code path that writes the file.
    • link add records relationship = "worktree" when the target is another checkout of the same Git repository and no relationship was given. link remove prints the entry it removed.

    Answers while the index is not settled

    • search_text, search_symbols, file_outline, read_code and the other tools that do not depend on resolved references are no longer refused with index_incomplete while references are still being resolved. Tools that do depend on them keep the refusal or the floor qualification. Each tool declares which kind it is, and a test covers the whole list.

    Resolution (#531, step 1)

    • A declaration inside a function body (Rust, C#, JavaScript, TypeScript) is no longer a resolved target for a reference outside that body. On the nine pinned corpus repositories this removes eight wrong binds in Rust; eight further wrong binds there are method calls on function-local types and remain. Package profiles gain the field body_local_names. On the larger repository rust-analyzer the rule removes one wrong bind as well: a call of a closure parameter f had been bound to a function f nested in another method of the same file.

    CI and measurement (#582)

    • A red scheduled run of ci.yml or package-ci.yml comments on the tracker with the failed jobs and their logs; a repeat of the same failures is folded into the existing comment.
    • The quiet-runner check before a measurement read a file that exists only inside a container, so on a plain Linux host no overhead measurement could start. It now reads the CPU limits of the process's own cgroup and its ancestors.
    • A package overhead measurement that ends on a saturated runner (more runnable work than processors) is repeated once and otherwise reported as NOT MEASURED (contended), red, instead of as a budget failure.
    • cargo test no longer waits for cargo deny; download steps retry; a measurement that was refused admission is red and says NOT MEASURED.
    • A test that waits for an index to settle prints the state history, the progress fields and the end of the child's stderr when it gives up.

    Qualification

    • One full local gate run on the integrated tree (67 steps: every PR job and every nightly-only job of the four workflows except the i686 qemu ABI test). Its findings were fixed and the affected steps run again.
    • Four CI rounds on the pull request. Two found a defect of this release each, both fixed: a new test read a log line that CI's environment filters out, and cargo install cargo-deny had been put behind a 600 s download timeout. Two failures were time limits on a slow runner that are older than this release (#589 and a test's settle deadline). The fourth round is green on all four workflows, 44 jobs, Linux and Windows.
    • Dispatched runs on the release head for the nightly-only jobs: ci.yml green in all 17 jobs; package-ci.yml green in all 69 package and corpus jobs, with the overhead job red on the Ruby budget only (see Remaining scope) and the red-run report printed in dry-run mode.
    • No corpus baseline, cost record or budget was changed, except one tier-3 bind count recorded with its reason (a wrong bind the body-local rule removes).

    Remaining scope

    • #586: languages enable for several languages, plugin add and languages list still read installed archives more often than needed (77, 29 and 7 complete reads on a store with 45 archives). Not a regression of this release.
    • #570: six test timing hooks are still read by release binaries; making them debug-only is prepared and follows in the next release.
    • #584: a newly started MCP server, the CLI query and the hook keep their own waiting rules while a daemon starts.
    • #531: method calls on function-local types, Python nested declarations and receiver identity.
    • #582: the Ruby package's warm overhead budget fails in about half of all runs (1.100 against a limit of 1.10 in the dispatched run on this release, 1.161 the night before on the previous release, 1.115 / 1.041 / 1.116 / 1.063 in four quiet local runs). Nothing in this release touches Ruby's warm path; the measurement is to be made stable next. The overhead job has no job-wide time limit.
    • #588: a worker deadline during a file's first extraction stores the file without symbols or calls, and it is not extracted again until it changes. Older than this release; fix prepared for the next one.
    • #589: a precompile that takes more than 30 s of wall-clock time on a slow machine refuses a valid language package as extractor.malformed until the next start. Older than this release; fix prepared for the next one.

    Downloads

    Four platforms are built for every release. The table below says which ones THIS release published.

    Platform Archive
    Linux x86_64 (glibc) code-index-v0.41.53-linux-x86_64.tar.gz
    Linux x86_64 (static/musl) code-index-v0.41.53-linux-x86_64-musl.tar.gz
    Linux ARM64 code-index-v0.41.53-linux-aarch64.tar.gz
    Windows x64 code-index-v0.41.53-windows-x86_64.zip

    First-party language packages

    Every archive carries code-index-packages/: the first-party language packages at the versions the package channel had published when this release was cut — de.h-dv.csharp-0.1.11 de.h-dv.javascript-0.1.6 de.h-dv.php-0.1.6 de.h-dv.python-0.1.5 de.h-dv.ruby-0.10.2 de.h-dv.rust-0.1.8 de.h-dv.typescript-0.1.7 — each signed by the key below and verified at the install door. code-index languages enable <lang> adopts the bundled package offline. A package is released by its own pkg/<id>/v<version> tag, whose release carries its .cip, .cips and digest, and code-index plugin update <id> reads the package channel, so a package fix reaches you without a new core release.

    These release binaries contain no native language parsers. Under auto, enabled languages use their approved packages. First start adopts bundled packages verified against this build's own publisher keys; existing approvals and enablement remain authoritative. If your project explicitly pins a language to builtin, switch it with code-index languages owner <lang> auto; an unavailable builtin is refused rather than silently ignored. To enable languages explicitly:

    code-index languages enable csharp
    code-index languages enable javascript
    code-index languages enable php
    code-index languages enable python
    code-index languages enable ruby
    code-index languages enable rust
    code-index languages enable typescript
    

    About that key

    sha256:1cb03259a8c870b6db02360abd9351e17e67724d1f8c3509d85c4bf6b06fa72c is a long-lived Ed25519 key held as a secret in this project's CI, used to sign released packages automatically, and it is compiled into the binaries in this release. It signs every first-party package. That trusts this project's release pipeline, not only its maintainers: anyone who can run a release workflow here can produce a package that verifies under it. It adds nothing you had not already granted — the bytes are inside the program you are running, so forging that anchor means forging the binary — but you are entitled to know it is there before a package installs rather than after.

    There is no expiry — deliberately, because offline installations must not break on a timer — and withdrawal is on your side and works: code-index plugin trust remove sha256:1cb03259a8c870b6db02360abd9351e17e67724d1f8c3509d85c4bf6b06fa72c. A compiled-in key has no file to delete, so that writes one instead, carrying denied = true; the key stops verifying at the next load, plugin trust list shows it marked [DENIED], and deleting that file (the command prints its path) is the only undo. If the key is ever rotated, the new fingerprint is published here and in tests/packages/first-party.fingerprint, and a build that predates the rotation will not trust it.

    macOS is not currently built. No x86_64-apple-darwin or aarch64-apple-darwin archive is published — macOS users should build from source (cargo build --release). This is a deliberate deferral, tracked in #59; no date is promised.

    Wire into Claude Code

    { "mcpServers": { "code-index": { "command": "/usr/local/bin/code-index-mcp", "args": ["--root", "/path/to/your/project"] } } }
    

    SHA256 checksums (.sha256 files) available for every archive.

    Downloads