Skip to content

Initiative (placeholder): Per-language LSP re-pilot — follow-up to #839 (Shell = NO-GO) #1124

Description

@don-petry

Why this exists

Epic #839 piloted LSP (language-server) code intelligence in the pr-review harness for exactly one language/server: Shell via bash-language-server behind agent-lsp. The measured result was a NO-GO (decision: docs/lsp-pilot.md §7, recorded on #845):

Run Model Agg nav-token ratio High-nav stratum
28718240665 sonnet-4-6 1.26× 1.01×
28940391169 opus-4-8 (prod) 1.05× 1.04×

The ≥2× navigation-token target was missed decisively; on shell diffs already cheap to grep, agent-lsp's MCP tool-result payloads cost about as much context as the reads they replace. That result does not generalize — it says nothing about languages with deeper cross-file type resolution, which is exactly where find-references is expected to beat grep.

This is a holding issue (inert: initiative:hold, no initiative:auto) to keep the open door tracked. Promote a child to a real pilot by removing the hold and planning it; do not auto-release.

The reusable harness is already in place (dormant, cost-free)

A per-language re-pilot is a restart, not a rebuild — reuse:

  • scripts/lsp_pilot_run.sh — live A/B runner (LSP-off vs LSP-on on the same PRs)
  • scripts/lsp_pilot_measure.sh / scripts/lsp_pilot_compare.sh — nav-token / tool-call / cold-start extraction + rendering
  • .github/workflows/lsp-pilot-run.yml — on-demand workflow_dispatch driver
  • evals/lsp-pilot/ — the frozen-corpus pattern (repin per language)

Per-language deltas needed each time: (a) pick + version-pin the LSP server, (b) point .github/mcp/lsp.json at it (or a per-lang variant) and update setup-lsp-pilot.sh install, (c) repin evals/lsp-pilot/holdout/cases.jsonl to real cross-file PRs in that language's repos, (d) dispatch the A/B.

Method fixes carried over from the Shell pilot (do these before re-running)

  1. Gate on tokens first. The success metric is a conjunction (≥2× nav-token reduction AND no precision regression). Precision cannot rescue a GO once tokens miss — so run the token A/B first and only build a precision harness if tokens clear ~2×.
  2. [Phase 2] Add the LSP finding-verification step to the deep/audit pr-review tiers #843 verification can't measure precision symmetrically. scripts/lib/lsp-verification.sh only emits finding_verification records on the LSP-on leg (it needs mcp__lsp__* in the allowlist), so it structurally cannot produce a false-positive delta vs LSP-off. Measuring the precision half needs a neutral judge (same scorer over both legs) — reuse the eval score_llm_judge path, not [Phase 2] Add the LSP finding-verification step to the deep/audit pr-review tiers #843.
  3. N≥3 median per PR to beat the run-to-run navigation-strategy variance seen in the Shell controls.

Candidate children (the languages we actually use)

Lower-priority / not currently scoped: HTML, Groovy, HCL/Terraform (small footprint; weak LSP-vs-grep case for review navigation).

Refs: discussion #578 · epic #839 · decision #845 · docs/lsp-pilot.md.

Metadata

Metadata

Assignees

No one assigned

    Labels

    dev-lead:hands-offinitiativeEpic / initiative tracking issueinitiative:holdInitiative driver must not release this issue (human hold)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions