Editor integration · bb_lsp

Your editor, answering from the same index.

bb_lspis Backbencher's language server: hover with an evidence tier and staleness badge, go-to-definition, find references, document and workspace symbols, call hierarchy, impact and graph views — all served from the local index your CLI and MCP tools read. It is a complementto your editor's own language server, not a replacement: no completion, no diagnostics, no rename.

Backbencher Brain (bb_lsp) v0.1.0·7 launch languages·4 editor runs recorded·requires bb_lsp ≥ 0.3.0

Claim levels

Two recorded ladders, shown side by side.

Backbencher labels every feature with a claim level, and two shipped artifacts define those levels differently. Rather than merge them into one comfortable number, this page shows each ladder as its source records it.

Extension README · shipped feature labels

  • I0 UNVERIFIED — may not ship behind any trust label
  • I1 PROTOCOL-PASSED — real protocol requests against bb lsp assert response shape and content
  • I2 RUNTIME-PASSED — I1 plus a real bb lsp server process over stdio with real files on disk
  • I3 IN-EDITOR VERIFIED — I2 plus the feature exercised inside a pinned editor version with machine evidence
  • I4 CROSS-EDITOR VERIFIED — I3 plus a pinned run in a non-VS Code editor (fork)
ide/vscode/README.md

Extension status model · level names

  • I0 I0 — not claimed
  • I1 I1 — protocol-passed
  • I2 I2 — index-conformant
  • I3 I3 — harness-verified
  • I4 I4 — editor-verified
  • I5 I5 — precision-verified
ide/vscode/src/status-model.ts

The shipped per-feature labels are I1 for all seven launch languages — the conservative protocol-level claim, drift-gated against docs/m24/TOOL-DOC.md. The precision ledger separately records an evidence-computed I3 for the six wave-1 languages from in-editor runs. Both are shown below with their own evidence paths; neither is edited here.

Declared drift — Cursor pinned version: the document records 3.18.9 (ide/vscode/README.md) while the recorded run in validation/m25/results/F-CURSOR.json says 3.19.19. This page shows the evidence value; the document row is flagged for correction rather than silently preferred.

Feature matrix

What bb_lsp answers, per language.

Left half: the extension's shipped claim table, one level per feature. Right half: the precision ledger's measured row for the same language — conformance, feature availability and warm latency, computed from recorded evidence.

LanguageHoverDefinitionReferencesSymbolsCall hierarchyEvidence-computedWarm hover p95Evidence
javaI1I1I1I1I1I3 · 8/8 sections pass36.36 msvalidation/m29/results/wave-java.json + validation/m29/results/wave-editor-java.json
groovyI1I1I1I1I1not recorded in the ledgerno wave-1 row
kotlinI1I1I1I1I1I3 · 8/8 sections pass49.2 msvalidation/m29/results/wave-kotlin.json + validation/m29/results/wave-editor-kotlin.json
scalaI1I1I1I1I1I3 · 8/8 sections pass32.68 msvalidation/m29/results/wave-scala.json + validation/m29/results/wave-editor-scala.json
typescriptI1I1I1I1I1I3 · 8/8 sections pass41.58 msvalidation/m29/results/wave-typescript.json + validation/m29/results/wave-editor-typescript.json
javascriptI1I1I1I1I1I3 · 8/8 sections pass27.33 msvalidation/m29/results/wave-javascript.json + validation/m29/results/wave-editor-javascript.json
pythonI1I1I1I1I1I3 · 8/8 sections pass28.56 msvalidation/m29/results/wave-python.json + validation/m29/results/wave-editor-python.json

Every extra surface is on the same index, so it ships with its own contract: 3 hover actions (`bb.openGraph`, `bb.openImpact`, `bb.showCallHierarchy`), plus 8 editor commands including Backbencher: Show status.

Declared absence: groovyhas no wave-1 precision row yet — the table says so instead of inheriting a neighbour's number.

Measured at scale too: hover p95 38.63 ms over 59000 files (synthetic-deterministic, revision f7572f6229314400), in-editor p95 9.63 ms. Evidence: validation/m29/results/R3.json

Real product pixels

Proof stills from a verified session.

