Added
- 🙏 Huge thanks to @AngriestBird (Kenny McCormick), this round's standout community contributor
- Prompt-cache observability (refs #1018, closes #1018)
- Word-index build/refresh/persist outcomes are now durably observable
- Closed four observability gaps in recently-changed typos-config and project-snapshot code (refs #533)
- Review-graph checkpoint discards and write failures are now observable
- The review-graph full build is now resumable across sessions
- Bundled default typos allowlist for projects without their own config
- Session-start latency is attributable end to end
- Review-graph LSP fallback nodes
- Standalone out-of-band review-graph build CLI
/lens-perfsurfaces slow phases in-session
Changed
- Session-start perf: bound the change-log replay + defer log cleanup (closes #1019)
- Config-consistency pass on the #166 flag registry (refs #166, #533)
- Normalized call-graph impact checks into structured
ProjectDiagnostics - Parallelized the per-turn madge dependency check
- Every runtime toggle is now settable from BOTH the CLI and
~/.pi-lens/config.json, driven by one declarative registry (closes #166) actionableWarnings.autoFix.maxFixesis now actually read- Flag provenance gained an
envtier and reports the global tier more accurately - Unknown top-level keys in
~/.pi-lens/config.jsonnow warn once instead of being dropped silently - The review-graph resume checkpoint (#936) now offloads its gzip to the shared persist worker (refs #958, #883)
- Project snapshot body is now written gzipped by a worker thread
- Session warmup refreshes the word index incrementally
- Project scans feed compact structural IR into review-graph builds
- Session-start performance: LSP pre-warm, snapshot meta-gate, compact cached snapshot
- Warm LSP names enrich tree-sitter read expansion
- Installer subprocesses are lifetime-coupled
- Managed tool installs are cross-process serialized
- Ordinary tests never install managed tools
- Installer orphan/locking regressions are process-tested
- Downgrade TypeScript
unsafe-regexto advisory and suppress escaped-before- assignment false positives (refs #932) - Review-graph persistence no longer serializes or compresses on the event loop (refs #939)
- Raise and make the review-graph persist ceiling useful
- Logger hot paths now coalesce queued lines and rotate during long sessions
- Incremental review-graph updates avoid redundant whole-graph copies and index rebuilds (refs #939)
- Reverse-dependency indexes update at import-edge granularity
- Review-graph file-cap degradation is now explicit and count-honest
- Project scans release every scan-local fact after each file
- Repair eight non-compiling Java, C++, CSS and PHP tree-sitter rules (refs #884).
- Repair four non-compiling Go, Rust, and Kotlin tree-sitter rules (refs #884).
- Project diagnostics now use one file-major scan pass
- A project scan runs its rule set in one tree walk, not one walk per rule
- Project scans parse each file once
- Tree-sitter cache pressure is measurable
- Dead incremental-parse cache API removed.
- Faster LSP teardown and tool probes
Fixed
- Read-before-edit guard now survives a session resume (#1041)
turn_summary_emitquiet-window task no longer fails on a stale pi ctx (the #483 quiet window's most frequent live-dogfood error — 55×)- Word index no longer serves stale postings after a case/separator-divergent edit (refs #1025, closes #1025 item #2)
- Cascade honesty: degraded/uncomputed impact no longer renders as clean (refs #1023, closes #1023)
- Disposition marks under a nested monorepo language root are no longer silently dropped (refs #1030, closes #1030; pairs with #1024)
- Disposition anchor path-form stability (refs #1024, closes #1024)
lens_diagnostics mode=allno longer replays a resolved blocker (refs #1020, closes #1020)- Cache-friendly ephemeral context injection (refs #1016, closes #1016)
- Fixed:
ts-ssrfno longer flags fixed/const endpoint URLs built withnew URL(...)as SSRF sinks, while still catching tainted URLs (closes #1000, refs #533, #963) - Fixed:
no-javascript-url/no-javascript-url-jsno longer flag defensivejavascript:-URL filters (refs #533) - Contained spawn/callback failures that could crash the host (pidusage bug class) (refs #533)
- Fixed: opengrep security findings now surface project-wide in
lens_diagnostics mode=full(refs #585, #584, #533) - Fixed: test-runner findings now surface project-wide in
lens_diagnostics mode=full(closes #1004, refs #585, #533) - Guarded Windows CPU/RSS resource sampling so a best-effort sampler can no longer crash the pi host (refs #620, #533)
- Stabilized the two remaining flaky/environment-sensitive tests tracked in #902.
pi-lens build-graphhonestly reports a capped, over-the-cap persistts-ssrfno longer trusts naming convention as proof of a fixed URL- Remaining test-suite spawns routed off
shell:trueto close the Windows-spawn flake class - Tree-sitter post-filters no longer leave silently dead rules
- Capped word indexes disclose partial coverage
pilens_healthkeeps disabled LSP servers visible- Cold
symbol_searchfailures are now observable and honest - Failed heavyweight analyzers no longer masquerade as clean runs
- The footer refreshes as LSP servers come online during a cold
lens_diagnostics mode=fullsweep (refs #798) - Tree-sitter WASM aborts are now visible instead of silently disabling structural analysis for the rest of the process (refs #915)
pilens_rebuildcan no longer destroy an npm-installed pi-lens- Review-graph background failures are no longer silent
- Resolve nested C# and F# project roots for dotnet builds (refs #895).
- A mid-scan tree-sitter WASM abort no longer replaces the authoritative project-diagnostics snapshot with a silently truncated result (refs #891)
- Block-wrapped switch cases no longer report false fall-through errors
- Project-wide enumeration now covers every registered file kind
- CMake files now reach a real LSP server
- Fish LSP policy is no longer dead wiring
- Editing an inherited tree-sitter rule now invalidates the inheriting language's RuleCache
- Small edits no longer pay the entity-extraction cost
- The per-edit tree-sitter runner walks the tree once, not once per rule
- A transient grammar-load failure no longer disables batched rule scans for the process lifetime
- module-report parses plain JS under the correct tree-sitter grammar
- A rule whose query fails to compile now warns once instead of silently reporting nothing
- TreeCache mtime false misses and FIFO eviction
- Eight enabled typescript/javascript tree-sitter rules whose queries never compiled (refs #884)
- A column-0 comment after a
query: |block no longer breaks the rule - Seven ruby security rules never compiled and never produced a finding
- Six python rules never compiled or never fired
- Project scans run tree-sitter rules for every supported language, not just 10 extensions
.dartfiles are now included in project-wide source enumeration- Tree-sitter rules were compiled against the wrong grammar
- Project scans ran rules from
-disabled/directories .tsxparsed with the typescript grammar- An unimplemented
post_filterreported every raw match instead of none. - YAML scalars kept their trailing comments
- tree-sitter runner no longer double-increments already 1-indexed line/column (refs #448)
Security
- Debug logs redact credential-shaped text before it reaches disk
🙏 Thanks
Thanks to the external contributors in this release: