## What's Changed
* chore: sync main (v9.6.4) into beta by @github-actions[bot] in https://github.com/CoplayDev/unity-mcp/pull/1009
* Bug-fix by @Scriptwonder in https://github.com/CoplayDev/unity-mcp/pull/1011
* chore: update Unity package to beta version 9.6.5-beta.2 by @github
## Fix
**`@includeFirst` Blade directive now generates import edges** — closes #203.
The `@includeFirst(['primary.view', 'fallback.view'])` directive (used to include the first view that exists from a priority list) was previously silently ignored by the Blade import extractor.
## Performance Quick Wins
### T8 — files_to_remove kept as set in incremental_save
`sqlite_store.py` no longer converts the union of `deleted_files` and `changed_files` to a list. Set membership tests in the hot path are now O(1) instead of O(n). sqlite3 calls receive `tuple(fil
## Phase 5 — Tell the Truth About Uncertainty
### Added
- **Methodology disclosure (T15)** — every analytical tool response now includes `_meta.methodology` and `_meta.confidence_level`:
- `get_call_hierarchy` + `get_impact_preview` → `text_heuristic` / `low`
- `get_symbol_c
## Phase 4: Guard the Gates — Test Infrastructure
CI now catches correctness regressions, not just crashes.
### T12 — Correctness Fixture Library
Three shared pytest fixtures in `conftest.py` (`small_index`, `medium_index`, `hierarchy_index`) provide deterministic synthetic Pyt
## What changed
### Fixed
- **BM25 avgdl inflation corrected (T10)** — document length (_dl) was computed from the weighted repeated token bag (name tokens x3, signature tokens x2, etc.), inflating avgdl and distorting the length-normalisation term K. Now computed from len(set(t
## What's Fixed
### Watcher hash-cache double-read race (T6)
After each incremental reindex the watcher previously re-read each changed file to compute the new content hash for its in-memory cache.
**The race:** if the file changed again between index_folder's internal read an
## What's Fixed
### T5: Threading locks on all in-process caches
Four module-level caches were missing `threading.Lock` guards, leaving them vulnerable to data races under concurrent MCP requests (HTTP transport, multi-client stdio):
- **`_bare_name_cache`** (`tools/_utils.py`
### Fixed
- **`truncated` flag now correct when `token_budget` packing drops results** — in the BM25 search path, fuzzy results appended after budget packing could mask dropped results and produce `truncated=False` incorrectly. Now tracked as a separate `budget_truncated` boolea
## What's Changed
* fix: update documentation links to new domain for consistency by @samanhappy in https://github.com/samanhappy/mcphub/pull/712
* fix: persist passthroughHeaders in database mode by @samanhappy in https://github.com/samanhappy/mcphub/pull/714
* feat: add configu