pi-lens 4.2.1 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1562 -0
- package/README.md +157 -24
- package/config/dependency-cruiser-eager-allowlist.json +6 -2
- package/dist/chunk-22AVIGXS.js +560 -0
- package/dist/chunk-27BBHSZC.js +106 -0
- package/dist/chunk-2BEMIWEW.js +51 -0
- package/dist/chunk-2EECBNC5.js +89 -0
- package/dist/chunk-34U7PLGE.js +23 -0
- package/dist/chunk-3I5QFT3N.js +181 -0
- package/dist/chunk-3MED75HT.js +37 -0
- package/dist/chunk-47D2BO4S.js +87 -0
- package/dist/chunk-4RERDEXR.js +348 -0
- package/dist/chunk-4W2PLC4J.js +27 -0
- package/dist/chunk-52H5B5TC.js +202 -0
- package/dist/chunk-54B42YRX.js +27 -0
- package/dist/chunk-5RXBNSW2.js +266 -0
- package/dist/chunk-5THXD6X5.js +201 -0
- package/dist/chunk-5W3R6LFT.js +24 -0
- package/dist/chunk-5ZEJHV35.js +341 -0
- package/dist/chunk-6P62QVEA.js +118 -0
- package/dist/chunk-6QIUX4EP.js +459 -0
- package/dist/chunk-6VCD4VKZ.js +78 -0
- package/dist/chunk-7F72PXY2.js +326 -0
- package/dist/chunk-7FBF7NPR.js +998 -0
- package/dist/chunk-7U2IDNXN.js +37 -0
- package/dist/chunk-ABBOA7UD.js +157 -0
- package/dist/chunk-AHDW3GPE.js +50 -0
- package/dist/chunk-AJ3QXTRQ.js +756 -0
- package/dist/chunk-AJVLWNFN.js +1610 -0
- package/dist/chunk-AJXODZY6.js +112 -0
- package/dist/chunk-ARFCXG7S.js +84 -0
- package/dist/chunk-AS44CFQ4.js +708 -0
- package/dist/chunk-AWE5TMPO.js +38 -0
- package/dist/chunk-B3I2UUT4.js +4692 -0
- package/dist/chunk-BRJKOBZP.js +331 -0
- package/dist/chunk-BW5KFIQC.js +59 -0
- package/dist/chunk-C2AUYXQH.js +149 -0
- package/dist/chunk-CGGAIP7J.js +29 -0
- package/dist/chunk-D6QS3U6M.js +30 -0
- package/dist/chunk-DFVMIKMQ.js +349 -0
- package/dist/chunk-DIULIWKU.js +169 -0
- package/dist/chunk-DQ2NZ7C4.js +2317 -0
- package/dist/chunk-E2WFBRHM.js +213 -0
- package/dist/chunk-E4MAEDPM.js +50 -0
- package/dist/chunk-EOKRQ3SA.js +30 -0
- package/dist/chunk-F3AU2TMM.js +2626 -0
- package/dist/chunk-F3P7VQ7H.js +170 -0
- package/dist/chunk-FC4RP4I2.js +12 -0
- package/dist/chunk-FJNKANOS.js +32 -0
- package/dist/chunk-GUOGVTCQ.js +146 -0
- package/dist/chunk-GVXA6CCE.js +18 -0
- package/dist/chunk-HHYAELLJ.js +2334 -0
- package/dist/chunk-HMFXILPV.js +83 -0
- package/dist/chunk-HVUZXSWK.js +421 -0
- package/dist/chunk-HWBZIGMJ.js +62 -0
- package/dist/chunk-I3R7GKDR.js +17 -0
- package/dist/chunk-I7SPGOWI.js +55 -0
- package/dist/chunk-IIXOAGHR.js +38 -0
- package/dist/chunk-IVP5KAB7.js +2250 -0
- package/dist/chunk-IXEBJSUE.js +22 -0
- package/dist/chunk-JOLITGCC.js +27 -0
- package/dist/chunk-K6VYLB2U.js +145 -0
- package/dist/chunk-LJDODBBZ.js +78 -0
- package/dist/chunk-LNAKEO63.js +78 -0
- package/dist/chunk-LSMJ6KBE.js +4139 -0
- package/dist/chunk-LW6XKDZQ.js +5565 -0
- package/dist/chunk-N3YQJI6O.js +899 -0
- package/dist/chunk-NABLC7W3.js +148 -0
- package/dist/chunk-NKOUFPQF.js +659 -0
- package/dist/chunk-NL5GLMFI.js +211 -0
- package/dist/chunk-NMABWBZN.js +327 -0
- package/dist/chunk-NTHH2J74.js +27 -0
- package/dist/chunk-NTUJEGDZ.js +59 -0
- package/dist/chunk-NXL4FFQQ.js +47 -0
- package/dist/chunk-NXPS2L6U.js +466 -0
- package/dist/chunk-O5WILGMI.js +42 -0
- package/dist/chunk-O6TQT6RI.js +48 -0
- package/dist/chunk-OAXNDZJ7.js +323 -0
- package/dist/chunk-ODEEOXPH.js +44 -0
- package/dist/chunk-OQGFCZJ4.js +4533 -0
- package/dist/chunk-ORTMY4Q4.js +282 -0
- package/dist/chunk-OS32RNR2.js +442 -0
- package/dist/chunk-PAK6IDME.js +189 -0
- package/dist/chunk-PWFHBTSF.js +406 -0
- package/dist/chunk-Q5U6FMDI.js +2352 -0
- package/dist/chunk-QOZXJ4NA.js +3364 -0
- package/dist/chunk-QYF5S6P6.js +45 -0
- package/dist/chunk-RIISMHKN.js +36 -0
- package/dist/chunk-RPD4ZSB7.js +25 -0
- package/dist/chunk-RPD5K5NC.js +79 -0
- package/dist/chunk-RUOG5D2C.js +262 -0
- package/dist/chunk-T4ERT73Y.js +599 -0
- package/dist/chunk-T6D4Q4AQ.js +54 -0
- package/dist/chunk-TGPXLY2J.js +391 -0
- package/dist/chunk-TLGFBM3F.js +12116 -0
- package/dist/chunk-TO6WL3GM.js +88 -0
- package/dist/chunk-TT22N74J.js +517 -0
- package/dist/chunk-TVN5N6GY.js +21216 -0
- package/dist/chunk-U3VGR4VU.js +308 -0
- package/dist/chunk-UK3CMEAL.js +1250 -0
- package/dist/chunk-UOPVJQ4N.js +103 -0
- package/dist/chunk-UXVNL3D7.js +23 -0
- package/dist/chunk-UY752QSN.js +45 -0
- package/dist/chunk-V5PXFSZK.js +188 -0
- package/dist/chunk-V7R425XG.js +398 -0
- package/dist/chunk-VCSRSYLF.js +81 -0
- package/dist/chunk-VD4JQCQC.js +162 -0
- package/dist/chunk-VDBPVIKD.js +62 -0
- package/dist/chunk-VHQLPIRJ.js +114 -0
- package/dist/chunk-VN2AXLEX.js +5414 -0
- package/dist/chunk-VNMT7C64.js +478 -0
- package/dist/chunk-WONERJTP.js +309 -0
- package/dist/chunk-XECLWQZN.js +85 -0
- package/dist/chunk-XIMYZ3JA.js +27 -0
- package/dist/chunk-XK4CIILI.js +144 -0
- package/dist/chunk-Y4T27COV.js +562 -0
- package/dist/chunk-YGVYKNSN.js +1860 -0
- package/dist/chunk-YLF3PPT5.js +308 -0
- package/dist/chunk-YSNFMJKN.js +14 -0
- package/dist/chunk-Z3CCVDUB.js +76 -0
- package/dist/chunk-Z54ZSOBZ.js +61 -0
- package/dist/chunk-ZAWW3AF6.js +97 -0
- package/dist/chunk-ZMOL6RQC.js +167 -0
- package/dist/index.js +19039 -8956
- package/dist/mcp/analyze-cli.js +186 -228
- package/dist/mcp/cli.js +137 -98
- package/dist/mcp/server.js +22592 -1564
- package/dist/mcp/worker.js +97 -38
- package/dist/probes/installer.js +135 -0
- package/dist/workers/project-snapshot-persist-worker.js +22 -0
- package/dist/workers/review-graph-persist-worker.js +15 -0
- package/docs/adr/0001-stale-advisory-live-arm.md +29 -0
- package/docs/adr/0002-workspace-hash-rendezvous.md +30 -0
- package/docs/adr/0003-git-guard-latch-writer.md +203 -0
- package/docs/adr/0004-disposition-policy-seam.md +38 -0
- package/docs/adr/0005-tool-availability-enforcement-seam.md +29 -0
- package/docs/adr/0006-derived-state-benchmark-first.md +31 -0
- package/docs/adr/0007-end-to-end-witness-per-seam-slice.md +38 -0
- package/docs/adr/0008-turn-end-lane-interface.md +165 -0
- package/docs/adr/0009-reported-path-attribution.md +114 -0
- package/docs/adr/README.md +26 -0
- package/docs/agent-guide.md +13 -4
- package/docs/agent-tools.md +60 -1
- package/docs/ast-grep_rules_catalog.md +6 -4
- package/docs/configuration.md +75 -2
- package/docs/engineering-principles.md +202 -0
- package/docs/environment-variables.md +113 -6
- package/docs/features.md +10 -6
- package/docs/globalconfig.md +7 -1
- package/docs/io-bridge-v2-migration.md +94 -0
- package/docs/language-coverage.md +17 -0
- package/docs/lsp-capability-matrix.md +131 -32
- package/docs/lsp-idle-eviction.md +124 -0
- package/docs/mcp.md +21 -5
- package/docs/merge-queue-rollout.md +77 -0
- package/docs/pi-lens-fixer.md +161 -39
- package/docs/pi-lens-investigator.md +77 -20
- package/docs/pi-lens-merge-policy.md +694 -0
- package/docs/pi-lens-monitor.md +73 -7
- package/docs/pi-lens-retro.md +6 -4
- package/docs/pi-lens-reviewer.md +190 -34
- package/docs/pi-lens-subagent.md +247 -37
- package/docs/pi-lens-warden.md +18 -7
- package/docs/public-api-stability.md +56 -0
- package/docs/release-qa-baseline.md +86 -17
- package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
- package/docs/servercapabilities.md +66 -52
- package/docs/settings.md +13 -3
- package/docs/subagent-compat.md +1 -1
- package/docs/usage.md +5 -1
- package/grammars/tree-sitter-bash.wasm +0 -0
- package/grammars/tree-sitter-bash.wasm.json +3 -3
- package/package.json +23 -9
- package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
- package/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +26 -0
- package/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +10 -0
- package/rules/ast-grep-rules/rule-tests/unchecked-numeric-parse-python-test.yml +18 -0
- package/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +4 -3
- package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/rules/ast-grep-rules/rules/go-no-fmt-println.yml +2 -2
- package/rules/ast-grep-rules/rules/no-assert-tuple.yml +23 -13
- package/rules/ast-grep-rules/rules/no-boolean-in-except.yml +7 -3
- package/rules/ast-grep-rules/rules/no-console-except-error-js.yml +2 -2
- package/rules/ast-grep-rules/rules/no-console-except-error.yml +2 -2
- package/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +12 -7
- package/rules/ast-grep-rules/rules/unchecked-numeric-parse-python.yml +44 -0
- package/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +5 -3
- package/rules/tree-sitter-queries/typescript/console-statement.yml +2 -2
- package/scripts/analyze-pi-lens-logs.mjs +1275 -62
- package/scripts/download-grammars.js +5 -0
- package/scripts/grammars.lock.json +6 -1
- package/scripts/install-selftest.mjs +38 -35
- package/scripts/lib/host-provided-deps.mjs +13 -4
- package/scripts/lib/web-tree-sitter-dir.mjs +141 -0
- package/dist/clients/actionable-warnings-logger.js +0 -35
- package/dist/clients/actionable-warnings.js +0 -1594
- package/dist/clients/advisory-provenance.js +0 -457
- package/dist/clients/agent-behavior-client.js +0 -147
- package/dist/clients/agent-nudge.js +0 -325
- package/dist/clients/analysed-root.js +0 -1
- package/dist/clients/ast-grep-client.js +0 -731
- package/dist/clients/ast-grep-rule-manager.js +0 -146
- package/dist/clients/ast-grep-tool-logger.js +0 -118
- package/dist/clients/ast-grep-types.js +0 -10
- package/dist/clients/ast-grep-yaml-synth.js +0 -154
- package/dist/clients/atomic-write-staging.js +0 -75
- package/dist/clients/atomic-write.js +0 -189
- package/dist/clients/availability-probe-flight.js +0 -12
- package/dist/clients/bash-file-access.js +0 -1056
- package/dist/clients/biome-client.js +0 -357
- package/dist/clients/blocker-freshness.js +0 -837
- package/dist/clients/blocker-past-eof.js +0 -129
- package/dist/clients/bootstrap.js +0 -569
- package/dist/clients/bounded-cache.js +0 -190
- package/dist/clients/bounded-pid-file-lock.js +0 -202
- package/dist/clients/bounded-telemetry.js +0 -295
- package/dist/clients/build-identity.js +0 -95
- package/dist/clients/bundled-resource-health.js +0 -113
- package/dist/clients/bus-events-logger.js +0 -105
- package/dist/clients/bus-publish.js +0 -171
- package/dist/clients/cache/rule-cache.js +0 -190
- package/dist/clients/cache-manager.js +0 -465
- package/dist/clients/cache-observability.js +0 -1313
- package/dist/clients/call-graph.js +0 -852
- package/dist/clients/cargo-manifest.js +0 -422
- package/dist/clients/cascade-budget.js +0 -196
- package/dist/clients/cascade-format.js +0 -315
- package/dist/clients/cascade-logger.js +0 -31
- package/dist/clients/cascade-types.js +0 -9
- package/dist/clients/child-unref.js +0 -115
- package/dist/clients/code-quality-warnings.js +0 -286
- package/dist/clients/codebase-model.js +0 -173
- package/dist/clients/collateral-test-role.js +0 -40
- package/dist/clients/complexity-client.js +0 -462
- package/dist/clients/config-core/deny.js +0 -221
- package/dist/clients/config-core/index.js +0 -50
- package/dist/clients/config-core/merge.js +0 -357
- package/dist/clients/config-core/normalize.js +0 -340
- package/dist/clients/config-core/process-spec.js +0 -248
- package/dist/clients/config-core/provenance.js +0 -164
- package/dist/clients/config-core/records.js +0 -218
- package/dist/clients/config-core/resolve.js +0 -125
- package/dist/clients/config-core/safe-object.js +0 -78
- package/dist/clients/config-core/schema.js +0 -165
- package/dist/clients/config-diagnostic-codes.js +0 -283
- package/dist/clients/config-locations.js +0 -160
- package/dist/clients/config-resolve.js +0 -792
- package/dist/clients/config-schema.js +0 -251
- package/dist/clients/config-warn.js +0 -407
- package/dist/clients/console-guard-install.js +0 -26
- package/dist/clients/cooperative-budget.js +0 -42
- package/dist/clients/dead-code-client.js +0 -510
- package/dist/clients/dead-code-logger.js +0 -30
- package/dist/clients/deadline-utils.js +0 -280
- package/dist/clients/debug-handles.js +0 -211
- package/dist/clients/debug-heap.js +0 -174
- package/dist/clients/deferred-lsp-work.js +0 -106
- package/dist/clients/degradation-ledger.js +0 -396
- package/dist/clients/demoted-finding-render.js +0 -169
- package/dist/clients/dependency-checker.js +0 -862
- package/dist/clients/deps/ast-grep-napi.js +0 -22
- package/dist/clients/deps/js-yaml.js +0 -9
- package/dist/clients/deps/minimatch.js +0 -4
- package/dist/clients/deps/pi-tui.js +0 -14
- package/dist/clients/deps/typebox.js +0 -14
- package/dist/clients/deps/vscode-jsonrpc.js +0 -1
- package/dist/clients/deps/web-tree-sitter.js +0 -24
- package/dist/clients/diagnostic-dispositions.js +0 -594
- package/dist/clients/diagnostic-line-freshness.js +0 -305
- package/dist/clients/diagnostic-logger.js +0 -73
- package/dist/clients/diagnostic-tracker.js +0 -105
- package/dist/clients/diagnostics-publish.js +0 -230
- package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
- package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
- package/dist/clients/dispatch/collect-later-tier.js +0 -35
- package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
- package/dist/clients/dispatch/dispatcher.js +0 -1269
- package/dist/clients/dispatch/fact-provider-types.js +0 -1
- package/dist/clients/dispatch/fact-rule-runner.js +0 -17
- package/dist/clients/dispatch/fact-runner.js +0 -30
- package/dist/clients/dispatch/fact-scheduler.js +0 -68
- package/dist/clients/dispatch/fact-store.js +0 -377
- package/dist/clients/dispatch/facts/comment-facts.js +0 -22
- package/dist/clients/dispatch/facts/file-content.js +0 -19
- package/dist/clients/dispatch/facts/function-facts.js +0 -348
- package/dist/clients/dispatch/facts/import-facts.js +0 -204
- package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
- package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
- package/dist/clients/dispatch/finding-policy.js +0 -222
- package/dist/clients/dispatch/indent-detect.js +0 -411
- package/dist/clients/dispatch/inline-suppressions.js +0 -70
- package/dist/clients/dispatch/integration.js +0 -2377
- package/dist/clients/dispatch/lazy.js +0 -11
- package/dist/clients/dispatch/pending-runner-findings.js +0 -87
- package/dist/clients/dispatch/plan.js +0 -278
- package/dist/clients/dispatch/priorities.js +0 -20
- package/dist/clients/dispatch/rule-id-normalize.js +0 -50
- package/dist/clients/dispatch/rule-ignores.js +0 -62
- package/dist/clients/dispatch/rule-policy.js +0 -135
- package/dist/clients/dispatch/rules/async-noise.js +0 -40
- package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
- package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
- package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
- package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
- package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
- package/dist/clients/dispatch/rules/high-complexity.js +0 -72
- package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
- package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
- package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
- package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
- package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
- package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
- package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
- package/dist/clients/dispatch/runner-context.js +0 -52
- package/dist/clients/dispatch/runners/actionlint.js +0 -113
- package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
- package/dist/clients/dispatch/runners/biome-check.js +0 -283
- package/dist/clients/dispatch/runners/cpp-check.js +0 -236
- package/dist/clients/dispatch/runners/credo.js +0 -80
- package/dist/clients/dispatch/runners/cue-vet.js +0 -398
- package/dist/clients/dispatch/runners/dart-analyze.js +0 -202
- package/dist/clients/dispatch/runners/detekt.js +0 -169
- package/dist/clients/dispatch/runners/dotnet-build.js +0 -159
- package/dist/clients/dispatch/runners/elixir-check.js +0 -210
- package/dist/clients/dispatch/runners/eslint.js +0 -154
- package/dist/clients/dispatch/runners/fact-rules.js +0 -29
- package/dist/clients/dispatch/runners/fish-indent.js +0 -69
- package/dist/clients/dispatch/runners/gleam-check.js +0 -87
- package/dist/clients/dispatch/runners/go-vet.js +0 -90
- package/dist/clients/dispatch/runners/golangci-lint.js +0 -120
- package/dist/clients/dispatch/runners/hadolint.js +0 -79
- package/dist/clients/dispatch/runners/helm-lint.js +0 -171
- package/dist/clients/dispatch/runners/helm-render.js +0 -940
- package/dist/clients/dispatch/runners/htmlhint.js +0 -108
- package/dist/clients/dispatch/runners/index.js +0 -108
- package/dist/clients/dispatch/runners/javac.js +0 -89
- package/dist/clients/dispatch/runners/ktlint.js +0 -136
- package/dist/clients/dispatch/runners/lsp.js +0 -378
- package/dist/clients/dispatch/runners/markdownlint.js +0 -160
- package/dist/clients/dispatch/runners/mypy.js +0 -101
- package/dist/clients/dispatch/runners/oxlint.js +0 -398
- package/dist/clients/dispatch/runners/php-lint.js +0 -62
- package/dist/clients/dispatch/runners/phpstan.js +0 -120
- package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
- package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
- package/dist/clients/dispatch/runners/pyright.js +0 -169
- package/dist/clients/dispatch/runners/rubocop.js +0 -90
- package/dist/clients/dispatch/runners/ruff.js +0 -89
- package/dist/clients/dispatch/runners/rust-clippy.js +0 -251
- package/dist/clients/dispatch/runners/shellcheck.js +0 -169
- package/dist/clients/dispatch/runners/shfmt.js +0 -102
- package/dist/clients/dispatch/runners/spellcheck.js +0 -121
- package/dist/clients/dispatch/runners/spotbugs.js +0 -259
- package/dist/clients/dispatch/runners/sqlfluff.js +0 -174
- package/dist/clients/dispatch/runners/stylelint.js +0 -158
- package/dist/clients/dispatch/runners/swiftlint.js +0 -154
- package/dist/clients/dispatch/runners/taplo.js +0 -168
- package/dist/clients/dispatch/runners/terragrunt.js +0 -168
- package/dist/clients/dispatch/runners/tflint.js +0 -110
- package/dist/clients/dispatch/runners/tree-sitter.js +0 -620
- package/dist/clients/dispatch/runners/trivy-config.js +0 -247
- package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
- package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
- package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -85
- package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
- package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
- package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
- package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
- package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
- package/dist/clients/dispatch/runners/utils.js +0 -15
- package/dist/clients/dispatch/runners/vale.js +0 -116
- package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
- package/dist/clients/dispatch/runners/yamllint.js +0 -85
- package/dist/clients/dispatch/runners/zig-check.js +0 -91
- package/dist/clients/dispatch/suppress-writer.js +0 -69
- package/dist/clients/dispatch/tool-profile.js +0 -30
- package/dist/clients/dispatch/types.js +0 -21
- package/dist/clients/dispatch/utils/format-utils.js +0 -45
- package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
- package/dist/clients/disposition-logger.js +0 -32
- package/dist/clients/disposition-publish.js +0 -124
- package/dist/clients/durable-store.js +0 -97
- package/dist/clients/effective-config.js +0 -413
- package/dist/clients/env-utils.js +0 -83
- package/dist/clients/error-class.js +0 -23
- package/dist/clients/eval-timestamp.js +0 -17
- package/dist/clients/event-loop-hold.js +0 -274
- package/dist/clients/event-loop-monitor.js +0 -250
- package/dist/clients/extension-log.js +0 -504
- package/dist/clients/extension-mode.js +0 -73
- package/dist/clients/feature-hints.js +0 -103
- package/dist/clients/file-kinds.js +0 -412
- package/dist/clients/file-role.js +0 -134
- package/dist/clients/file-time.js +0 -160
- package/dist/clients/file-utils.js +0 -1032
- package/dist/clients/finding-delivery-gate.js +0 -463
- package/dist/clients/finding-identity.js +0 -88
- package/dist/clients/fix-worklog.js +0 -103
- package/dist/clients/format-events-publish.js +0 -343
- package/dist/clients/format-service.js +0 -222
- package/dist/clients/formatters-lazy.js +0 -9
- package/dist/clients/formatters.js +0 -1994
- package/dist/clients/freshness-cadence.js +0 -17
- package/dist/clients/freshness.js +0 -38
- package/dist/clients/generated-artifacts.js +0 -394
- package/dist/clients/generation-guard.js +0 -215
- package/dist/clients/git-guard.js +0 -923
- package/dist/clients/git-tracked-ignore.js +0 -243
- package/dist/clients/gitleaks-client.js +0 -509
- package/dist/clients/go-client.js +0 -104
- package/dist/clients/govulncheck-client.js +0 -605
- package/dist/clients/gradle-ktfmt-style.js +0 -252
- package/dist/clients/grammar-source.js +0 -465
- package/dist/clients/gzip-stage-write.js +0 -135
- package/dist/clients/hashline-anchor.js +0 -424
- package/dist/clients/hook-budgets.js +0 -76
- package/dist/clients/host-edit-normalize.js +0 -140
- package/dist/clients/host-ports.js +0 -39
- package/dist/clients/indent-retarget.js +0 -154
- package/dist/clients/install-diagnostics.js +0 -143
- package/dist/clients/installer/index.js +0 -5167
- package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
- package/dist/clients/installer/managed-tool-refresh.js +0 -783
- package/dist/clients/instance-reaper-state.js +0 -7
- package/dist/clients/instance-reaper.js +0 -1137
- package/dist/clients/instance-registry-lock.js +0 -145
- package/dist/clients/instance-registry.js +0 -773
- package/dist/clients/jscpd-client.js +0 -370
- package/dist/clients/json-cache-read.js +0 -65
- package/dist/clients/knip-client.js +0 -788
- package/dist/clients/language-policy.js +0 -252
- package/dist/clients/language-profile.js +0 -361
- package/dist/clients/language-registry.js +0 -603
- package/dist/clients/latency-logger.js +0 -719
- package/dist/clients/lazy-import.js +0 -21
- package/dist/clients/ledger-bounds.js +0 -54
- package/dist/clients/lens-config.js +0 -346
- package/dist/clients/lens-engine.js +0 -358
- package/dist/clients/lens-events.js +0 -125
- package/dist/clients/lens-flag-registry.js +0 -467
- package/dist/clients/lens-map.js +0 -1156
- package/dist/clients/live-bus-emitter.js +0 -74
- package/dist/clients/log-cleanup.js +0 -222
- package/dist/clients/lsp/aggregation.js +0 -178
- package/dist/clients/lsp/cascade-tier.js +0 -421
- package/dist/clients/lsp/client.js +0 -4465
- package/dist/clients/lsp/config.js +0 -689
- package/dist/clients/lsp/diagnostic-binding.js +0 -225
- package/dist/clients/lsp/document-drift.js +0 -467
- package/dist/clients/lsp/edits.js +0 -1219
- package/dist/clients/lsp/index.js +0 -8305
- package/dist/clients/lsp/inferred-project.js +0 -216
- package/dist/clients/lsp/jvm-runtime.js +0 -298
- package/dist/clients/lsp/language.js +0 -63
- package/dist/clients/lsp/launch.js +0 -725
- package/dist/clients/lsp/lombok.js +0 -158
- package/dist/clients/lsp/path-utils.js +0 -5
- package/dist/clients/lsp/pending-aux-coverage.js +0 -251
- package/dist/clients/lsp/position-encoding.js +0 -61
- package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
- package/dist/clients/lsp/server.js +0 -3209
- package/dist/clients/lsp/session-roots.js +0 -192
- package/dist/clients/lsp/spawn-history.js +0 -17
- package/dist/clients/lsp/sync-kind.js +0 -42
- package/dist/clients/lsp/tsserver-sync.js +0 -332
- package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
- package/dist/clients/lsp/wait-policy/classification.js +0 -85
- package/dist/clients/lsp/wait-policy/index.js +0 -10
- package/dist/clients/lsp/wait-policy/strategies.js +0 -303
- package/dist/clients/lsp/watch-queue.js +0 -61
- package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
- package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
- package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
- package/dist/clients/lsp-budget.js +0 -186
- package/dist/clients/lsp-document-symbols.js +0 -110
- package/dist/clients/lsp-lazy.js +0 -9
- package/dist/clients/lsp-mutation.js +0 -396
- package/dist/clients/lsp-status.js +0 -59
- package/dist/clients/map-with-concurrency.js +0 -40
- package/dist/clients/mcp/analyze.js +0 -420
- package/dist/clients/mcp/host-shim.js +0 -31
- package/dist/clients/mcp/ipc.js +0 -335
- package/dist/clients/mcp/review.js +0 -151
- package/dist/clients/mcp/session.js +0 -412
- package/dist/clients/memory-sampler.js +0 -208
- package/dist/clients/message-end-attribution.js +0 -30
- package/dist/clients/metrics-client.js +0 -107
- package/dist/clients/metrics-history.js +0 -327
- package/dist/clients/middle-man-analysis.js +0 -263
- package/dist/clients/model-provider.js +0 -53
- package/dist/clients/module-report-lsp.js +0 -189
- package/dist/clients/module-report.js +0 -2150
- package/dist/clients/mutating-tool.js +0 -651
- package/dist/clients/mutation-attribution.js +0 -368
- package/dist/clients/mutation-bridge.js +0 -240
- package/dist/clients/ndjson-logger.js +0 -734
- package/dist/clients/observed-mutation-sources.js +0 -101
- package/dist/clients/observed-mutation.js +0 -1253
- package/dist/clients/oldtext-autopatch.js +0 -128
- package/dist/clients/opaque-mutation-scan.js +0 -496
- package/dist/clients/opengrep-client.js +0 -328
- package/dist/clients/opengrep-config.js +0 -76
- package/dist/clients/package-manager.js +0 -607
- package/dist/clients/package-root.js +0 -38
- package/dist/clients/partial-edit-apply.js +0 -439
- package/dist/clients/path-attribution-telemetry.js +0 -43
- package/dist/clients/path-keyed-map.js +0 -108
- package/dist/clients/path-utils.js +0 -1244
- package/dist/clients/performance-report.js +0 -331
- package/dist/clients/persist-debounce.js +0 -70
- package/dist/clients/persistent-reverify.js +0 -271
- package/dist/clients/php-cs-fixer-config.js +0 -119
- package/dist/clients/pipeline.js +0 -1425
- package/dist/clients/post-autofix-notice.js +0 -37
- package/dist/clients/print-mode.js +0 -21
- package/dist/clients/probe-home-state.js +0 -228
- package/dist/clients/process-bridge.js +0 -66
- package/dist/clients/process-singletons.js +0 -210
- package/dist/clients/process-snapshot.js +0 -68
- package/dist/clients/project-changes.js +0 -181
- package/dist/clients/project-conventions.js +0 -171
- package/dist/clients/project-diagnostics/cache.js +0 -137
- package/dist/clients/project-diagnostics/extractors.js +0 -109
- package/dist/clients/project-diagnostics/fresh-fetch.js +0 -650
- package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
- package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
- package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
- package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
- package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
- package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
- package/dist/clients/project-diagnostics/scanner.js +0 -520
- package/dist/clients/project-diagnostics/types.js +0 -1
- package/dist/clients/project-lens-config.js +0 -799
- package/dist/clients/project-report.js +0 -701
- package/dist/clients/project-scale.js +0 -237
- package/dist/clients/project-scan-policy.js +0 -11
- package/dist/clients/project-snapshot-fingerprint.js +0 -48
- package/dist/clients/project-snapshot-persist-worker.js +0 -20
- package/dist/clients/project-snapshot.js +0 -1653
- package/dist/clients/project-trust.js +0 -181
- package/dist/clients/python-environment.js +0 -217
- package/dist/clients/python-provenance.js +0 -639
- package/dist/clients/quiet-window-config.js +0 -47
- package/dist/clients/quiet-window.js +0 -236
- package/dist/clients/read-bridge.js +0 -139
- package/dist/clients/read-expansion.js +0 -266
- package/dist/clients/read-guard-logger.js +0 -251
- package/dist/clients/read-guard-tool-lines.js +0 -1306
- package/dist/clients/read-guard.js +0 -1561
- package/dist/clients/recent-touches.js +0 -240
- package/dist/clients/redact/secrets.js +0 -449
- package/dist/clients/resource-sampler.js +0 -628
- package/dist/clients/reverse-deps.js +0 -270
- package/dist/clients/review-graph/builder.js +0 -5118
- package/dist/clients/review-graph/format.js +0 -33
- package/dist/clients/review-graph/git-identity.js +0 -157
- package/dist/clients/review-graph/import-resolvers.js +0 -481
- package/dist/clients/review-graph/persist-worker.js +0 -10
- package/dist/clients/review-graph/query.js +0 -244
- package/dist/clients/review-graph/revision-drift.js +0 -21
- package/dist/clients/review-graph/service.js +0 -96
- package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
- package/dist/clients/review-graph/symbol-id.js +0 -103
- package/dist/clients/review-graph/tsconfig-paths.js +0 -299
- package/dist/clients/review-graph/types.js +0 -1
- package/dist/clients/review-graph/workspace-modules.js +0 -449
- package/dist/clients/review-graph-logger.js +0 -81
- package/dist/clients/ruff-client.js +0 -152
- package/dist/clients/rules-scanner.js +0 -131
- package/dist/clients/run-duration.js +0 -55
- package/dist/clients/runtime-agent-end.js +0 -746
- package/dist/clients/runtime-config.js +0 -77
- package/dist/clients/runtime-context.js +0 -211
- package/dist/clients/runtime-coordinator.js +0 -1290
- package/dist/clients/runtime-session.js +0 -2485
- package/dist/clients/runtime-tool-call.js +0 -1284
- package/dist/clients/runtime-tool-result.js +0 -2034
- package/dist/clients/runtime-turn.js +0 -3600
- package/dist/clients/rust-client.js +0 -97
- package/dist/clients/safe-spawn.js +0 -2166
- package/dist/clients/sanitize.js +0 -286
- package/dist/clients/scan-utils.js +0 -25
- package/dist/clients/scratch-tree-policy.js +0 -165
- package/dist/clients/search-read-registration.js +0 -94
- package/dist/clients/secret-findings.js +0 -114
- package/dist/clients/security-scan-client.js +0 -352
- package/dist/clients/session-event-guard.js +0 -297
- package/dist/clients/session-lifecycle.js +0 -484
- package/dist/clients/session-start-observability.js +0 -94
- package/dist/clients/session-state-store.js +0 -101
- package/dist/clients/session-summary.js +0 -15
- package/dist/clients/sessionstart-logger.js +0 -27
- package/dist/clients/sg-runner.js +0 -876
- package/dist/clients/sgconfig.js +0 -347
- package/dist/clients/shared-checkout-guard.js +0 -338
- package/dist/clients/single-flight.js +0 -158
- package/dist/clients/situational-tool-telemetry.js +0 -108
- package/dist/clients/skills-resolver.js +0 -141
- package/dist/clients/slow-fs.js +0 -138
- package/dist/clients/smells-rollup.js +0 -231
- package/dist/clients/source-filter.js +0 -596
- package/dist/clients/source-walker.js +0 -211
- package/dist/clients/spawn-output-cap.js +0 -37
- package/dist/clients/spawn-timeout-cooldown.js +0 -110
- package/dist/clients/stale-marker.js +0 -17
- package/dist/clients/startup-scan.js +0 -400
- package/dist/clients/startup-timing.js +0 -130
- package/dist/clients/string-utils.js +0 -33
- package/dist/clients/subagent-mode.js +0 -111
- package/dist/clients/symbol-containment.js +0 -24
- package/dist/clients/symbol-types.js +0 -5
- package/dist/clients/test-runner-client.js +0 -2507
- package/dist/clients/test-runner-delivery.js +0 -287
- package/dist/clients/todo-scanner.js +0 -229
- package/dist/clients/tool-agreement.js +0 -423
- package/dist/clients/tool-config.js +0 -249
- package/dist/clients/tool-cwd.js +0 -270
- package/dist/clients/tool-definition.js +0 -47
- package/dist/clients/tool-event.js +0 -105
- package/dist/clients/tool-policy.js +0 -2755
- package/dist/clients/tool-probe.js +0 -53
- package/dist/clients/tool-render.js +0 -156
- package/dist/clients/tool-set-policy.js +0 -118
- package/dist/clients/tree-sitter-cache.js +0 -364
- package/dist/clients/tree-sitter-client.js +0 -4134
- package/dist/clients/tree-sitter-logger.js +0 -100
- package/dist/clients/tree-sitter-navigator.js +0 -269
- package/dist/clients/tree-sitter-query-loader.js +0 -569
- package/dist/clients/tree-sitter-shared.js +0 -158
- package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
- package/dist/clients/trivy-client.js +0 -467
- package/dist/clients/tui-fit.js +0 -50
- package/dist/clients/turn-context.js +0 -52
- package/dist/clients/turn-summary-render.js +0 -72
- package/dist/clients/turn-summary.js +0 -132
- package/dist/clients/typos-config.js +0 -29
- package/dist/clients/user-notify.js +0 -51
- package/dist/clients/vanished-instance-marker.js +0 -57
- package/dist/clients/warm-attach.js +0 -246
- package/dist/clients/widget-state.js +0 -1677
- package/dist/clients/word-index-logger.js +0 -49
- package/dist/clients/word-index-store.js +0 -459
- package/dist/clients/word-index.js +0 -2080
- package/dist/clients/workspace-topology.js +0 -389
- package/dist/clients/write-ordering-guard.js +0 -65
- package/dist/clients/zizmor-config.js +0 -327
- package/dist/i18n.js +0 -69
- package/dist/mcp/build-staleness.js +0 -124
- package/dist/scripts/lib/process-scan.mjs +0 -583
- package/dist/scripts/lib/skills-predicate.mjs +0 -129
- package/dist/tools/activate-tools.js +0 -87
- package/dist/tools/ast-grep-outline.js +0 -137
- package/dist/tools/ast-grep-replace.js +0 -244
- package/dist/tools/ast-grep-search.js +0 -762
- package/dist/tools/effective-config.js +0 -90
- package/dist/tools/lens-diagnostic-mark.js +0 -375
- package/dist/tools/lens-diagnostics.js +0 -2544
- package/dist/tools/lsp-diagnostics.js +0 -1634
- package/dist/tools/lsp-navigation.js +0 -1367
- package/dist/tools/lsp-structured-output.js +0 -294
- package/dist/tools/module-report.js +0 -382
- package/dist/tools/project-report.js +0 -86
- package/dist/tools/render-compact.js +0 -374
- package/dist/tools/scan-progress.js +0 -53
- package/dist/tools/shared.js +0 -29
- package/dist/tools/symbol-search.js +0 -155
|
@@ -50,6 +50,8 @@ Dispatch is diagnostics-oriented: automatic formatting and safe autofix happen i
|
|
|
50
50
|
| CMake | ✓ (cmake-language-server) | lsp | cmake-format |
|
|
51
51
|
| CUE | ✓ (syntax via cue lsp, evaluation via cue vet) | lsp, cue-vet | cue fmt |
|
|
52
52
|
|
|
53
|
+
### CUE tree-sitter grammar
|
|
54
|
+
|
|
53
55
|
`cue lsp` reports load and parse errors as you type but leaves conflicting
|
|
54
56
|
values and failed constraints to `cue vet` — the `cue-vet` auxiliary runner
|
|
55
57
|
(#1522) covers that gap, so together they give full coverage: syntax/parse
|
|
@@ -79,6 +81,21 @@ Both are upstream grammar limitations (tracked among
|
|
|
79
81
|
[eonpatapon/tree-sitter-cue](https://github.com/eonpatapon/tree-sitter-cue)'s
|
|
80
82
|
open issues), not something a query change here can fix.
|
|
81
83
|
|
|
84
|
+
## Non-core grammars
|
|
85
|
+
|
|
86
|
+
The `tree-sitter` runner and `symbol_search`/`module_report` structural
|
|
87
|
+
extraction ship a fixed set of core grammars; grammars for the other
|
|
88
|
+
languages in the table above (CUE included) are fetched lazily on first use
|
|
89
|
+
into web-tree-sitter's resolved package directory, verified against
|
|
90
|
+
`scripts/grammars.lock.json`. This resolution works on a runtime that cannot
|
|
91
|
+
resolve a bare package specifier — pi shipped as a `bun build --compile`
|
|
92
|
+
binary — via one shared subpath-based ladder
|
|
93
|
+
(`scripts/lib/web-tree-sitter-dir.mjs`, #3409); before that fix, non-core
|
|
94
|
+
languages could never be analysed on those hosts. A grammar that never loads
|
|
95
|
+
(fetch failure, unwritable target, an unsupported runtime) is recorded as a
|
|
96
|
+
`grammar_unavailable` **skip**, never a clean pass
|
|
97
|
+
(`clients/dispatch/runners/tree-sitter.ts`).
|
|
98
|
+
|
|
82
99
|
## Considered and skipped (2026-08-20 survey, closed out by #1757)
|
|
83
100
|
|
|
84
101
|
Recorded so these are not re-litigated. The 2026-08-20 survey's first pass
|
|
@@ -9,7 +9,8 @@ confirmed against Neovim's LSP client, which sidesteps this entirely by being as
|
|
|
9
9
|
|
|
10
10
|
Generate/refresh this matrix with `node scripts/characterize-lsp.mjs [--install]`
|
|
11
11
|
(the `mode` column) and `node scripts/probe-clean-signal.mjs [--install]` (the
|
|
12
|
-
`clean-behavior` column — 4-way: 2 / 2* / 3 / unknown
|
|
12
|
+
`clean-behavior` column — 4-way: 2 / 2* / 3 / unknown — and the `first-publish`
|
|
13
|
+
column, #3310). Both **merge** in place: a server the
|
|
13
14
|
running host couldn't spawn keeps its prior row, so an ubuntu-poor run can't
|
|
14
15
|
regress a richer one (#390). The nightly **tool-smoke** workflow runs both (plus
|
|
15
16
|
`server-capabilities.mjs`) and opens/updates a single auto-PR
|
|
@@ -27,13 +28,56 @@ anything). The native TS7 launch variant (`typescript7`/`typescript7-clean`,
|
|
|
27
28
|
#524/#526) is deliberately excluded from comparison against classic's marker —
|
|
28
29
|
they share a server id but not a verified clean-signal behavior.
|
|
29
30
|
|
|
31
|
+
What IS gated is the pair of COMMITTED sources:
|
|
32
|
+
`tests/config/lsp-clean-behavior-census.test.ts` (#3347) compares the
|
|
33
|
+
`clean-behavior` column below against the `silentOnClean` markers in both
|
|
34
|
+
directions — every measured push row against its marker, and every marker
|
|
35
|
+
against a push row measured `silent` — so a nightly refresh cannot merge a
|
|
36
|
+
re-measured server until its marker moves with it, and a marker cannot outlive
|
|
37
|
+
the measurement that justified it. Push rows the probe has not classified are
|
|
38
|
+
admitted by name in that file, and an admission reds once its row becomes
|
|
39
|
+
measured.
|
|
40
|
+
|
|
41
|
+
## First publish: is the first push an answer? (#3310)
|
|
42
|
+
|
|
43
|
+
A second, ORTHOGONAL axis to the tiers below, measured from the same probe run
|
|
44
|
+
and written as the `first-publish` column:
|
|
45
|
+
|
|
46
|
+
| value | meaning | wait policy |
|
|
47
|
+
|---|---|---|
|
|
48
|
+
| `direct` | the first publish for a dirty file carries the findings | the first publish resolves the wait, as it always did |
|
|
49
|
+
| `empty-first` | the server answers `didOpen` with an EMPTY set while a one-time index builds, then publishes again once indexing ends | the client HOLDS that first empty publish (`emptyFirstPublish: "indexing"` in `clients/lsp/wait-policy/strategies.ts`); the server's own next publish releases it, and the hold is one-shot per client session |
|
|
50
|
+
| `empty-only` | every publish on the dirty fixture was empty | not classifiable on this axis — an undiagnosed dirty fixture looks exactly like an unfinished index, so nothing is inferred in either direction |
|
|
51
|
+
| `n/a (pull)` / `TBD` | pull-mode, or not measured on a host that could reach the server | no behavior change |
|
|
52
|
+
|
|
53
|
+
Why this axis had to exist at all: the wait needs a positive signal, and an
|
|
54
|
+
empty publish is a positive signal for a Tier 2/2\* server (a genuinely clean
|
|
55
|
+
file) and a MEANINGLESS one for a server that has not finished indexing. The two
|
|
56
|
+
are identical on the wire, so the difference is a measurement, not an inference.
|
|
57
|
+
intelephense is the measured member (2026-09-23, v1.18.5): `[]` at +295ms,
|
|
58
|
+
`indexingStarted` at +301ms — i.e. AFTER the empty publish, so no
|
|
59
|
+
work-in-progress signal is available at the moment the decision must be made —
|
|
60
|
+
`indexingEnded` at +689ms and the real 2-diagnostic set at +696ms. On a
|
|
61
|
+
genuinely clean file the same session publishes `[]` twice (at +304ms and again
|
|
62
|
+
at +663ms, right after indexing), which is what lets the held publish be
|
|
63
|
+
released by the server itself rather than by a timer; a WARM touch publishes the
|
|
64
|
+
real set first, so the hold costs nothing once the session is warm. pi-lens does
|
|
65
|
+
not advertise `window.workDoneProgress` (#974: advertising it crash-loops
|
|
66
|
+
opengrep's `--experimental` LSP mode), so `$/progress` is not an available
|
|
67
|
+
discriminator either.
|
|
68
|
+
|
|
69
|
+
`tests/config/lsp-first-publish-census.test.ts` compares this column against the
|
|
70
|
+
`emptyFirstPublish` markers and reds in BOTH directions, which is the expiry
|
|
71
|
+
check: when the nightly re-measures a server into a different class, the docs
|
|
72
|
+
refresh cannot merge until the marker is updated with it.
|
|
73
|
+
|
|
30
74
|
## The strategies
|
|
31
75
|
|
|
32
76
|
| Tier | Signal | Affirmative clean? | Example |
|
|
33
77
|
|---|---|---|---|
|
|
34
78
|
| **1 — pull** | `textDocument/diagnostic` returns an authoritative report (empty = clean) | YES, deterministic | rust-analyzer |
|
|
35
79
|
| **2 — push, publishes-versioned** | `publishDiagnostics([])` **with version** on every scan, incl. clean→clean | YES, currency-proven via version | ast-grep |
|
|
36
|
-
| **2\* — push, publishes-unversioned** | re-publishes on a clean scan but **version-less** — the wait still early-returns (the client accepts a version-less publish as fresh: it can't be proven stale), but currency is only *temporally correlated*, not proven | YES at runtime, with a staleness-risk caveat (not a latency cost) | opengrep |
|
|
80
|
+
| **2\* — push, publishes-unversioned** | re-publishes on a clean scan but **version-less** — the wait still early-returns (the client accepts a version-less publish as fresh: it can't be proven stale), but currency is only *temporally correlated*, not proven. Since #3484 the client fences a server measured to answer a `documentSymbol` fence before it publishes (`diagnosticsFence: "reply-first"`: yaml, intelephense): a pre-edit publish is dropped until the fence's reply. Every other 2\* server (docker publishes before answering; prisma, taplo, zls, dart, gleam, clojure unmarked) keeps this behaviour | YES at runtime, with a staleness-risk caveat (not a latency cost) | opengrep |
|
|
37
81
|
| **3 — push, silent on clean** | server publishes nothing when nothing changed | **NO** — budget-wait floor (safe; a timeout is *not* a false clean). **This tier is #458's learned-deadline target set.** | typescript-language-server |
|
|
38
82
|
| **Navigation-only — custom, no evidence** | custom `lsp.servers.*` entry has no pull provider and has not published in this session | **NO** — diagnostics are unsupported; skip the wait and report navigation-only | Dexter |
|
|
39
83
|
|
|
@@ -48,7 +92,7 @@ the next touch probes again. Only silence through the full push budget latches
|
|
|
48
92
|
that server id as navigation-only for the service session. A publish upgrades it
|
|
49
93
|
to the ordinary push-wait policy.
|
|
50
94
|
|
|
51
|
-
## Matrix (dev box + CI nightly; mode last refreshed 2026-06-17 from run 27713958681, clean-behavior probed
|
|
95
|
+
## Matrix (dev box + CI nightly; mode last refreshed 2026-06-17 from run 27713958681, clean-behavior probed in run 35914033696 — #460)
|
|
52
96
|
|
|
53
97
|
`mode` from cached capabilities; `clean-behavior` from the phase-aware publish-trace
|
|
54
98
|
probe. The probe attributes publishes to two phases — the **dirty touch** (proves the
|
|
@@ -63,37 +107,71 @@ nightly steps, **dev** = the dev box (a row measured on both reads `dev+ci`).
|
|
|
63
107
|
Merges never blank a prior good value, so a CI non-result leaves the dev
|
|
64
108
|
classification standing.
|
|
65
109
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
110
|
+
Two bounded guards keep that preservation from hiding a dead instrument
|
|
111
|
+
(#3401). A `direct` `first-publish` cell whose axis the nightly probe does not
|
|
112
|
+
re-observe is stamped once with the date of its first miss and degrades to
|
|
113
|
+
`unknown` once five calendar days have elapsed since it (skipped nights do not
|
|
114
|
+
stall it, and a re-observation clears the stamp). `empty-first` cells are never
|
|
115
|
+
expired: they back the live `emptyFirstPublish` markers (php, terraform) and
|
|
116
|
+
expiring one would erase the measurement behind a marker. A `clean-behavior`/
|
|
117
|
+
`tier` change is written only after two consecutive nightly runs observe the
|
|
118
|
+
same new value, so one flapping nightly (ast-grep went 2 → 2* → 3 → 2* across
|
|
119
|
+
four runs) cannot rewrite a cell; a night that measured nothing for the lang
|
|
120
|
+
resets the hold. A subset probe (`probe-clean-signal.mjs <langs>`) leaves the
|
|
121
|
+
bookkeeping of the langs it did not probe untouched.
|
|
122
|
+
|
|
123
|
+
The bookkeeping lives in the generated `## Capability matrix refresh state`
|
|
124
|
+
section at the end of this doc, the only state the refresh persists. The clock
|
|
125
|
+
is the nightly run, not the bot PR's merge: each nightly starts from the last
|
|
126
|
+
`bot/lsp-docs-refresh` doc when that branch is ahead of master and was built on
|
|
127
|
+
master's current doc (`scripts/seed-matrix-from-bot-branch.mjs`), and from
|
|
128
|
+
master's doc otherwise (branch absent, squash-merged, or master edited the doc
|
|
129
|
+
since). Closing the bot PR unmerged does not reset the bookkeeping: the branch
|
|
130
|
+
is kept and keeps seeding, so only deleting `bot/lsp-docs-refresh` resets it.
|
|
131
|
+
|
|
132
|
+
`vue`'s `clean-behavior` was hand-reset to `unknown` (#3390): its
|
|
133
|
+
`publishes-unversioned` cell came from 58/45 publishes that the shared
|
|
134
|
+
`extension.log` window had attributed to vue but that belonged to `tinymist`.
|
|
135
|
+
With the sink scoped per server, nightly 36046209160 measured vue 0/0, and an
|
|
136
|
+
`unknown` result is never written by the merge above — so the refuted value had
|
|
137
|
+
to be cleared by hand. It stays `unknown` until a run observes
|
|
138
|
+
`@vue/language-server` publish; `tests/config/lsp-clean-behavior-census.test.ts`
|
|
139
|
+
carries the named admission until then.
|
|
140
|
+
|
|
141
|
+
| lang | server | mode | clean-behavior | first-publish | tier | src |
|
|
142
|
+
|---|---|---|---|---|---|---|
|
|
143
|
+
| json | vscode-json-language-server | pull | — | n/a (pull) | 1 | dev+ci |
|
|
144
|
+
| css | vscode-css-language-server | pull | — | n/a (pull) | 1 | dev+ci |
|
|
145
|
+
| html | vscode-html-language-server | pull | — | n/a (pull) | 1 | dev+ci |
|
|
146
|
+
| rust | rust-analyzer | pull | — | n/a (pull) | 1 | dev+ci |
|
|
147
|
+
| svelte | svelte-language-server | pull | — | n/a (pull) | 1 | dev+ci |
|
|
148
|
+
| deno | deno (alt of typescript) | pull | — | n/a (pull) | 1 | dev+ci |
|
|
149
|
+
| ruby | ruby-lsp | pull | — | n/a (pull) | 1 | ci |
|
|
150
|
+
| csharp | csharp-ls | pull | — | n/a (pull) | 1 | ci |
|
|
151
|
+
| typescript | typescript-language-server | push-only | silent | direct | 3 | dev+ci |
|
|
152
|
+
| markdown | marksman | push-only | silent | direct | 3 | ci |
|
|
153
|
+
| lua | lua-language-server | push-only | silent | direct | 3 | dev+ci |
|
|
154
|
+
| python | pyright | push-only | publishes-versioned | direct | 2 | dev+ci |
|
|
155
|
+
| jedi | jedi-language-server (alt of python) | push-only | publishes-versioned | direct | 2 | ci |
|
|
156
|
+
| yaml | yaml-language-server | push-only | publishes-unversioned | direct | 2* | dev+ci |
|
|
157
|
+
| shell | bash-language-server | push-only | publishes-versioned | direct | 2 | dev+ci |
|
|
158
|
+
| dockerfile | docker-langserver | push-only | publishes-unversioned | direct | 2* | dev+ci |
|
|
159
|
+
| toml | taplo | push-only | publishes-unversioned | direct | 2* | dev+ci |
|
|
160
|
+
| terraform | terraform-ls | push-only | publishes-unversioned | empty-first | 2* | dev+ci |
|
|
161
|
+
| prisma | @prisma/language-server | push-only | publishes-unversioned | direct | 2* | dev+ci |
|
|
162
|
+
| php | intelephense | push-only | publishes-unversioned | empty-first | 2* | dev+ci |
|
|
163
|
+
| zig | zls | push-only | publishes-unversioned | direct | 2* | dev+ci |
|
|
164
|
+
| vue | @vue/language-server | push-only | unknown | unknown | 2/3? | dev+ci |
|
|
165
|
+
| dart | dart language-server | push-only | publishes-unversioned | direct | 2* | ci |
|
|
166
|
+
| gleam | gleam lsp | push-only | publishes-unversioned | direct | 2* | ci |
|
|
167
|
+
| clojure | clojure-lsp | push-only | publishes-unversioned | direct | 2* | ci |
|
|
168
|
+
| opengrep | opengrep (aux) | push-only | publishes-unversioned | direct | 2* | dev+ci |
|
|
169
|
+
| ast-grep | ast-grep (aux) | push-only | publishes-versioned | direct | 2 | dev+ci |
|
|
170
|
+
| cue | CUE Language Server (cue lsp serve) | push-only | publishes-versioned | direct | 2 | dev+ci |
|
|
93
171
|
|
|
94
172
|
**Unknown — fixture exists, mode not yet captured.** The toolchain-gated family
|
|
95
173
|
(no auto-install today; tracked in #241) — `go` (gopls), `java` (jdtls),
|
|
96
|
-
`kotlin`, `swift` (sourcekit-lsp), `
|
|
174
|
+
`kotlin`, `swift` (sourcekit-lsp), `cpp` (clangd), `haskell`, `elixir`,
|
|
97
175
|
`ocaml`, `nix` (nixd), `fsharp`. Their servers don't install in the nightly, so
|
|
98
176
|
characterize reports `unknown` (a non-failure ⚠). Once #241 lands they'll fill in
|
|
99
177
|
the same way clojure-lsp/gleam now do (both auto-install via the github strategy
|
|
@@ -103,7 +181,8 @@ and were characterized `push-only` in the run above).
|
|
|
103
181
|
- **Mode ≠ tier, and the split needs BOTH axes.** Push-only further splits along
|
|
104
182
|
latency (does anything publish on a clean transition? — silence is the only
|
|
105
183
|
budget-wait case, because pi-lens's publish handler emits and early-returns the
|
|
106
|
-
wait on
|
|
184
|
+
wait on every publish, versioned or not, with the single #3310 exception of a
|
|
185
|
+
held empty FIRST publish from an `empty-first` server) and currency-proof (is the publish
|
|
107
186
|
versioned, i.e. provably about the live edit?). The 4-way
|
|
108
187
|
`probe-clean-signal.mjs` measurement drives this: ast-grep → 2, yaml/opengrep →
|
|
109
188
|
2\*, typescript (clean file) → 3.
|
|
@@ -121,6 +200,16 @@ and were characterized `push-only` in the run above).
|
|
|
121
200
|
fixtures for exactly this reason. Corollary: a 2\* measured only on a dirty
|
|
122
201
|
fixture may overstate a server whose publishes stop when its set goes empty —
|
|
123
202
|
langs without a clean fixture carry that caveat.
|
|
203
|
+
- **The probe's publish capture was dead, and the column looked alive anyway
|
|
204
|
+
(#3310).** `probe-clean-signal.mjs` intercepted `console.error` for the
|
|
205
|
+
`[lsp-pub]` trace, but #1333 moved that trace's sink to `extension.log` — so
|
|
206
|
+
every phase counted zero publishes, every server classified `unknown`, and the
|
|
207
|
+
#390 merge guard then preserved the July 2026 values verbatim. A dead
|
|
208
|
+
instrument and a healthy one are indistinguishable when non-results are
|
|
209
|
+
discarded by design. The probe now reads the sink the client actually writes;
|
|
210
|
+
`first-publish` measurements on the dev box, 2026-09-23: php `empty-first`,
|
|
211
|
+
typescript / opengrep / ast-grep / marksman `direct` (so the class does not
|
|
212
|
+
extend to them on the measurement, whatever their comments suggest).
|
|
124
213
|
- **#458's learned-deadline target set = the tier-3 rows only.** 2\* rows resolve
|
|
125
214
|
the wait at runtime and must NOT be given learned deadlines.
|
|
126
215
|
- **Tier 3 is budget-bound by necessity**, not laziness: a silent server's silence is
|
|
@@ -163,3 +252,13 @@ marker; a mismatch means the marker may need a human update (#529). `unknown`
|
|
|
163
252
|
observations are never compared (a slow/absent server is not evidence either way).
|
|
164
253
|
|
|
165
254
|
_None observed as of the last probe run._
|
|
255
|
+
|
|
256
|
+
## Capability matrix refresh state (nightly-generated)
|
|
257
|
+
|
|
258
|
+
Bookkeeping for the date-based `direct` `first-publish` expiry (#3401), the
|
|
259
|
+
two-run `clean-behavior` hysteresis and the consecutive-night `idle-eviction`
|
|
260
|
+
counts (#3989). Regenerated every run; never a measurement.
|
|
261
|
+
|
|
262
|
+
```json
|
|
263
|
+
{"idle-eviction":{"docker":{"nights":[{"day":"2026-10-07","rssMb":64,"coldMs":566}]},"json":{"nights":[{"day":"2026-10-07","rssMb":67,"coldMs":1116}]},"powershell":{"nights":[{"day":"2026-10-07","rssMb":155,"coldMs":2601}]},"python-jedi":{"nights":[{"day":"2026-10-07","rssMb":51,"coldMs":1796}]},"zizmor":{"nights":[{"day":"2026-10-07","rssMb":58,"coldMs":608}]}}}
|
|
264
|
+
```
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# LSP idle-eviction measurement
|
|
2
|
+
|
|
3
|
+
Per-server cost and safety of releasing an idle language-server client, measured
|
|
4
|
+
by the nightly so each server's `idleEviction` declaration in
|
|
5
|
+
`clients/lsp/server.ts` can be made from evidence (#3645). Generated by
|
|
6
|
+
`node scripts/measure-lsp-idle-eviction.mjs [--install]` (requires
|
|
7
|
+
`npm run build:dist`); it changes no server's policy.
|
|
8
|
+
|
|
9
|
+
For each registry server the probe spawns the server on its smoke fixture,
|
|
10
|
+
records the first diagnostics, then makes the server evictable in the probe
|
|
11
|
+
process only and lets the real idle-eviction timer release it. The next request
|
|
12
|
+
respawns it through the ordinary path. A server is `eligible` only when the
|
|
13
|
+
respawned server reports every finding it reported before eviction; the
|
|
14
|
+
`coverage` column is that comparison, and for an auxiliary scanner it is the
|
|
15
|
+
content-bound coverage check the auxiliary freeze depends on. A server that
|
|
16
|
+
cannot demonstrate it is never proposed for eviction on perf grounds alone.
|
|
17
|
+
|
|
18
|
+
_Last generated: 2026-10-07 on linux; 48 registry servers: 32 eligible, 0 vetoed, 2 inconclusive, 14 unavailable (0 not reached: budget)._
|
|
19
|
+
|
|
20
|
+
## Per-server rows
|
|
21
|
+
|
|
22
|
+
Only stable columns are committed, so the nightly refresh changes this file
|
|
23
|
+
only when a server's outcome changes. The measured init duration, resident
|
|
24
|
+
memory of the server's process tree and post-eviction cold start are in the
|
|
25
|
+
nightly run's step log and job summary, one row per server. `n/a` means not
|
|
26
|
+
measured, never zero: **respawn** is whether the next request after eviction
|
|
27
|
+
brought the server back, **coverage** is whether the respawned server kept
|
|
28
|
+
every baseline finding.
|
|
29
|
+
|
|
30
|
+
A server that reports extra findings after the respawn (`widened`) still reads
|
|
31
|
+
`preserved`, because nothing was lost, but a first scan that grows on respawn
|
|
32
|
+
is a sign the baseline was partial. Any policy flip needs `preserved` on
|
|
33
|
+
several nights, not one; a `widened` disclosure is per run and is shown in the
|
|
34
|
+
step log only, because it flaps.
|
|
35
|
+
|
|
36
|
+
| server | role | declared | result | reason | respawn | coverage |
|
|
37
|
+
|---|---|---|---|---|---|---|
|
|
38
|
+
| ast-grep | auxiliary | unmeasured | eligible | · | ok | preserved |
|
|
39
|
+
| bash | primary | transparent | eligible | · | ok | preserved |
|
|
40
|
+
| clojure | primary | transparent | eligible | · | ok | preserved |
|
|
41
|
+
| cmake | primary | unmeasured | inconclusive | no-baseline | n/a | unproven |
|
|
42
|
+
| cpp | primary | transparent | eligible | · | ok | preserved |
|
|
43
|
+
| csharp | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
|
|
44
|
+
| css | primary | transparent | eligible | · | ok | preserved |
|
|
45
|
+
| cue | primary | unmeasured | eligible | · | ok | preserved |
|
|
46
|
+
| dart | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
|
|
47
|
+
| deno | primary | transparent | eligible | · | ok | preserved |
|
|
48
|
+
| docker | primary | unmeasured | eligible | · | ok | preserved |
|
|
49
|
+
| docker-official | primary | unmeasured | unavailable | no-fixture | n/a | n/a |
|
|
50
|
+
| elixir | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
|
|
51
|
+
| expert | primary | unmeasured | eligible | · | ok | preserved |
|
|
52
|
+
| fish | primary | transparent | eligible | · | ok | preserved |
|
|
53
|
+
| fsharp | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
|
|
54
|
+
| gleam | primary | unmeasured | eligible | · | ok | preserved |
|
|
55
|
+
| go | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
|
|
56
|
+
| haskell | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
|
|
57
|
+
| html | primary | transparent | eligible | · | ok | preserved |
|
|
58
|
+
| java | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
|
|
59
|
+
| json | primary | unmeasured | eligible | · | ok | preserved |
|
|
60
|
+
| kotlin | primary | unmeasured | eligible | · | ok | preserved |
|
|
61
|
+
| lua | primary | unmeasured | eligible | · | ok | preserved |
|
|
62
|
+
| marksman | primary | transparent | eligible | · | ok | preserved |
|
|
63
|
+
| nix | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
|
|
64
|
+
| ocaml | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
|
|
65
|
+
| omnisharp | primary | unmeasured | unavailable | no-fixture | n/a | n/a |
|
|
66
|
+
| opengrep | auxiliary | transparent | eligible | · | ok | preserved |
|
|
67
|
+
| php | primary | transparent | eligible | · | ok | preserved |
|
|
68
|
+
| powershell | primary | unmeasured | eligible | · | ok | preserved |
|
|
69
|
+
| prisma | primary | transparent | eligible | · | ok | preserved |
|
|
70
|
+
| python | primary | transparent | eligible | · | ok | preserved |
|
|
71
|
+
| python-jedi | primary | unmeasured | eligible | · | ok | preserved |
|
|
72
|
+
| ruby | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
|
|
73
|
+
| rust | primary | unmeasured | eligible | · | ok | preserved |
|
|
74
|
+
| shuck | primary | unmeasured | unavailable | server-not-started | n/a | n/a |
|
|
75
|
+
| svelte | primary | unmeasured | eligible | · | ok | preserved |
|
|
76
|
+
| swift | primary | unmeasured | unavailable | tool-unavailable | n/a | n/a |
|
|
77
|
+
| terraform | primary | unmeasured | eligible | · | ok | preserved |
|
|
78
|
+
| tinymist | primary | unmeasured | eligible | · | ok | preserved |
|
|
79
|
+
| toml | primary | unmeasured | eligible | · | ok | preserved |
|
|
80
|
+
| typescript | primary | transparent | eligible | · | ok | preserved |
|
|
81
|
+
| typos | auxiliary | unmeasured | eligible | · | ok | preserved |
|
|
82
|
+
| vue | primary | unmeasured | inconclusive | no-baseline | n/a | unproven |
|
|
83
|
+
| yaml | primary | transparent | eligible | · | ok | preserved |
|
|
84
|
+
| zig | primary | unmeasured | eligible | · | ok | preserved |
|
|
85
|
+
| zizmor | auxiliary | unmeasured | eligible | · | ok | preserved |
|
|
86
|
+
|
|
87
|
+
## Declared versus measured
|
|
88
|
+
|
|
89
|
+
`drift` means the registry evicts a server the measurement vetoes. A `proposal`
|
|
90
|
+
or `info` line is for a maintainer to act on in a follow-up; this run changed
|
|
91
|
+
nothing.
|
|
92
|
+
|
|
93
|
+
- **ast-grep** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
94
|
+
- **cue** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
95
|
+
- **docker** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
96
|
+
- **expert** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
97
|
+
- **gleam** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
98
|
+
- **json** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
99
|
+
- **kotlin** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
100
|
+
- **lua** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
101
|
+
- **powershell** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
102
|
+
- **python-jedi** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
103
|
+
- **rust** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
104
|
+
- **svelte** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
105
|
+
- **terraform** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
106
|
+
- **tinymist** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
107
|
+
- **toml** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
108
|
+
- **typos** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
109
|
+
- **zig** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
110
|
+
- **zizmor** [proposal] declared unmeasured but eviction and respawn preserved its findings
|
|
111
|
+
|
|
112
|
+
## Reasons
|
|
113
|
+
|
|
114
|
+
- `no-fixture`: No smoke fixture routes to this server, so there is nothing to spawn.
|
|
115
|
+
- `tool-unavailable`: A tool this server's fixture needs could not be installed or found on the generating host.
|
|
116
|
+
- `setup-failed`: The fixture's workspace setup step failed.
|
|
117
|
+
- `server-not-started`: The fixture ran but this server never became a live client.
|
|
118
|
+
- `budget-exhausted`: The run's wall-clock budget ended before this server was reached.
|
|
119
|
+
- `probe-error`: The probe itself threw before it had a baseline.
|
|
120
|
+
- `no-baseline`: The server produced no finding on the fixture, so nothing can show its coverage survives eviction.
|
|
121
|
+
- `not-evicted`: The idle-eviction timer did not release the client within the bound.
|
|
122
|
+
- `client-died`: The client went away without an idle-eviction record, so the release was a crash, not the eviction path.
|
|
123
|
+
- `respawn-failed`: After eviction the next request could not bring the server back.
|
|
124
|
+
- `findings-narrowed`: After the respawn the server reported fewer findings than before eviction.
|
package/docs/mcp.md
CHANGED
|
@@ -112,7 +112,7 @@ New files:
|
|
|
112
112
|
|
|
113
113
|
| tool | maps to | purpose |
|
|
114
114
|
|------|---------|---------|
|
|
115
|
-
| `pilens_analyze` | `analyzeFile` (warm) / worker (fresh) | run the per-edit pipeline on a file; returns diagnostics + timing. `mode: warm\|fresh`. **Correctness + mechanism probe.** |
|
|
115
|
+
| `pilens_analyze` | `analyzeFile` (warm) / worker (fresh) | run the per-edit pipeline on a file; returns diagnostics + timing. `mode: warm\|fresh`. **Correctness + mechanism probe.** Each `latency.runners[]` row carries `failureKind` when the runner set one: `failed` + `blocking_diagnostics` is a run whose findings failed the check; `failed` with any other kind, or none, is a runner that produced no usable result. |
|
|
116
116
|
| `pilens_ast_grep_search` | `ast_grep_search` | AST-aware structural search. |
|
|
117
117
|
| `pilens_ast_grep_replace` | `ast_grep_replace` | AST-aware structural replace. |
|
|
118
118
|
| `pilens_diagnostics` | `lens_diagnostics` | session or LSP diagnostics, selected by `source`, `scope`, and `severity`. |
|
|
@@ -131,6 +131,17 @@ New files:
|
|
|
131
131
|
| `pilens_symbol_search` | `symbol_search` | search the persisted symbol index. |
|
|
132
132
|
| `pilens_turn_end` | turn lifecycle | settle turn-end work and return findings. |
|
|
133
133
|
|
|
134
|
+
Every tool's `inputSchema` (from `tools/list`) is also the set of argument keys
|
|
135
|
+
the dispatcher accepts without comment: an undeclared key is reported in the
|
|
136
|
+
result (a leading `Ignored unknown argument(s) ...` line, plus
|
|
137
|
+
`structuredContent.ignoredArguments`). An ignored key that leaves a required
|
|
138
|
+
input missing, or that is a declared parameter the call did not send written
|
|
139
|
+
another way (`pilens_diagnostics {"filePath": ...}` for `path`; predicate in
|
|
140
|
+
[public-api-stability.md](public-api-stability.md)), turns the call into an error
|
|
141
|
+
instead of a run on defaults; a looser "did you mean" stays a warning (#3749;
|
|
142
|
+
details in [agent-tools.md](agent-tools.md)). The check is the one seam in
|
|
143
|
+
`mcp/server.ts` `tools/call`, through `mcp/tool-arguments.ts`.
|
|
144
|
+
|
|
134
145
|
## Packaging / wiring
|
|
135
146
|
|
|
136
147
|
- `package.json`: add `"bin": { "pi-lens-mcp": "./dist/mcp/server.js" }`; add
|
|
@@ -383,9 +394,14 @@ be exercised + debugged directly through Claude Code without running pi.
|
|
|
383
394
|
hook (reads the tool payload from stdin → `tool_input.path`/`file_path` + cwd)
|
|
384
395
|
AND as a plain CLI (`--file=`). Defaults to `no-lsp` (FAST: ~1-2s, the cold
|
|
385
396
|
LSP would cost ~5s/edit and under-report anyway — pull `pilens_analyze` on the
|
|
386
|
-
warm server for type errors). Silent on clean files
|
|
387
|
-
|
|
388
|
-
|
|
397
|
+
warm server for type errors). Silent on clean files. Clean scans and findings
|
|
398
|
+
exit 0; an invocation that cannot run reports its failure on stdout and stderr.
|
|
399
|
+
Plain CLI failures exit 2. `--hook`, stdin hook payloads, and `--turn-end` stay
|
|
400
|
+
advisory and exit 0, including on failure. `--hook` emits a PostToolUse
|
|
401
|
+
`additionalContext` envelope; plain mode and Stop hooks print text.
|
|
402
|
+
`pilens_health` reports failed invocation counts and the last operation,
|
|
403
|
+
timestamp, and bounded, redacted reason from the workspace status record.
|
|
404
|
+
These counters are best-effort history, not a current readiness verdict.
|
|
389
405
|
|
|
390
406
|
Wire it in Claude Code `settings.json`:
|
|
391
407
|
|
|
@@ -443,7 +459,7 @@ be exercised + debugged directly through Claude Code without running pi.
|
|
|
443
459
|
in the server, and concurrent turn-ends cannot race the turn-state clear.
|
|
444
460
|
**Warm-only, no cold fallback**: only the server process owns the session state
|
|
445
461
|
and pending turn work, so a local pass would report a false clean — no warm
|
|
446
|
-
server means
|
|
462
|
+
server means a skip reason on stdout and stderr, exit 0.
|
|
447
463
|
The client waits 55s so it gives up inside Claude Code's 60s hook timeout.
|
|
448
464
|
`SubagentStop` is deliberately NOT registered: subagent edits already fire
|
|
449
465
|
PostToolUse into the shared turn-state, the consume bridges are one-shot (a
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Merge queue rollout
|
|
2
|
+
|
|
3
|
+
Adopting GitHub's merge queue for `master` (#3754). The repository side is in
|
|
4
|
+
the same change as this page; the settings below are the maintainer's step and
|
|
5
|
+
are deliberately not applied by any script or workflow.
|
|
6
|
+
|
|
7
|
+
## Why
|
|
8
|
+
|
|
9
|
+
Every master move forced `gh pr update-branch` and a full CI re-run on every
|
|
10
|
+
open PR. A queue tests each PR merged onto the latest master, in order, so
|
|
11
|
+
neither is needed. Sharded Unit tests (#3753) keep one queue run short.
|
|
12
|
+
|
|
13
|
+
## Repository side (already in this change)
|
|
14
|
+
|
|
15
|
+
- `ci.yml` and `lint.yml` run on `merge_group` (`types: [checks_requested]`).
|
|
16
|
+
Together they produce every required check: `Lint & type-check`,
|
|
17
|
+
`Unit tests`, `Install test (ubuntu-latest)`, `Install test (windows-latest)`,
|
|
18
|
+
`Install test (macos-latest)`, `knip`, `oxfmt format check`, `TLA+ models`.
|
|
19
|
+
- PR-only jobs (PR title, PR body, changelog fast-fail, targeted advisory) are
|
|
20
|
+
guarded by `github.event_name == 'pull_request'` and are skipped on
|
|
21
|
+
`merge_group`; none of them is required.
|
|
22
|
+
- `tests/config/merge-queue-workflows.test.ts` pins the trigger, the required
|
|
23
|
+
job names, and that no required job (or a job it `needs:`) is gated off on
|
|
24
|
+
`merge_group`.
|
|
25
|
+
- `scripts/ci-verdict.mjs` reports a queued PR as kind `in-queue` (exit 3) and
|
|
26
|
+
a failed queue run as a FAIL event.
|
|
27
|
+
|
|
28
|
+
## Maintainer settings (Settings, Rules, Rulesets, New branch ruleset)
|
|
29
|
+
|
|
30
|
+
| Setting | Value | Why |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| Ruleset name | `master merge queue` | |
|
|
33
|
+
| Enforcement status | Active | |
|
|
34
|
+
| Target branches | Include default branch (`master`) | |
|
|
35
|
+
| Require status checks to pass | the eight names above, source GitHub Actions | unchanged from branch protection today |
|
|
36
|
+
| Require branches to be up to date | off | the queue replaces it |
|
|
37
|
+
| Require merge queue | on | |
|
|
38
|
+
| Merge method | Merge commit | repo convention (`gh pr merge --merge`) |
|
|
39
|
+
| Build concurrency (maximum pull requests to build) | 3 | queue builds run three required-check sets at once on hosted runners |
|
|
40
|
+
| Minimum pull requests to merge | 1 | never hold a green PR waiting for company |
|
|
41
|
+
| Maximum pull requests to merge | 3 | a failing group costs at most three re-tests |
|
|
42
|
+
| Wait time to meet minimum group size | 1 minute | |
|
|
43
|
+
| Only merge non-failing pull requests | All commits must pass (`ALLGREEN`) | a red group member ejects only itself |
|
|
44
|
+
| Status check timeout | 30 minutes | the required set took about 10 minutes at the median and about 12 at the maximum over 30 runs before sharding; 30 minutes is 2.5x that |
|
|
45
|
+
|
|
46
|
+
Branch protection on `master` today is classic (no ruleset exists).
|
|
47
|
+
`scripts/ci-verdict.mjs` reads the live required-check names from classic
|
|
48
|
+
branch protection; if you move the required checks into the ruleset it falls
|
|
49
|
+
back to the static list (`Unit tests`, `Lint & type-check`) and still gates on
|
|
50
|
+
every non-advisory check-run from a PR/push run it discovers. Either keep the classic rule
|
|
51
|
+
(enable "Require merge queue" there) or accept the narrower absent-check
|
|
52
|
+
detection.
|
|
53
|
+
|
|
54
|
+
## Rollout steps
|
|
55
|
+
|
|
56
|
+
1. Merge #3753 (sharded Unit tests) first, then this change.
|
|
57
|
+
2. Create the ruleset above.
|
|
58
|
+
3. Enqueue one low-risk PR: `gh pr merge <N> --merge`.
|
|
59
|
+
4. Confirm in `gh run list --event merge_group` that `CI` and `Lint` ran on the
|
|
60
|
+
`gh-readonly-queue/master/pr-<N>-<sha>` ref and that all seven required
|
|
61
|
+
checks reported there. A required check that never reports stalls the queue
|
|
62
|
+
until the 30-minute timeout.
|
|
63
|
+
5. Stop using `gh pr update-branch` and "re-arm" pushes; both are moot and a
|
|
64
|
+
push to a queued PR ejects it.
|
|
65
|
+
|
|
66
|
+
## Rollback
|
|
67
|
+
|
|
68
|
+
Disable the ruleset's "Require merge queue" rule. PRs merge directly again;
|
|
69
|
+
nothing in the repository needs reverting, because `merge_group` triggers and
|
|
70
|
+
the ci-verdict queue reads are inert without a queue.
|
|
71
|
+
|
|
72
|
+
## Known remainder
|
|
73
|
+
|
|
74
|
+
The `train:approved` lane that merged through the REST merge API was retired
|
|
75
|
+
(#3837), so no competing lane holds a merge the queue would refuse. Every
|
|
76
|
+
merge goes through `gh pr merge` (auto-merge or direct), which the queue
|
|
77
|
+
intercepts when the base branch requires one.
|