### Fixed
- **UTF-8 text corrupted on Windows PowerShell** (#131): `lean-ctx -c` with non-ASCII output (Russian, Japanese, Chinese, Arabic, etc.) produced mojibake because `String::from_utf8_lossy` misinterpreted Windows system codepage bytes as UTF-8. Introduced `decode_output()
<!-- Release notes generated using configuration in .github/release.yml at f63066284946a22e646e01de23c7978d75dd55d4 -->
## What's Changed
### 🐛 Bug Fixes
* fix: fall back to browser fetch in ApiClient MCP-473 by @nirinchev in https://github.com/mongodb-js/mongodb-mcp-server/pul
### Fixed
- **Codex `config.toml` parse error** (empty `[]` section header): Uninstall left orphaned `[mcp_servers.lean-ctx.tools.*]` sub-sections when removing the main `[mcp_servers.lean-ctx]` section, producing an invalid empty `[]` header on re-setup. Uninstall now removes al
## Highlights
**Default detail_level flipped "standard" → "auto".** `search_symbols` now returns the cheapest representation by default for broad discovery queries — compact shape when `max_results>=5` with no `token_budget` and no `debug`, standard otherwise. Explicit `detail_l
### Added
- **Context Engine Wiring**: Connected all modular Context Layer components into a live, end-to-end pipeline. Nine previously test-only modules now run in production:
- **ContextLedger** tracks every file the model has seen (path, mode, token count) across the session
Hotfix for get_hotspots (and get_repo_health, which aggregates it) crashing with UnboundLocalError on any repo whose source_root isn't a git worktree. This is the common case for index_repo extracts — they live in the cache dir with no .git.
Root cause: candidate-building block
Closes #252.
Fixes under-resolution on Python layouts where the effective source root is injected at runtime (conftest.py sys.path shims, PYTHONPATH, setuptools package_dir with nested roots). resolve_specifier now falls back to a cached package_basename → parent_dirs index and
Audit remediation for findings F1, F2, F3, F5, F6, F11.
- **F1** MUNCH scalar values with embedded newlines now escape to \n/\r (and \) inside quoted fields; decoder reverses the escapes so round-tripped payloads no longer truncate at blank-line section boundaries.
- **F11** Gen
Low-risk audit remediation. No wire-format or session-state changes.
### Fixed
- **tier_resolver substring match normalizes both sides (F4, closes #249)** — provider-prefixed keys like anthropic/claude-haiku now match claude-haiku-4-5.
- **Bearer-token redaction requires Authori
### Fixed
- **Project root stuck at agent sandbox path** (#124): The MCP session could retain a stale project root from a temporary directory (e.g. `~/.claude`, `/tmp/`). Fixed with multi-layer healing: `initialize` now validates roots against project markers, `session::load_by_i
## Fixed
- **#754**: Preserve `_internal_bindings.pyi` type stub during wheel artifact cleanup — published wheels now include inline type information for the core binding module
- Add missing `Default` impl for `PyCancellationToken` to satisfy clippy `new_without_default` lint
-
## Added
- **Per-session tier state makes adaptive_tiering: true safe under HTTP (#253).** The process-global _session_tier_override is now a session-keyed OrderedDict of overrides (LRU-capped at 256 entries). The key is the MCP session's session_id when present, otherwise id(req
## Changed
- **adaptive_tiering: true + HTTP transport now refuses to start (#248).** Previously emitted a startup WARNING. Process-global tier state leaks across concurrent HTTP clients — one client's plan_turn(model=...) flip silently changes the tool surface for every other c
Thanks to @MariusAdrian88 for PR #246 — the tier surface, the three bundled fixes, and +215 tests of coverage.
## Added
- **Tiered tool surface with runtime model-driven switching (#246).** jcodemunch's 60+ tools now narrow per model at runtime. Three tiers (core / standard / f