Added
- Add an advisory incremental Stryker lane for changed scripts (refs #1844)
- CI failures now distinguish infrastructure outages from real test failures and arm one rerun
- Add an AST governance sweep for
vi.mockfactories that omit production exports - Add an advisory Windows Vitest lane (refs #2536)
- Add the tool-smoke install lane to the release-QA baseline (refs #2663, #2784)
- Add a TypeScript strictness spike with scratch configs, per-directory counts, a two-sided ratchet, and an advisory report lane (refs #2697)
- Add a cwd-sensitive yamllint tool-smoke row (refs #2697, refs #2691)
- Add tool-smoke cwd rows for nested discovery (refs #2777)
- Add one command for every mechanical PR gate (refs #2790, #2784)
- Stamp one session-scoped turn identifier on observability sink rows (refs #2815).
- Add a real pi RPC harness for load, tool-set restore, and read-guard scenarios (refs #2825)
- Make Knip a hard local preflight gate and cover every admitted test lane
- Gate nightly LSP smoke rows on primary diagnostics
complexity (advisory)CI job dogfoods pi-lens's own complexity client overclients/,tools/andmcp/(refs #2697)- One session-end line names the tools never activated or called (refs #2800)
- Per-call tool-result observability
- Guard workflow shell portability (refs #2625, #2784)
- Record injected bytes and repeated findings per turn (refs #2838)
- Check lockfile completeness under CI's npm (refs #2803, #2784)
tools.<name>.enabledproven through a real pi RPC session (refs #2800)
Changed
- Keep admission registries sorted and enforce declaration order with one shared sweep helper (refs #2671, #2784).
- Skip the PR title, body and close-keyword checks for dependabot PRs (refs #2714)
- Trim the three largest tool parameter schemas and pin both host rosters (refs #2800).
- Adaptively demote budget-hitting auxiliaries, re-promote fast late answers, and deliver findings through the deferred runner path (refs #2810).
- Tool probes and hand-derived package roots resolve through shared seams (refs #2894)
- Preserve per-row auxiliary publication evidence semantics (refs #2892)
ast_grep_dumpfolded intoast_grep_search(refs #2800)- Audit and update user-facing and contributor docs against master for the v4.1.6 cut.
- Fold
lsp_diagnosticsintolens_diagnosticswith source and scope modifiers; retain the MCP compatibility shim for one release. - Make the oxfmt format check a CI gate (refs #2790, #2784)
- Fold
allowStampout of auxiliary coverage (closes #2914) - One result renderer for pi tool results and the MCP mirror (refs #2800)
- Dropped a no-op string replacement in the tsgolint preflight test (refs #2709)
- Pin the tool-roster description budget and trim paid metadata (refs #2800)
- Add per-tool enablement (refs #2800)
sql-injection(TypeScript tree-sitter rule) is a warning, not a blocking error.
Fixed
- Windows lane enumerated zero files because six scripts detected "am I the entry module" by string-comparing
import.meta.urlwithfile://${process.argv[1]} - Bound turn-end Gitleaks classification (refs #2575)
- Prune merged clean worktrees with a per-run cap; never a tree with untracked files (refs #2631, #2538, #2784)
- The format smoke lane installs the managed formatters it selects (refs #2767)
- Unify tool cwd and root resolution (refs #2777)
- Fix runner no-config advisories logging once per tool and root at debug level (refs #2811)
- Key vi.mock export admissions by factory content and ratchet missing counts across line moves.
- Make vi.mock export sweep warnings visible in default Vitest output and keep baseline regeneration successful when admissions …
- Harden real pi harness waits and isolation (refs #2825)
- Verify explicit existing records in PR-body observability lint (refs #2855)
- Report peak RSS for exit-137 classifications (refs #2856)
- Attribute pi situational-tool observations by session file and emit on replacement.
- Fail session-start tests when the awaited handler crashes or exceeds its test budget, instead of passing vacuously.
- Bound joined tool-result text with one conservative footer reserve, write one complete-result log, and convert rejecting pi tool executions into contract errors.
- Derive lens diagnostics limits and scope metadata from the LSP probe, preserve single-file names, and honor session severity tiers.
- Test-runner selection is per file kind and per module root, and a go
[setup failed]result is advisory (refs #2870) - The test runner spawns its child through
resolveToolCwd, so a nested module's tests run from that module (refs #2871) - Make the runner spawn-cwd sweep verify resolver origin across the child-spawn population (refs #2872).
- Keep diagnostics visible for tolerant MCP severity inputs and apply one threshold across session and LSP sources, including error-only files at the warning threshold.
- Surface a crashed pi hook handler instead of swallowing it silently (refs #2884)
- Resolve aliased child-process bindings (closes #2888)
- Make pi RPC
session_startidempotent per reason and session ID, with a session-file fallback (refs #2890) - Deduplicate repeated RPC session starts (refs #2890)
lens_diagnostics mode=fullretires a stale finding only when the result that replaces it is genuinely authoritative: an LSP write the ordering guard accepted, or a project runner that actually analysed the root this call. A runner that reported success without running — no project root, no source files, a scan that crashed before writing its report — is reported cold instead of silently deleting the finding, and a retained result that could not be reconciled is labelled stale rather than served as a current blocker (refs #2154).- Require Windows-only test gates to name and enter the Windows Vitest lane (refs #2536, #2784)
- Require runtime Observability sections to name a diff record (refs #2543, #2784)
- Make the merge-train warden label
red-cifor any failing non-advisory check on the exact pull-request head (refs #2616, #2784) - CI failure classifier: a test timeout beside registry network failures is infra, not real (refs #2839)
detectFileRolerecognises Go_test.goand the other table conventions (closes #2880)- Route helm-lint through the runner cwd resolver (closes #2882)
- Preserve situational tool activations across pi rebuilds (refs #2889)
- Run the installed-registry release-QA smoke with a scratch-home pip policy and keep the measured registry deterministic.
- Diagnostic verification guidance (closes #2792).
- Partition LSP diagnostics by server provenance (refs #2776)
- Re-sync LSP diagnostics after Git tree changes (refs #2817)
- Bound MCP tool results through the shared pi result seam (refs #2799, #2800)
- Flake-shape ratchet governs support-helper waits (refs #2563, #2784)
- Label-sync post-merge validation fails when the syncer deletes or loses any label (refs #2614)
- Route built-in LSP roots through the tool-cwd seam and expose resolved cwd in
lens_diagnostics(refs #2777) - Run the release-QA tool smoke from the export root (closes #2893)
- Docs membership guard asserts list members, not counts (closes #2919).
- Route tool configuration diagnostics through the shared note seam (refs #2800)
🙏 Thanks
Thanks to the external contributors in this release:
- @Don-Yin — #2795
- @stekman08 — #2575