---
title: Language Server Development
---
### Document Synchronization
The LSP tracks document changes using **incremental synchronization**:
`textDocument/didOpen`
: Document opened in editor
`textDocument/didChange`
: Document content changed (incremental deltas sent)
`textDocument/didClose`
: Document closed
This ensures the LSP always has the current document state while minimizing data
transfer.
### Durability and Invalidation Policy
Panache uses Salsa durability levels to reduce unnecessary revalidation work in
LSP mode.
#### Durability assignments
`LOW`
: Open-buffer text updates (`didOpen`, `didChange`) for the active document.
`MEDIUM`
: Per-document config updates and file-watcher refreshes for already cached
dependency files.
`HIGH`
: Disk-loaded dependency files cached from the project graph.
#### Invalidation policy
- Edits while typing should invalidate low-durability data aggressively, but
should not force broad revalidation of stable dependency data.
- Config reloads and watcher events use medium durability so changes propagate,
but with less churn than open-buffer edits.
- Disk-cached dependencies use high durability so unrelated low-frequency edits
do not repeatedly revalidate those inputs.
#### Verification and measurement
- Durability revalidation measurement harness: `tests/durability_bench.rs`
(ignored by default).
- Run with:
```bash
cargo test --test durability_bench durability_revalidation_bench -- --ignored --nocapture
```
- Policy regression tests are in `src/salsa.rs` and validate that
high-durability stable inputs avoid revalidation under low-durability updates,
while low-durability stable inputs are revalidated.