These are frames from the pinned M45 capture corpus — a real VS Code window driven by a scripted session against a real index. They are stills, not a rendered film: a still cannot suffer from bad motion or editing, so nothing here is decorative.

The index, attached — orders-router.ts + explorer, static

The index, attached

orders-router.ts + explorer, static

observed 0.0-9.5 · 2560x1600 @ 30fps, 35.8s
validation/m45/results/demo-session/probes/01-establish.png · sha256 7a00db4de1b8367e…… · session commit 5804e907

Hover with evidence tier — rich portal over place() call site, 4s hold

Hover with evidence tier

rich portal over place() call site, 4s hold

observed 10.0-14.0 · 2560x1600 @ 30fps, 35.8s
validation/m45/results/demo-session/probes/02-hover-place.png · sha256 34a5b6ca7098ad70…… · session commit 5804e907

Go to definition — F12 jump into order-service.ts (after portal dismiss)

Go to definition

F12 jump into order-service.ts (after portal dismiss)

observed 18.0 · 2560x1600 @ 30fps, 35.8s
validation/m45/results/demo-session/probes/03-goto-def.png · sha256 932bed726d75ed48…… · session commit 5804e907

Find references — references peek with cross-file usages

Find references

references peek with cross-file usages

observed 31.5-35.8 · 2560x1600 @ 30fps, 35.8s
validation/m45/results/demo-session/probes/05-references.png · sha256 a91e3086b8328f94…… · session commit 5804e907

Each still is copied byte-for-byte from the capture corpus and sha-pinned in website/src/data/editors.generated.ts; the verifier re-checks the hash on every run. The session evidence (validation/m45/results/demo-session/D1-session-raw.json) records the take, the beats and the hover proofs behind them.

Editor runs

What has actually been run, in which editor.

A fork or editor claim without a pinned run is banned, so every row below names the run it comes from. Anything unrun is declared blocked or unverified — never inherited.

VS Code

I3 — in-editor verified (pinned 1.85.0, Linux)

verified
Pinned version
1.85.0
Platform
linux
Evidence
validation/m25/results/E5.json

Cursor

I4 — cross-editor verified (pinned 3.18.9, Linux)

verified
Pinned version
3.19.19
Platform
linux
Evidence
validation/m25/results/F-CURSOR.json

Antigravity

I4 — cross-editor verified (pinned 1.107.0, Linux)

verified
Pinned version
1.107.0
Platform
linux
Evidence
validation/m25/results/F-ANTIGRAVITY.json

Windsurf

blocked — no pinned run on this machine

blocked
Pinned version
Platform
linux
Evidence
validation/m25/results/F-WINDSURF.json

Blocked: windsurf CLI not found on PATH — install or record the waiver (E6 honest blocked state)

Operating systems

  • linux verified (53 checks, 4 mutants caught) · validation/m25/results/E7-linux.json
  • darwin blocked · No macOS hardware or runner on this machine (process.platform is linux); the OS-matrix workflow (.github/workflows/os-matrix.yml) executes the macOS native leg on its GitHub-hosted runner and uploads the E7-darwin.json artifact for the owner to persist. Recorded blocked locally, never claimed. · validation/m25/results/E7-darwin.json
  • win32 blocked · No Windows hardware or runner on this machine (process.platform is linux); the OS-matrix workflow (.github/workflows/os-matrix.yml) executes the Windows native leg on its GitHub-hosted runner and uploads the E7-win32.json artifact for the owner to persist. Recorded blocked locally, never claimed. · validation/m25/results/E7-windows.json

Declared exclusions

What bb_lsp deliberately does not do.

Scope is declared, not implied. These are the features the server will not answer for, because your editor's own language server owns them.

no completion

no diagnostics

no rename

Complement stance

  • **No completion, no diagnostics, no rename.** Graph, navigation, cross-language
  • Where a first-party language server exists for a language, hover content from
  • Activation must not degrade first-party language-server startup — the declared
  • An observed conflict with a first-party server is a filed defect with a

Server compatibility

  • extension 0.1.x ↔ server 0.3.0declared in bbLsp.minServerVersion; a server that won't state its version is never trusted (fail closed)

