8.7 KiB
| id | ticket | title | status | created | accepted | agenda | plans | tags | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DEC-0032 | studio-new-lsp-api-and-v1-boundary | Boundary normativo entre lsp-api, lsp-v1 e a extensao VS Code | accepted | 2026-05-05 | 2026-05-05 | AGD-0035 |
|
|
Decision
O repositório SHALL reconstruir o stack de linguagem do Studio com separação explícita entre:
lsp-apicomo boundary interno do Studio;lsp-v1como adapter LSP/JSON-RPC concreto;compilercomo owner dos serviços semânticos e de análise consumidos por esse adapter;tools/vscode-extensioncomo cliente externo que continua falando LSP puro via socket TCP.
Esta decisão ALSO locks os seguintes pontos:
lsp-apiMUST NOT ser espelho do protocolo LSP;lsp-apiMUST expor apenas funcionalidades internas realmente consumíveis por outras partes do Studio;lsp-apiMAY começar mínima, por exemplo com contratos comobootServer(project)eshutdownServer(project);lsp-v1MUST concentrar o servidor LSP concreto, os DTOs de protocolo, o transporte e qualquer dependência deLSP4J;LSP4JMUST NOT vazar para fora delsp-v1;lsp-v1MUST consumir serviços existentes decompilerem vez de reconstruir pipeline semântico próprio;- o lifecycle do servidor LSP MUST ser associado à abertura e ao fechamento de projeto, não à abertura global do processo Studio;
- o atual
lsp-v1presente hoje no repositório serve apenas como mock de conectividade VS Code ↔ Studio e MUST NOT ser tratado como padrão arquitetural, base estrutural ou referência de implementação do backend definitivo. - a primeira onda de implementação desta decisão SHALL priorizar arquitetura, lifecycle e separação de responsabilidades, mesmo que o comportamento LSP permaneça deliberadamente simples ou "dumb" por um período controlado.
Rationale
O stack legado anterior foi removido justamente porque misturava responsabilidades erradas e criou boundaries frágeis entre UI, sessão, semântica e transporte.
Ao mesmo tempo, o projeto já tem dois fatos importantes:
- a extensão VS Code já existe e já sabe atuar como cliente LSP puro;
- o Studio já possui serviços de
compilerque devem continuar sendo a fonte real de comportamento semântico.
Logo, o problema não é "inventar um cliente" nem "reescrever a semântica". O problema é definir corretamente:
- o que é boundary interno reutilizável do Studio;
- o que é adapter concreto de protocolo;
- e onde termina a influência do protocolo externo.
Essa separação reduz acoplamento, melhora teste e evita que detalhes de LSP4J ou do transporte contaminem o restante da base.
Também existe uma prioridade explícita de rollout:
- primeiro consolidar a arquitetura;
- depois adicionar capacidade semântica por camadas;
- sem obrigar a primeira implementação a já ser semanticamente rica.
Isso evita repetir o padrão anterior de crescer funcionalidade em cima de uma base estrutural errada.
Technical Specification
1. Module Roles
lsp-api MUST ser tratado como módulo de boundary interno do Studio.
Ele SHALL:
- expor somente contratos que façam sentido para outros consumidores internos do sistema;
- permanecer agnóstico ao protocolo LSP concreto;
- permanecer agnóstico a
LSP4J; - permanecer agnóstico ao transporte TCP ou a qualquer detalhe de socket;
- começar com surface mínima suficiente para o lifecycle do servidor por projeto.
lsp-v1 MUST ser tratado como o primeiro adapter concreto do boundary acima.
Ele SHALL:
- implementar o servidor LSP;
- carregar os DTOs e tipos de protocolo que forem necessários para falar LSP;
- carregar a dependência de
LSP4J; - realizar a tradução entre o mundo do protocolo e os serviços internos consumidos;
- concentrar a lógica concreta de sessão e associação
projeto -> servidor.
2. LSP4J Containment
O repositório MUST tratar LSP4J como dependência exclusiva de lsp-v1.
Portanto:
- nenhum tipo de
LSP4JMAY aparecer emlsp-api; - nenhum tipo de
LSP4JMAY aparecer em outros módulos do Studio; - nenhum contrato de
lsp-apiMAY depender semanticamente de tipos, nomes ou formas obrigadas peloLSP4J; - qualquer vazamento de
LSP4Jpara fora delsp-v1SHALL ser tratado como violação arquitetural.
3. Compiler Ownership
lsp-v1 MUST consumir serviços existentes de compiler quando precisar responder capacidades editoriais e semânticas.
Isso implica:
lsp-v1MUST NOT reconstruir uma engine semântica paralela por conveniência;lsp-v1MUST preferir compor sobre entrypoints e serviços canônicos docompiler;- qualquer lacuna percebida no
compilerpara servir o novo backend SHALL ser tratada como evolução explícita docompiler, e não como autorização para duplicação semântica dentro delsp-v1.
4. Server Lifecycle
O lifecycle do servidor MUST ser project-scoped.
Regras:
- abrir o processo Studio MUST NOT implicitamente significar "subir um servidor LSP global";
- abrir um projeto MAY disparar
bootServer(project)através do boundary exposto porlsp-api; - fechar um projeto MUST disparar
shutdownServer(project)para o servidor correspondente; - a implementação concreta desse bootstrap/shutdown e o vínculo entre projeto e instância do servidor MUST residir em
lsp-v1.
5. Internal API Minimalism
lsp-api MUST nascer pequeno.
Ele SHALL:
- expor apenas o que outro consumidor interno realmente precise enxergar;
- evitar DTOs de protocolo sem necessidade;
- evitar antecipar capacidades futuras sem consumidor real;
- crescer somente quando houver pressão concreta de uso interno.
O contrato inicial mínimo aceito por esta decisão é:
bootServer(project)shutdownServer(project)
Contratos adicionais MAY ser adicionados depois, mas não fazem parte do lock inicial desta decisão.
6. VS Code Transport
tools/vscode-extension SHALL permanecer cliente LSP puro via socket TCP nesta fase.
Isso implica:
- a extensão atual pode continuar evoluindo nesse modelo;
lsp-apiMUST permanecer agnóstico a esse transporte;- mudanças futuras de transporte MAY ser discutidas depois, mas não fazem parte do boundary normativo inicial.
7. Current Mock Status
O lsp-v1 que existe hoje para testes de conectividade entre VS Code e Studio MUST ser tratado como mock transitório.
Ele MUST NOT:
- servir de blueprint estrutural do novo servidor;
- servir de contrato implícito do sistema;
- servir de justificativa para manter responsabilidades colapsadas;
- contaminar o padrão de código alvo do backend definitivo.
O backend definitivo SHALL priorizar:
- separação clara de responsabilidades;
- boundaries pequenos e explícitos;
- código fácil de manter;
- composição sobre serviços canônicos do
compiler; - isolamento rígido do adapter de protocolo.
8. Implementation Wave 1
A primeira onda de implementação derivada desta decisão MUST focar em transformar o mock atual em uma estrutura sólida de trabalho.
Essa onda SHALL incluir:
lsp-apimínimo com bootstrap e shutdown por projeto;lsp-v1organizado como adapter concreto limpo, mesmo que ainda responda um conjunto reduzido ou simplificado de capacidades;- boot do servidor quando o projeto abrir;
- shutdown do servidor quando o projeto fechar;
- isolamento explícito entre boundary interno, adapter de protocolo e consumo de
compiler.
Essa onda MUST NOT ser bloqueada pela ausência de "carne semântica" completa.
Em outras palavras:
- é aceitável manter um comportamento LSP inicial deliberadamente simples;
- não é aceitável manter um padrão arquitetural improvisado só porque o comportamento ainda é simples;
- a evolução semântica futura SHALL acontecer por camadas sobre a estrutura consolidada.
Constraints
- Esta decisão MUST preservar a separação entre boundary interno e adapter externo.
- Esta decisão MUST preservar
compilercomo owner semântico do sistema. - Esta decisão MUST impedir vazamento de
LSP4Jpara fora delsp-v1. - Esta decisão MUST impedir que o mock atual de conectividade seja usado como padrão do produto.
- Esta decisão MUST manter
compile/build/run/debugfora do escopo dolsp-apinesta fase. - Qualquer plano derivado desta decisão MUST refletir explicitamente o lifecycle por projeto e a contenção de protocolo em
lsp-v1. - O primeiro plano derivado desta decisão MUST priorizar a consolidação estrutural do servidor antes do enriquecimento semântico.
Revision Log
- 2026-05-05: Initial draft from AGD-0035.
- 2026-05-05: Added explicit phase-1 rollout guidance to solidify architecture before semantic depth.
- 2026-05-05: Accepted and decomposed into PLN-0065, PLN-0066, and PLN-0067.