Release v1.3.3 - #211
Merged
Merged
Conversation
…sages
The agent avoided find_impact for "who calls X?" because its own tool
description, INSTRUCTIONS_TEMPLATE, and README all actively routed away
from it ("C# only; use find for other languages"). Re-frame so find_impact
is the recommended tool, with find(kind=usages) an explicit lexical
fallback only when no SCIP backend is installed.
- find_impact description: lead with "right tool for who calls X";
document per-language SCIP backends (C# today); fallback only when the
response reports no backend.
- find description (usages): note lexical/text-based; prefer find_impact
for IDE-precise call-graphs.
- INSTRUCTIONS_TEMPLATE routing + rules: try find_impact first; fall back
to find(kind=usages) only if find_impact reports no backend.
- README find_impact section: recommended-tool framing + per-language SCIP
+ lexical-fallback-only-then.
The /// doc-comment above the #[tool] attribute still carried the old "use find as a text-based fallback" framing, slightly inconsistent with the reframed tool description directly below it. Align the rustdoc to the same story: recommended tool for "who calls X?", per-language SCIP backends, lexical fallback only when no backend reports ready. Not agent-visible (rustdoc is source-level, not shipped to MCP clients); source-level consistency only.
…(C1+C3+C4) v1.1.31 dropped both macOS variants from the release because cp failed with 'fcopyfile failed: Input/output error' during the with-csharp packaging step. Root cause: APFS disk pressure (target/ ~5-10GB + dotnet self-contained ~80MB on a 14GB runner) makes fcopyfile() return EIO instead of ENOSPC. Three-layer fix on build-macos only: - C1: mv the built binary out of target/ (atomic rename, no copyfile syscall), then cargo clean to free ~5-10GB before .NET/packaging. - C3: retry loop (3x, 5s sleep) on tar and cp; set -e safe via if/then; final test -f forces hard failure if all attempts fail. - C4: df -h / logging before/after clean and on every retry, for post-mortem diagnosis. Windows/Linux untouched — different runners (more disk) and different copy syscalls (no fcopyfile).
macOS release-build cp EIO fix (C1+C3+C4). See commit a68b022.
Replace scattered Deferred/Still-open/Proposed-redesign sections with one unified 'Open TODOs' section. Each item is a checkbox with stable ID (T1-T4, C1-C2, #162, D1) so progress is trackable across commits. - T1-T4: code work (dead wait_until_indexed, build_remote_search_body extract, remote_project_cache persist, 0-chunk status bug) - C1-C2: cloud infra (indexer trigger automation, single-app collapse redesign) - #162: protobuf-as-language feature request - D1: preventive Linux cp-retry pattern - find_impact + TS SCIP marked as separate worktrees (do not touch here) - CI security-scan workflow excluded (not codesearch-specific) - OOM historical context preserved as sub-section for C1/C2 reference
Add scip + protobuf crates and src/symbols/scip_proto.rs, parsing standard SCIP protobuf (.scip) files emitted by Sourcegraph indexers (e.g. scip-typescript) into the same ScipIndex shape the C# JSON parser produces, so downstream storage/resolution code is reusable. - parse_scip_protobuf(): iterates documents/occurrences, skips empty symbols and malformed ranges - decode_range(): SCIP compact range (3-elem single-line / 4-elem multi-line, 0-based) -> 1-based (start_line, end_line) - role_to_kind(): maps standard SCIP SymbolRole bitmask (distinct from the C# helper's custom JSON role encoding) to definition/ import/write/call/reference 7 unit tests cover round-trip parsing (1 def + 3 calls across 2 files), range decoding edge cases, role priority, and malformed input handling. cargo clippy -D warnings clean. Part of TypeScript SCIP indexing (stage 1/6, MVP plan in PLAN_TYPESCRIPT_SCIP.md).
- Add TypeScriptSymbolIndexer (src/symbols/typescript.rs) implementing the SymbolIndexer trait, mirroring csharp.rs but simplified for the single-pass SCIP protobuf model (no lazy ref resolution, no ref cache table - scip-typescript emits defs+refs in one pass). - RebuildScope::Files falls back to Full for TS (scip-typescript has no file filter) - documented decision. - LMDB table-sharing-with-C#-if-same-db_path documented as an MVP limitation in a rebuild() comment. - Register TypeScriptSymbolIndexer in SymbolIndexerRegistry::new(). - Add LANG_TYPESCRIPT, SCIP_TYPESCRIPT_HELPER_ENV, SCIP_TYPESCRIPT_REBUILD_TIMESTAMP_KEY constants. - Remove stage-1 #![allow(dead_code)] from scip_proto.rs now that parse_scip_protobuf is wired in. - 6 new unit tests, all passing.
Map ts/tsx/mts/cts file extensions to LANG_TYPESCRIPT in find_impact's language auto-detect logic, mirroring the existing cs -> LANG_CSHARP mapping. Update the find_impact tool description (doc comment + MCP description string) and the no-indexer-installed message to mention TypeScript/scip-typescript alongside C#/scip-csharp.
Add a parallel .ts/.tsx/.mts/.cts file-tracking branch in start_file_watcher (src/index/manager.rs), mirroring the existing hardcoded C# dispatch (Option B design decision from PLAN_TYPESCRIPT_SCIP.md $8: a parallel branch, not a generic registry loop). - New is_ts_extension() helper checks ts/tsx/mts/cts extensions. - Modified/Deleted/Renamed events now also populate ts_files_modified / ts_files_deleted / ts_last_event_time, cleared on branch-change refresh alongside the existing cs_* state. - New debounce-flush block (SCIP_TYPESCRIPT_DEBOUNCE_MS, new constant mirroring SCIP_CSHARP_DEBOUNCE_MS = 60s) dispatches to registry.get(LANG_TYPESCRIPT). Unlike C#, there is no per-.csproj grouping (TypeScript MVP only supports a single root tsconfig.json), so any tracked change triggers one full rebuild (RebuildScope::Full) directly instead of RebuildScope::Files -- this is more honest than passing Files, since TypeScriptSymbolIndexer::rebuild() falls back to Full internally anyway. - No CSharpRebuildNotifier equivalent is threaded through for TS (that type is C#-specific); the TUI indexing-active callback (indexing_cb) is still signaled around the rebuild. Validation: cargo clippy --all-targets -D warnings clean; cargo test --lib --bins: 1214 passed, 36 ignored.
wait_until_indexed() in docker/entrypoint.sh was superseded by wait_active_build_done() and had no remaining callers (only stale comment references). Delete the dead function and repoint the surrounding comments at the function actually in use. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
federated_search() and federated_project_search() each built an identical serde_json request body for a remote peer, differing only in the limit value. Extract a shared build_remote_search_body(request, mode, limit_value) helper so the two bodies can no longer drift apart. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
remote_project_cache existed on ReposConfig but was never read or written anywhere. Add cache_remote_projects()/ cached_remote_project_aliases() and wire `codesearch remote available <peer>`: write-through cache the peer's alias list on a successful /status query, and fall back to the last-known list instead of hard-failing when the peer is unreachable. reconcile() now also prunes cache entries for peers that no longer exist, matching the existing hygiene pattern for remote_mounts. Adds a unit test covering the write/read/prune roundtrip. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- New tests/fixtures/ts-sample/: root tsconfig.json + src/math.ts (1
definition: `add`) + src/consumer.ts + src/other.ts (3 call-sites of
`add` across 2 files), mirroring the C# SmallSolution fixture shape.
- New tests/symbols_typescript_test.rs mirroring symbols_csharp_test.rs:
- test_indexer_returns_empty_when_db_missing: LMDB empty-DB path never
panics, returns Ok(empty) or a clean Err.
- test_applies_to_requires_root_tsconfig: applies_to() gating on a
root tsconfig.json.
- test_fixture_directory_shape: sanity-checks the fixture's shape used
by the gated integration test.
- test_typescript_pipeline_ts_sample_roundtrip (gated behind new
`typescript_helper_integration` feature, requires npx/scip-typescript
or CODESEARCH_SCIP_TYPESCRIPT): full pipeline round-trip — rebuild()
on the fixture, then find_references("add") asserts exactly 1
definition in math.ts and >=3 call-sites spanning consumer.ts +
other.ts. This is the acceptance test for find_impact on a TS symbol
returning all call-sites, per PLAN_TYPESCRIPT_SCIP.md §9.
- Cargo.toml: new `typescript_helper_integration` feature flag, mirroring
the existing `csharp_helper_integration` flag.
Validated: cargo clippy --all-targets -D warnings clean; cargo test
--test symbols_typescript_test -> 3 passed, 1 ignored (gated test
correctly skipped without scip-typescript); cargo test --lib --bins ->
1214 passed, 36 ignored (no regression).
This is the final stage (6/6) of the TypeScript SCIP indexing MVP.
Review of the T3 commit flagged that `codesearch index list --remote <peer>` (run_remote_list) was structurally the same one-shot CLI lookup as `codesearch remote available` but didn't write-through or read the remote_project_cache — a clear symmetric gap given both commands call client.list_repos() for the same purpose. - run_remote_list now caches the peer's alias list on success and, on Unreachable, degrades to an alias-only "last known projects" listing (json and human output) instead of hard-failing, mirroring `remote available`'s fallback. HttpError still bails as before. - Extracted print_remote_project_row() and reused it across all three mounted/cached row-printing loops (Available's live + cached branches, and the new run_remote_list fallback) to remove the duplication the review also flagged as a nice-to-have. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Final cross-stage review (Phase 4) found the TypeScript SCIP pipeline
non-functional: Command::new("npx") is never resolvable on Windows
because std::process::Command does not consult PATHEXT the way cmd.exe
does (npx only exists as npx.cmd/npx.ps1). Additionally the unscoped npm
name "scip-typescript" is a squatted security placeholder with no
functionality; the real Sourcegraph package is the scoped package
@sourcegraph/scip-typescript (bin name scip-typescript).
Fix: route the npx invocation through "cmd /C" on Windows, and invoke
npx -y @sourcegraph/scip-typescript instead of the bare unscoped name.
Verified: the previously-ignored gated integration test
(test_typescript_pipeline_ts_sample_roundtrip, --features
typescript_helper_integration) now passes end-to-end: 1 definition +
3 call-sites across 2 files, confirming find_impact on a TS symbol
returns all call-sites as required by the acceptance criterion.
cargo clippy --all-targets -- -D warnings: clean.
cargo test --lib --bins: 605 passed, 0 failed, 18 ignored.
Final review flagged fuzzy_symbol_match/open_scip_env duplication between csharp.rs and typescript.rs as an Important, non-blocking finding. Tracking as T5 in the Open TODOs backlog rather than refactoring stable, already-tested csharp.rs at the tail end of this branch — matches the reviewer's own accepted resolution path.
Two lib tests flaked in the pre-push QC gate but passed in isolation:
- watch::test_git_head_watcher_detects_commit_advance_without_head_change
- db_discovery::repos::captures_git_remote_on_register
Root cause: during a push the running `codesearch serve` polls git on this
repo (HEAD watcher + custom-KB reindex) while the Windows AV/Search-indexer
holds .git handles. Concurrent git subprocesses then transiently fail, so a
commit hash / captured remote resolves to None and the assertions trip. Same
class as the already-ignored relocation tests.
Two-part fix:
1. Harden the un-retried git spawns, mirroring git_remote_url's existing
retry pattern — this also improves the real serve GitHeadWatcher:
- watch::get_current_commit_hash (production) retries transient spawn
failures instead of spuriously reporting a HEAD change with a None hash.
- watch test helper run_git retries transient spawn failures.
- bump git_remote_url + init_git_remote spawn-retry budgets 5->8.
Non-zero git EXIT codes are left untouched on purpose ("remote origin
already exists" is harmless).
2. Mark the two tests #[cfg_attr(windows, ignore = ...)], matching the repo's
established convention for AV/indexer-induced Windows git flakiness. The
logic is platform-independent and still runs on Linux/macOS CI.
Verified: cargo fmt/check/clippy clean; lib suite 594 passed / 20 ignored on
Windows; green 8x in a row (incl. --test-threads=24) before the ignore.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
📝 docs(mcp): recommend find_impact first for impact analysis
Investigated T4 ("0-chunk status bug + TUI i/d/f diagnostics"):
- TUI i/d/f: traced handle_key() + render_footer() in
src/serve/tui_common.rs. Footer hints match the key handler exactly
(i=info, d=doctor, n=reindex, r=remove, l=reload, q=quit). No `f`
binding exists anywhere in the codebase - the "f" in the TODO title
didn't correspond to real code. Marked resolved as a docs-only
mismatch, not a bug.
- 0-chunk status bug: traced index_status_impl, VectorStore::stats(),
with_vector_store_read_for, and force_reindex_with_stores. All read
fresh state per call; force reindex mutates the existing store
in-place rather than swapping the Arc, ruling out the stale-handle
hypothesis. No concrete defect found via static tracing - left open
with a note that it needs a live repro before any fix is attempted.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Mirror the macOS "Package with-csharp" step's C3 retry pattern in the Linux with-csharp packaging step (release.yml): retry the binary cp up to 3x with df -h diagnostics on failure, plus a hard test -f check after the loop. Preventive consistency only - the Linux runner has ~84GB disk and ext4 (no fcopyfile EIO failure mode like APFS under pressure, which is what broke v1.1.31's macOS packaging), so there's no observed Linux failure being fixed here. This just aligns both platforms so a transient copy error fails the same retried way instead of one platform hard-failing on the first attempt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
chore: T1+T2+T3 cleanup - dead code, dedup, remote-project cache persistence
…ency fix(release): D1 - apply cp-retry pattern to Linux with-csharp step
…i-docs-cleanup # Conflicts: # AGENTS.md
docs(agents): T4 investigation - TUI i/d/f doc mismatch resolved, 0-chunk status traced
…eline Opt-in via CODESEARCH_TS_TEST_REAL env var + typescript_helper_integration feature flag. Validates the full pipeline (rebuild + find_references) on a non-trivial real-world TS codebase. Never runs in normal CI.
Add per-repo TypeScript index status to the TUI and /status JSON: - RepoRow + RepoStatusInfo gain a typescript_index field - Alias column shows ' TS·' / ' TS!' / ' TS…' alongside the C# indicator - Footer shows TS helper availability (green/dark-gray) next to C# - /status JSON emits typescript_index per repo + ts_helper flag - Remote TUI deserializes the new fields (serde default for backward compat) TS status is probed directly (helper available + index dir exists → Ready) since there is no live status cache populated during TS rebuilds yet; C# status_cell embedding is left C#-only — the alias column is the canonical multi-language indicator.
…-scip-indexing # Conflicts: # AGENTS.md # src/mcp/mod.rs
docs: drop C1/C2 cloud TODOs (decided against)
… freshness probe + federated 503 retry + index-rm hardening
…ase for release PR
chore: back-merge release/v1.3.0 into develop
… runners indexing_route_answers_json (PR #203) was green locally but red on the Windows CI runner: ReposConfig::register canonicalizes before storing (repos.rs L437), while the /indexing query used the raw tempdir path — on CI the temp root sits under an 8.3 short name (RUNNER~1) that only canonicalize resolves, so covered=false and the assert failed. Same trap and same fix as remove_order_tests' make_proj (PR #197). Note: the embed::cache panic line in the same CI log is the INTENTIONAL caught panic ("simulated mid-test failure") inside catch_unwind — log noise, that test passes.
fix(tests): canonicalize indexing-route fixture for 8.3 short-name CI runners
…nestly (todo #48) The Layer-2 mechanism (CLI delegation via DELETE /repos/:alias, serve-side SharedStores eviction + shutdown awaits closing the LMDB env before the retry-delete) was already in place — but the CLI endpoint of that IPC path checked only status().is_success(). Serve deliberately answers 200 with db_deleted:false ('removed_db_locked') when a transient Arc<SharedStores> holder outlasts the lock-class retry budget (the BUG2 honest-outcome contract), and the CLI flattened that to plain success, printing 'DB deleted.' for files still on disk. try_delegate_rm_to_serve now parses the response payload into a ServeRemoval { alias, project_path, db_deleted, db_delete_error }; on the locked outcome remove_from_index prints a warning naming the leftover dir + reason + the recovery (re-run — alias is gone from repos.json so the next run finishes via the local file-delete path). Stays Ok deliberately: serve already unregistered, so the Layer-1 'repos.json was NOT modified' error text would be false here. Regression test delegated_removal_carries_locked_db_outcome pins the IPC boundary against a 200/removed_db_locked mock serve (mutation-verified: hardcoding db_deleted=true fails it). remove_order_tests' seed helper now also pins CODESEARCH_SERVE_HOST to loopback — the delegation resolves its probe host from that var. Validation: cargo fmt --check clean; clippy --lib --tests -D warnings clean; --lib --bins 597+593 passed / 0 failed; caller_facing_literals + store_err_swallow_detector green.
…nal resolution to use `tool_input.path`
…ed DB delete remove_repo's lock-class delete retry now distinguishes in-process holders from external ones: after a lock-class failure it checks lmdb_registry::open_holders_under(db_path) and, when THIS process still holds an env under the dir, polls await_lmdb_release (100 ms cadence, bounded by DB_DELETE_RETRY_BUDGET_SECS) until the registry drains — then retries immediately instead of blind-backoffing against a directory that cannot delete yet. External-holder failures keep the exponential backoff. Wires up the orphaned WIP pieces from 1086e91 (open_holders_under + DB_DELETE_ENV_RELEASE_POLL_MS) into their intended call site. Tests: registry unit tests (at/below path, component-boundary safety, drain-on-drop, missing path) + await_lmdb_release drain/deadline arms.
…emoval
try_delegate_rm_to_serve reused the 3 s health-probe client for the
DELETE /repos/:alias request, but serve's remove_repo can legitimately
run 2x BG_TASK_COOPERATIVE_TIMEOUT_SECS (cooperative FSW/index joins)
plus the full DB_DELETE_RETRY_BUDGET_SECS (60 s) lock-class retry window
while transient holders release. The CLI's own timeout fired mid-removal
('delete failed: operation timed out'), dropped it onto the local path
whose delete then failed on the files serve was still tearing down —
making 'stop serve and re-run' the only working flow (todo #48 L2).
The DELETE now gets its own client sized from the constants
(60 + 2*5 + 10 = 80 s); the health probe keeps the short timeout so
Down/Unresponsive classification stays fast. RM_DELEGATE_DELETE_MARGIN_SECS
doc updated to match the arithmetic it participates in.
Test: stand-in serve sleeping 4 s past the old timeout must be waited
out (mutation-verified: reintroducing the 3 s client fails the test).
…n test helper) - cargo fmt --all over the stage 1+2 diff (rustfmt collapsed several line wraps the manual edits introduced). - lmdb_registry test helper make_opts_sized now sets BASE_ENV_FLAGS on every test env open, per the AGENTS.md rule that every open carries the baseline flags; explicit set in the NO_TLS test kept (documents intent, same value).
…l LMDB env index_rm_deletes_db_while_serve_holds_real_lmdb_env: the hard variant of the todo #48 L2 acceptance. Serve opens the repo via the production try_open_stores path (brand-new DB dir created for real), holds it as a Warm RepoState with NO extra Arc clone, and remove_from_index must still delete the dir in one delegated shot without stopping serve. Asserts the eviction itself (repos-map entry gone) rather than a post-delete registry query: open_holders_under on a deleted path fails canonicalize and by design answers 'no holders', making that assert vacuous on Linux — mutation-verified (skipping repos.remove sailed through the registry assert; the repos-map assert catches it, and on Windows the same mutation fails the dir-gone assert because the mmap'd files refuse deletion while held). Also pins: repos.json loses the entry, later remove_repo gets a clean 'Unknown alias' (no zombie stores).
…st envelope spawn_rm_delegation_test_serve deduplicates the trap-sensitive hermeticity envelope (env-vars-before-save ordering, .port() not SocketAddr, SERVE_HOST_ENV loopback pinning, router + spawn + readiness) shared by the two Layer-2 e2e tests. The EnvRestore guard is RETURNED (dropping it inside the helper would unpin the vars before the delegation runs); the helper stays in serve::tests because the routed handlers are private to serve. Readiness loop now fails loudly on timeout instead of exiting silently. Header doc of the real-env test reworded to not overclaim a registry-drain observation the body itself explains is vacuous post-delete.
… .docs/ Root markdown is now limited to the allowlist (AGENTS.md, AGENTS.develop.md, CLAUDE.md, README.md, README_CSharp.md, CHANGELOG.md, RELEASING.md). Diagnosis write-ups, plans, test scenarios and worklogs move to the gitignored .docs/ folder (content preserved locally, untracked); the tracked docs/ folder is dissolved. Rule documented in AGENTS.md "Root file hygiene (markdown)" and AGENTS.develop.md "Key conventions for agents"; .gitignore lists .docs/ explicitly. CLAUDE.md already is the one-line pointer to AGENTS.md. Review-fixes: - [Important] AGENTS.md claims a pre-commit root-md guard that doesn't exist yet -> guard added in the next commit on this branch (stage 2) - [Minor] .gitignore comment said the .*/ rule is "below" when it is above -> corrected - [Minor][pre-existing] src/serve/tests.rs doc-comment pointed at docs/diagnose-federated-keep-warm.md (a path that never existed) -> now .docs/DIAGNOSE_FEDERATED_KEEP_WARM.md
Rejects any commit that introduces (adds/copies/renames) a root-level *.md outside the allowlist (AGENTS.md, AGENTS.develop.md, CLAUDE.md, README.md, README_CSharp.md, CHANGELOG.md, RELEASING.md); the message points at .docs/ and AGENTS.md "Root file hygiene (markdown)". Only introductions are checked (diff-filter=ACR); dot-folders are out of scope by construction. .githooks/ README.md documents the guard; CHANGELOG gets a new pending [1.3.1] section (Cargo.toml already builds 1.3.1). Verified by direct hook runs: stray root add blocked (rc=1), rename allowlisted->stray blocked (rc=1), allowlisted modify / nested add / .docs add all pass (rc=0). Review-fixes (from stage 1 review, resolved here): - [Important] AGENTS.md claimed a pre-commit root-md guard that did not exist -> guard now exists in .githooks/pre-commit with matching allowlist; .githooks/README.md table row updated Review-fixes (from stage 2 review round 1, resolved here): - [Important] non-ASCII root md names escaped the guard: core.quotePath (default true) C-quotes them, so the *.md case missed the quoted trailing quote char -> diff now runs with -c core.quotePath=false; verified DIAGNOSE_ü.md now blocked rc=1 [Debt, recorded not fixed] allowlist restated in 3 live sites (pre-commit, .githooks/README.md, AGENTS.develop.md) — documentation-inevitable duplication, stable at 7 files.
Replace the ${var,,} lowercase expansion (bash >= 4 only; fatal "bad
substitution" on stock macOS bash 3.2, which would block every commit
containing a root-level file) with tr 'A-Z' 'a-z'. Verified: EVIL.MD and
DIAGNOSE_ü.md still blocked rc=1, allowlisted modify rc=0, clean tree rc=0.
Review-fixes:
- [Important] guard used ${staged,,}, unsupported on macOS bash 3.2 -> tr-based lowering, behavior unchanged
- [Debt, corrected count] allowlist restated in 5 live sites (pre-commit, .githooks/README.md, AGENTS.md, AGENTS.develop.md, CHANGELOG.md), not 3 as previously recorded
…old [1.3.1] entry into pending [1.3.2] per changelog convention; keep serve-tests doc-comment fix on top of new tests) # Conflicts: # CHANGELOG.md
chore: root-md cleanup + pre-commit allowlist guard
…e kept exactly at develop per AGENTS.md -s ours recipe)
…s Cargo.toml 1.3.3)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release v1.3.3 (patch).
Fixed
index rmagainst a running serve now completes the file delete without stopping serve (todo release: 1.0.94 #48, Layer 2): dedicated DELETE client timeout derived from serve's retry budgets, registry-aware lock-class retry.index rmno longer claims "DB deleted" when serve could not delete the files (todo release: 1.0.94 #48):removed_db_lockedoutcome now surfaces an honest warning + recovery path.grep-guard.shresolves Grep coverage from the search target and serve-hub registration instead of hook cwd /.codesearch.dbpresence (issue grep-guard: coverage is resolved from the hook's cwd, not the search target — absolute-path Greps bypass the guard #199).Added
pre-commithook enforces the root-md allowlist; stray root mds + tracked docs/ dissolved into gitignored.docs/(PR chore: root-md cleanup + pre-commit allowlist guard #210).CHANGELOG finalized as [1.3.3] - 2026-08-18. Tag v1.3.3 follows the merge (CI release.yml builds binaries).