A version mismatch disables features with a visible message and a restart action, never silent absence.

Set up your editor

Four editors, one server.

All four integrations run the same server against the same index; they differ only in how the editor is told to launch it.

VS Code (and VS Code forks)

bundled extension

Languages: java, groovy, kotlin, scala, typescript, javascript, python

bundled server, resolved at activation (dist-bundled; a source fallback is declared, never silent)

code --install-extension bb-lsp-vscode-0.1.0.vsix
ide/vscode/package.json

Zed

wasm shim extension

Languages: TypeScript, JavaScript

`lsp.<server-id>.binary.path` user setting (owner override; Zed's own `BB_LSP_ROOT/dist/lsp/server.js` or `<worktree>/dist/lsp/server.js` — `bb-lsp` on PATH. Loud declared error — never a silent fallback to something else.

zed --install-extension <checkout>/ide/zed/bb-lsp
ide/zed/bb-lsp/extension.toml

Helix

languages.toml entry

Languages: typescript, javascript, java, scala

node "/opt/backbencher-brain/dist/lsp/server.js"

append ide/helix/languages.toml to ~/.config/helix/languages.toml (edit the server path)
ide/helix/languages.toml

JetBrains via LSP4IJ

user-defined server template

Languages: typescript, javascript, java, scala

node BB_ROOT/dist/lsp/server.js --dir $WORKSPACE_DIR$

LSP4IJ → Language Servers → Import from custom template (ide/lsp4ij/bb-lsp/)
ide/lsp4ij/bb-lsp/template.json

Install the built extension today: code --install-extension bb-lsp-vscode-0.1.0.vsix from a built checkout. The published artifact is identical to the packaged one.

First run, in a throwaway profile (never over your daily driver): code --user-data-dir /tmp/bb-try --extensions-dir /tmp/bb-try-ext .

Settings

  • bbLsp.serverPath default (empty)Explicit path to the bb_lsp server entry (dist/lsp/server.js). Empty = auto-resolve from the workspace's backbencher-brain checkout, then the bundled copy.
  • bbLsp.sourceMode default autoHow to launch the server: compiled dist (preferred), from source via bun (declared fallback), or auto (dist if resolvable, else bun source).
  • bbLsp.minServerVersion default 0.3.0Minimum bb_lsp server version this extension accepts (version-compatibility matrix, contract §2 honesty).
  • bbLsp.activationBudgetMs default 150Declared activation budget in milliseconds (contract §7.3). Measured activate()-to-ready time is recorded; a budget miss is a failed gate.
  • bbLsp.autoIndexMode default askAuto-index behavior on workspace open (issue #500). Indexing never starts without explicit consent.
  • bb.panelPlacement default activeGroupWhere Backbencher hub, impact and graph panels open (issue #776). Panels are reused, never duplicated, and informational panels never move the cursor.
  • bbLsp.trace.server default off

Publishing status

Built and installable — not on a marketplace.

The packaging pipeline runs on every release and its evidence is committed. Publishing to the registry is blocked, and this page says so instead of linking to a listing that does not exist.

Not published: OVSX_PAT not set in the environment — live publish awaits owner credentials (declared blocked state, issue #502 closure requirement).

Extension 0.1.0 · artifact ide/vscode/bb-lsp-vscode-0.1.0.vsix · target registry https://open-vsx.org

The publish command that will run once credentials exist: OVSX_PAT=... npx --yes ovsx publish --pat $OVSX_PAT ide/vscode/bb-lsp-vscode-0.1.0.vsix

Recorded state: validation/m25/results/E4-openvsx.json (mode blocked — a live listing appears here only after that record flips).

Declared limitations

  • **Five launch languages only** (Java, Groovy, Kotlin, Scala, TypeScript).
  • **Claim level I1 on the shipped surface.** The features pass protocol and
  • **Cross-platform unverified.** Every recorded run to date is Linux. macOS and
  • **Freshness has a declared policy, not magic.** Edits are debounced (300 ms)
  • **Latency budgets are machine-scoped.** The warm p95 budgets were measured on
How the index works Languages & analyzers Agent tools Guide

everything on this page is generated from website/src/data/editors.generated.ts — claims, versions and hashes included.