Gortex v0.64.0
Released September 6, 2026.
Gortex v0.64.0 brings worktree and branch views, lower memory use, more accurate language graphs, safer source edits, and broader coding-agent integrations. These notes cover the complete range from v0.63.0 to v0.64.0, including the intervening maintenance releases.
Worktree and branch views
- Work in multiple checkouts with the right graph for each session. Linked worktrees are discovered automatically, and requests follow the session's checkout. Explicit selectors support worktree paths, Git refs, and commits. Checkout inventory makes the available views easier to inspect. #654, #754
- Keep branch results consistent. A checkout's changes take precedence over its designated family primary; deleted files mask the base copy. Search respects the selected checkout, and response metadata identifies the served view and any base-scoped analysis or fallback. Ref and commit views provide read-only committed snapshots. #654
- Edit an explicitly selected worktree safely. Coordinated single-file edits are supported when the exact requested checkout is served. Batch edits, file lifecycle operations, and LSP refactors remain restricted in these routed worktree views. #757
Lower memory use and more reliable indexing
- Bound expensive background work. Literal search excludes binary content, caps its cache, streams searches before building a hot index, and updates changed files incrementally. Watcher bursts are batched, and semantic fact processing and import resolution retain less intermediate data. #467, #530, #531
- Simplify storage and search. SQLite is now the sole graph backend, and the old in-process text-search implementation has been retired in favor of SQLite FTS. Later fixes improve query planning and receiver rebinding on existing databases. #473, #527, #750, #753
- Stay responsive and explain incomplete indexes. Status and control requests remain responsive during indexing, deferred enrichment can resume after restart, and unreadable or failed files are surfaced as coverage gaps. Fixes also address
.gitignore patterns that could accidentally exclude whole repositories. #494, #497, #629, #755
Broader language and framework coverage
- Julia gains a dedicated extractor, with follow-up improvements for constructors, module relationships, macros, and documentation. #675, #694
- C# graphs become substantially more accurate. Improvements cover receiver and awaited-call typing, records, overload arity, properties and accessors, indexers, events, partial declarations, verbatim identifiers, and local-variable scope. EF Core model attribution and C# language-server solution selection are also improved. #604, #610, #688, #732, #738
- Godot projects gain richer relationships. GDScript calls use receiver information; autoload singletons, preload aliases, scenes, resources, and signal wiring contribute usable navigation and usage evidence. #462, #470, #495
- htmx templates connect to backend routes.
hx-* and data-hx-* requests become HTTP consumer contracts in HTML, Go templates, and templ files, helping identify route usage across the frontend/backend boundary. #608
- Other language fixes fill important gaps: Swift initializers, deinitializers, and subscripts; Dart fields, enum constants, and setters; C++ templates and qualified calls; and relative, alias, and component imports in single-file component
<script> blocks. Python dunder methods no longer produce misleading dead-code findings. #536, #538, #633, #665, #601
Safer edits and clearer agent evidence
- Renames now apply their edits, with dry-run previews, checks against changed files, and parse validation. Guarded batch operations add file moves and deletes with recovery support. #468, #547
- Know whether a mutation actually committed. Optional physical read evidence and disk-verified mutation receipts expose file hashes. Receipts distinguish disk state from graph freshness, and idempotency keys make retries safer after timeouts. #554, #623, #627
- Get better-grounded answers. Localization preserves important literals and identifiers and returns richer source evidence. Usage results disclose totals and truncation more consistently, while unresolved or ambiguous calls are handled more cautiously in dead-code analysis. #602, #650, #658
Integrations, platforms, and release reliability
- Expanded agent support: a GitHub Copilot CLI adapter, richer Codex skills and subagents, and OpenCode skills, commands, hooks, and MCP setup. #586, #587
- Clearer upgrades and stronger platform support: status and doctor report CLI/daemon version mismatches, Homebrew upgrades manage a running daemon, Windows path and process handling receive broad fixes, and the full test suite runs on Windows CI. An LSP cache race that could crash the daemon is fixed. #611, #652, #756
- More dependable release verification: checksums are re-signed after Windows assets are added, and a release gate downloads published artifacts to verify their signatures against the actual published bytes. #628, #632
Upgrade notes
- Graph backend:
--backend memory is no longer supported. Applications embedding pkg/gortex must handle the error returned by New(opts ...Option) and close the engine with Close(); WithStorePath selects persistent storage. #473
- Rename behavior: rename now writes changes by default. Use
--dry-run in the CLI or dry_run: true in tool calls to preview. #468
- MCP startup: embedded fallback is opt-in through machine-global
mcp.allow_embedded: true. Otherwise, an unavailable daemon produces an explicit error. #552
- Usage pagination:
find_usages defaults to 50 results and reports totals and truncation. Set limit: 0 when an uncapped result is required. #650
Thank you, contributors
Special thanks to the main contributors across this release range:
- Andrey Kumanyaev (@zzet) — release leadership, worktree and branch views, storage and indexing improvements, agent integrations, and fixes throughout the project.
- Peter Bednarčík (@pbednarcik) — extensive C# and LSP improvements, resolver performance, Windows correctness, and more reliable usage results.
- Tien Dung Dao (@tiendungdev) — guarded file operations, physical read evidence, mutation recovery, MCP validation, and cross-platform fixes.
- Stephen Eaton (@madeinoz67) — htmx contracts, daemon version diagnostics, and Homebrew upgrade improvements.
- Nils Wildt (@NilsWildt) — the Julia extractor and follow-up language coverage.
- @timkjr — REST and federation tool routing, plus network-filesystem watcher fixes.
Thanks also to @peterkc, @aryansk, @protereus, @ishpagin, @tasodoufu, @zorionarrillaga, and @atirna for diagnostics, test isolation, language resolution, clearer truncation reporting, and stability fixes.
Full changelog: v0.63.0...v0.64.0
Changelog
* 034bce6 Answer a ref-view selection off the read pool while its build runs
* 49ee3ba Answer daemon status from a cached aggregate while the controller is busy
* 44217e3 Assert the real-git reconcile contract per path-evidence platform
* a533421 Bind the checkout workspace weights to the registry's registration
* 0be5449 Bound a generation's unresolved enumeration to its own rows
* aa0da6b Bump version to v0.64.0
* b42c1d3 Carry the view rider in every response wire format
* 6b75306 Charge checkout language-server admission by server footprint
* 1aba704 Close checkout route materialization retirement race
* 6a28e63 Compare worktree path fixtures through the production path fold
* 75324c0 Cover the whole-weight credit on the departed-checkout eviction path
* 8351e20 Fail open when the checkout-coverage probe cannot answer in time
* 3fdef4c Fence graph construction tests from nested worktrees
* eebe4c4 Fix worktree overlay lifecycle and routing
* dff5ac1 Give each payload generation its own resolver lane
* 67bbd9d Hold view builds until the daemon has warmed up
* e680045 Keep a generation build out of the base topology writer
* 52c0343 Keep a ref view build alive for as long as it runs
* fd8fe13 Key the probe fixture's corpus the way the store spells paths
* 2fe5435 Key the review-family overlay fixture the way the store spells paths
* 2df2c2b Match a departed worktree's admin directory through the path fold
* 5fd2097 Merge pull request #652 from zzet/ci/run-full-tests-on-windows
* fdf5a02 Merge pull request #654 from zzet/feat/worktree-branch-views
* 93ac8b1 Merge pull request #716 from tiendungdev/fix/reindex-resolves-failed-receipts
* 30d2fcd Merge pull request #717 from tiendungdev/feat/graph-status-terminal
* d0433b2 Merge pull request #732 from pbednarcik/fix/csharp-verbatim-canon
* 3880868 Merge pull request #734 from pbednarcik/fix/csharp-switch-section-scope
* 88faf8f Merge pull request #735 from pbednarcik/fix/csharp-725-remainder
* 9ac3278 Merge pull request #736 from pbednarcik/fix/csharp-726-pins
* 5c940b5 Merge pull request #738 from pbednarcik/fix/csharp-indexer-event-owners
* ca495f5 Merge pull request #739 from pbednarcik/perf/tstypes-stub-owners
* bb216de Merge pull request #740 from pbednarcik/fix/tstypes-tie-arm-owner
* 13ccc3a Merge pull request #741 from pbednarcik/fix/tstypes-owner-span
* eccabae Merge pull request #742 from pbednarcik/fix/csharp-727-stamp-hygiene
* 0ea424c Merge pull request #747 from zzet/fix/pretooluse-hook-compat
* 5720607 Merge pull request #748 from zzet/fix/batch-file-lifecycle
* f115f5b Merge pull request #749 from zzet/fix/framework-synthesizer-config
* 5b29907 Merge pull request #750 from zzet/fix/receiver-rebind-join-order
* f92cbfc Merge pull request #753 from zzet/fix/planner-stats-freshness
* 2909e09 Merge pull request #754 from zzet/fix/worktree-path-routing
* e8084c6 Merge pull request #755 from zzet/fix/issue-684-unreadable-index
* 134f4f2 Merge pull request #756 from atirna/fix/lsp-provider-concurrent-map-writes
* f10d8b2 Merge pull request #757 from zzet/fix/worktree-source-mutations
* 9259ad8 Merge pull request #758 from zzet/feat/warmup-phase-timings
* 339f513 Merge remote-tracking branch 'origin/main' into HEAD
* ee84eec Merge remote-tracking branch 'origin/main' into HEAD
* c5fe8f1 Merge remote-tracking branch 'origin/main' into feat/worktree-branch-views
* 466bd63 Merge remote-tracking branch 'origin/main' into feat/worktree-branch-views
* 3774939 Pass the path to the path-identity seam
* 68e18a8 Pin the worktree fixture's git isolation to the platform null device
* ebdf863 Reach the janitor's removal path by each platform's removal evidence
* 9fd8df8 Refuse a checkout workspace admission the budget cannot reach before evicting
* b37e952 Refuse a working-tree layer built for a head the commit slot does not describe
* 4b9f3b9 Relay the checkout verbs through the family of an unbound worktree
* 2b0d1e8 Render a detached HEAD as its short commit in the families listing
* 2bd2582 Report a checkout coordinator live while its loop is running
* 390836d Resolve a worktree's family without naming the worktree its own main checkout
* c1cf3f8 Resolve file paths in the checkout a request's view reads
* 7f2bf53 Run the checkout, view and git-state tests on the windows runner
* 2e2ba28 Serve a CLI query run from a linked worktree of a tracked family
* ce0b549 Stop the catalog server fixture's build loops before its store closes
* 8a1f190 Stop the checkout build loops before the binding-chain test seeds a route
* f8cc8c1 Stop the unrouted probe's reconciliation before the fixture tears down
* 9e45ad3 Take the catalog's write gate under the caller's context
* b54762f Take the resolver lane for contract-edge reconciliation
* 52f43c4 Take the worst producer state when a view stacks generations
* 88f50ed bench: measure generation-scoped reads
* a1e3728 benchmark automatic checkout guidance
* 1ea75fc benchmark primary graph designation
* 1a46dd5 build: give the full test suite headroom in ci
* 037addd build: require Go 1.27 and golangci-lint 2.13.1
* 5377bc6 chore: keep the worktree-views working spec untracked
* c228aaf daemon: instrument the view lifecycle with bounded metrics
* 4f12249 docs teach agents worktree view semantics
* 950fa47 docs(agents): teach worktree view consistency
* 8b66495 docs(graphpath): state that the native spelling is legacy-store folding
* 1d25c7f docs(index): document framework synthesizer selection
* 312637f docs(mcp): distinguish symbol refactors from whole-file lifecycle operations
* 33151c8 feat(config): add framework synthesizer selection
* 6b7ac51 feat(daemon): account for warmup preparation and readiness-tail timings
* f163bec feat(daemon): summarize LSP costs during warmup resolution
* 02097f9 feat(indexer): coordinate exact checkout source mutations
* 2a2fefc feat(indexer): honor framework synthesizer allowlists
* 8d2c38d feat(indexer): keep startup worktrees dormant until selected
* a7fd013 feat(indexer): log reconciliation phase timings
* a50467b feat(indexer): persist checkout mode transitions
* 3bb8cc8 feat(indexer): refresh planner statistics at the index boundaries
* 7fd1fd6 feat(lsp): measure router startup reuse and eviction costs
* 6ffa2d6 feat(mcp): preflight batch file lifecycle operations in dry_run
* c131c4f feat(mcp): report planner statistics health in index_health
* 584d68b feat(mcp): say which graph_status values can still change
* ab827fe feat(resolver): log incremental resolution phase timings
* 4ff9f77 feat(store): keep planner statistics fresh while the daemon runs
* 4207c1f fix authoritative generation content cleanup
* 94a74c2 fix bound cold-index WAL growth
* d5678fe fix bracket sparse generation runtime activity
* da32db9 fix canonical worktree path identity
* 517d325 fix canonicalize checkout path routing
* 80787f7 fix concurrent daemon startup waiting
* 3952df2 fix daemon startup migration progress
* fd8c379 fix explicit primary designation
* 8692bcc fix fail closed on unresolved view scopes
* e4aee87 fix go mod tidy
* 52a3fee fix migration completion durability
* e8dd9ae fix preserve offline path containment
* 37d2c1a fix release joined test daemon state
* 7fc7b83 fix retain routed commits after offline switches
* b0ed192 fix retry deferred wal checkpoints
* 57a4f50 fix sparse reachability invalidation
* 41bb644 fix(agents): migrate Claude worktree guidance
* ccde352 fix(agents): upgrade shipped worktree guidance
* d75f557 fix(analysis): keep diff-header paths slash-separated
* 316b3ae fix(analysis): key a diff's file join with forward slashes
* 22817bd fix(audit): keep discovered config paths slash-separated
* 839ab70 fix(cmd): make the CLI and its suite work on Windows
* 7990921 fix(crashpool): serialise quarantine saves and retry the replace
* b53dd8b fix(daemon): collect live failure health and disclose unavailable counts
* ef54450 fix(daemon): display degraded file indexing in status
* be81142 fix(daemon): recognise the Winsock refusal as an unavailable daemon
* 56836c4 fix(deps): bump golang.org/x/crypto to v0.56.0
* 98333b1 fix(embedding): bound the model download instead of hanging the package
* 93da7bf fix(gitstate): disambiguate porcelain branch markers
* 43c6794 fix(graph): persist file indexing failures by view generation
* 7d6d188 fix(graph): preserve failure ledger during file reparse
* 3414e8a fix(graphview): honor nonzero base ancestry
* 007212c fix(graphview): keep file indexing health isolated by checkout
* d9a7210 fix(hooks): claim the localization tool snapshot with an exclusive marker
* 263a9f0 fix(hooks): retry a localization state rename a reader is holding open
* eabbb3f fix(indexer): batch retirement route reads
* 3db2b09 fix(indexer): bound Git topology monitoring
* c005822 fix(indexer): bound derived view build admission
* a1cb947 fix(indexer): cancel obsolete checkout builds
* 4425829 fix(indexer): clear historical errors after incremental recovery
* ccfea66 fix(indexer): coalesce sparse generation builds
* dee5efe fix(indexer): collapse checkout polling git fanout
* a8eb927 fix(indexer): complete topology teardown drains
* cad901b fix(indexer): contain raw storage exhaustion failures
* 13d7248 fix(indexer): contain watcher storage failures
* ad6fe80 fix(indexer): detect worktree head ABA transitions
* 571c2dd fix(indexer): drain topology callbacks on teardown
* 13b1a01 fix(indexer): exhaust retirement generation scans
* d69a74f fix(indexer): join Git reconcile callbacks on stop
* 54be9fc fix(indexer): keep git status probes read-only
* b6587ac fix(indexer): keep immutable ref reads local
* 34193a1 fix(indexer): keep reconciliation timing outcomes accurate
* 32808af fix(indexer): key graph paths with forward slashes on every platform
* dce35e0 fix(indexer): make dedicated graph binding owner-idempotent
* 21f9691 fix(indexer): make repository cleanup retryable
* aeea1b9 fix(indexer): normalize unborn Git baselines
* d7bcaa7 fix(indexer): persist full and scoped indexing failure lifecycle
* 7aae60e fix(indexer): preserve file read failures and skip permission retries
* 3699ad1 fix(indexer): probe linked worktree HEAD identities
* 20b553d fix(indexer): reclaim abandoned payload generations
* 79cd5d7 fix(indexer): retain mutations across admission pressure
* cce7aca fix(indexer): retire deleted graph generations
* c6f6a2a fix(indexer): retry transient mutation freshness
* 948c2a4 fix(indexer): scope full reindex eviction by generation
* 613df33 fix(indexer): share Git family topology watches
* d617682 fix(indexer): signal accepted checkout head changes
* 0c34aa9 fix(indexer): wait for coordinator registration in activateAndWait
* 23dbeec fix(indexer): walk sparse sources directly
* 1dfcfa2 fix(integrations): align hook protocols with clients
* 1ccca35 fix(lint): clear golangci-lint findings on the rebuilt branch
* a1d1418 fix(lint): resolve Linux-build findings in the fswatcher package
* 58616d0 fix(localizationauth): claim a terminal receipt with an exclusive marker
* 540774f fix(lsp): guard sourceCache with docMu and close openDocument's check-then-act
* 8cb9d42 fix(mcp): advertise move_file and delete_file in the edit batch facade
* ce30cca fix(mcp): allow coordinated source edits in exact worktrees
* 5bf709b fix(mcp): clear recovered parse penalties from cached health
* ff374e9 fix(mcp): compare FailedFiles after resolving, and bound the resolve to pre-pass receipts
* af309b7 fix(mcp): complete structured view selector schemas
* 59bd207 fix(mcp): disclose failed-file gaps in search and index health
* 019a386 fix(mcp): honor the routed checkout in the batch lifecycle destination guard
* 15de7c5 fix(mcp): keep the listing in parity with the snapshot it renders
* bbe09f6 fix(mcp): key graph terminality off a recorded outcome, not the status string
* d3da061 fix(mcp): let a scoped reindex resolve the failed receipt for that path
* b7029da fix(mcp): look graph paths up in the graph's forward-slash spelling
* 3d329f7 fix(mcp): make note ordering total and explore path anchors separator-blind
* 0b6030e fix(mcp): order a localization tier by its declaration site
* 64cae05 fix(mcp): order every localization file tier by its declaration site
* 5bff8f8 fix(mcp): preserve large checkout families
* 3879cf9 fix(mcp): publish structured view selectors
* 5cb6df4 fix(mcp): refresh cached failure health and cover denied ancestors
* 08d4f46 fix(mcp): refuse batch edits that address one file through two paths
* d653050 fix(mcp): reject an absolute citation in either path spelling
* 47ad906 fix(mcp): scope grace fallback through family primary
* 1725b0d fix(mcp): select discovered worktrees by root path
* 042f400 fix(mcp): validate checkout mutation root identities
* 9079d01 fix(platform): keep a held claim through readers that pin the payload
* f9db9ce fix(platform): one file-claim and file-replace policy for every OS
* ff26281 fix(query): preserve overlay precedence during refill
* 6c43198 fix(resolver): derive directory keys with '/' so Windows resolution binds
* bd083b8 fix(review): keep repo-relative review paths slash-separated
* 0773d23 fix(serverstack): release the global memories sidecar on Close
* 6070978 fix(serverstack): release the sidecar handles the stack opened
* 5655850 fix(store): drop the cold-index WAL ceiling that crashed the daemon
* 52fe0aa fix(store): drop the duplicate write-gate acquisition in addBatchSetOriented
* e52c1d6 fix(store): pin the receiver-rebind join order with CROSS JOIN
* 38c9386 fix(store): repair tiny or missing planner statistics at open
* d522a71 fix(store_sqlite): judge import-projection path canonicality in slash space
* cf79a21 fix(tstypes): break a same-line stub-owner tie by the fact's own author
* c17161f fix(watcher): join aggregator shutdown
* abf3a44 fix: make rebuilt-branch tests compile
* deae731 fixup! docs teach agents worktree view semantics
* 6e0a112 gitstate: add NUL-safe worktree family inventory
* 95752cd gitstate: sample checkout dirty state with a stable fingerprint
* c016267 graph: align overlay reads across point, batched, and bulk paths
* f4ceb0c graph: compose overlays through a layer contract with uniform node visibility
* e7c51e4 graph: extend the reader with kind-scoped iteration
* cb9a80d graph: recognize file nodes in overlay ownership checks
* d099b92 graph: supersede base edges by their recorded file
* 2189d15 graphview: add view identity, capabilities, selectors, and leases
* f379158 graphview: materialize routed views over persisted generation layers
* 6d9ea65 hooks: resolve probe views through the control socket
* 658d5d1 indexer: add content sources for checkouts and committed trees
* d9fede5 indexer: build ref views with coalesced reclaimable claims
* 1c1dcde indexer: build sparse generations for commit and dirty layers
* 6f1e655 indexer: coordinate checkout layer builds with atomic route flips
* fdf2fc5 indexer: csharp extractor salt 19 - verbatim canonicalization
* 1e7b36a indexer: csharp extractor salt 21 - switch section scoping
* 1f97db9 indexer: csharp extractor salt 22 - partial bases and offset typing
* 65dbbf0 indexer: execute promotion, demotion, and primary designation
* f996a60 indexer: read file content through an optional source
* 6af1303 indexer: route checkout lifecycle through one owner
* ba4612a indexer: scope text search and language servers to the checkout
* 8abf7e2 indexer: stop a coordinator's loop before a test drives its cycles
* 1ff262b indexer: widen the build closure to a reference-driven fixed point
* b1b2994 mcp: add checkout administration surfaces
* a40005a mcp: bind worktree sessions to their family scope
* a6792a5 mcp: evaluate operation capabilities against the served view
* c188fce mcp: finish routing analysis and review reads through the request view
* 61a224a mcp: serve committed-tree views for ref and commit selectors
* 6cf28f2 mcp: serve request reads through the session view
* 9cf697c mcp: serve routed checkout views by session and selector
* 66b5d97 mcp: stamp workspace identity onto overlay layer nodes
* 43e108e parser: a modifier-led sibling declaration ends the doc-comment climb
* e5e36f1 parser: collect a query's continuation positions once, not per binding clause
* 8ab2c07 parser: drop a partial fragment's legally repeated base class
* bacdb4d parser: indexers and accessor-bearing events own their body calls
* a70de98 parser: keep the C# alias set by reference; retire the dispatch-gate comment that names absent code
* 0b8acdc parser: merge partial indexer fragments instead of minting a twin
* 937eed6 parser: scope label and when-guard pattern variables to their section
* 04f1da4 parser: stamp the recorded ownership span on a property whose node lines do not contain it
* d4624c8 parser: type chained and awaited receivers at the site offset
* 76658f9 parser: unify the canonical identifier domain for verbatim spellings
* 3a6ae07 perf(indexer): cancel sparse planning promptly
* 80bd7ed perf(indexer): gate reverse fanout by symbol shape
* 837af8e perf(mcp): counter-source graph_stats totals to remove whole-graph scan
* 739aecf perf(store): use generation partial indexes
* e605cb0 perf(tstypes): memoize stubOwnersAt and dedupe owners through a map
* f470dd2 perf(tstypes): snapshot call stubs only for files carrying call facts
* d3ad20e query: enumerate search candidates from every generation in the view
* 30cf350 reconcile: add checkout lifecycle core with evidence-gated cleanup
* 1749550 reconcile: purge a checkout's layers before withdrawing its route
* d4147fe refactor(indexer): support immutable full-tree sources
* 1c8c76d store: add checkout lifecycle catalog tables and accessors
* 4ad9d33 store: add edge view generation column
* 853de38 store: add ownership masks and the payload generation lifecycle
* 5b64c19 store: give nodes and edges per-generation identity
* 27f27fc store: key payload sidecars by view generation
* 4eb45b5 store: list view generations with a bounded filter
* 9e6fd8f store: scope payload statements to the handle generation
* c7e8158 store: split the handle from the core for generation pinning
* 174dd64 teach agents worktree view routing
* 21974e0 test canonical macOS path identity
* c11a636 test(analysis): build the delete/rename fixture keys with path.Join
* eb7d362 test(analysis): pin the diff parser's slash path contract
* bf71612 test(claudecli): re-exec the test binary as the fake CLI
* b38750b test(claudecode): resolve the hook binary and its mode on Windows
* eb92af5 test(cmd): reconcile rebuilt-branch view tests with model-free tree
* 2f4d286 test(codex): re-exec the test binary as the fake CLI
* edfcbe6 test(daemon): attach watcher in lifecycle fixtures
* 7530502 test(daemon): cover event-driven worktree lifecycle
* 7721b7a test(daemon): port the transport suite to Windows
* ee0ada3 test(eval): backdate the health handler's start instead of racing the clock
* 539cf9a test(excludes): scope the trailing-backslash pattern case to POSIX
* 9dfdbf2 test(githooks): drop the exec-bit assertion on Windows
* a8133be test(graph): cover failure ledger migration and generation contracts
* 46b0a3f test(hooks): drain the captured stdout pipe while the hook writes
* b070867 test(hooks): make the path fixtures platform-native
* 5236d48 test(indexer): accept the stage at which Windows rejects a NUL path
* a181cae test(indexer): await live worktree removal on Windows
* 515bac6 test(indexer): compare platform-native stat errors
* 1be7e75 test(indexer): cover durable inactive ref reuse
* 2fb34e3 test(indexer): decouple topology probe from build startup
* 1bc0009 test(indexer): deny reads and marker creates without POSIX mode bits
* d9fbca6 test(indexer): expect graph paths in their slash spelling
* bfe959d test(indexer): keep the compile-database fixture valid JSON on Windows
* 5edb909 test(indexer): pin the GC-tuning window's budget instead of reading the host
* e6d48a0 test(indexer): reconcile rebuilt-branch tests with the model-free tree
* 46551ae test(lsp): derive URI expectations from native paths, spawn a helper process
* 3e6840d test(mcp): attach watcher to lifecycle fixtures
* eea01ae test(mcp): attach watcher to routed text fixture
* eebc58a test(mcp): close failure fixture filesystem before temp cleanup
* 5502ef9 test(mcp): compare discovered checkout path identities
* 88e7dc6 test(mcp): cover batch file lifecycle through a real indexer
* d2a25e9 test(mcp): cover worktree grace fallback boundaries
* 444639e test(mcp): publish readiness in contracts fixture
* 444c2bb test(mcp): rebase tools/list ceilings and scope grace-code tests to in-scope roots
* f3eb60f test(modelhint): key the stale-hint fixture the way Write does
* 41e574f test(pathkey): spell the fold fixture in native separators
* 37a130f test(pathkey): take the darwin tmp-alias fixture off a bare /tmp
* 8c67bea test(query): pin overlay shadowing rank semantics
* 01f95b2 test(savings): native event-log fixtures, and skip the unreadable-log case on windows
* c0ad825 test(semantic): spell checkout-workspace fixture roots natively
* 65cf9a1 test(server): backdate the health handler's start instead of racing the clock
* 3397fab test(store): align TestGenerationScopedFileEvict with generation-scoped EvictRepo
* 74245b6 test(store): make estimate scan cancellation deterministic
* fb34ad3 test(store): make the per-index timeout injection deterministic
* bb1cd09 test(store_sqlite): align eviction receipt + capability checklist with generation-scoped EvictRepo
* 8713b20 test(store_sqlite): measure the PASSIVE contention rule, not the runner's disk
* 1f0e4e4 test(testenv): add a short temp dir that exists on Windows
* 5cf510d tstypes: admit a stub inside the owner's recorded ownership span, not only its node lines
* 876a9e5 tstypes: name the authoring member on every call fact
* c0cbb39 tstypes: pin the adopted caller for indexer and event bodies