prometeu-studio/discussion/workflow/agendas/AGD-0019-studio-project-open-state-under-dot-studio.md

214 lines
16 KiB
Markdown

---
id: AGD-0019
ticket: studio-project-local-studio-state-under-dot-studio
title: Persist project-local Studio state under .studio
status: accepted
created: 2026-04-04
resolved: 2026-04-04
decision: DEC-0016
tags: [studio, project-session, project-state, persistence, dot-studio, shell, layout, setup]
---
## Pain
O Studio ja tem um modelo de `project session` para runtime do projeto aberto, mas ainda nao tem um contrato explicito para estado persistente do proprio Studio por projeto.
Sem esse contrato, a organizacao e o setup do Studio por projeto correm tres riscos:
- virar estado apenas em memoria e se perder toda vez que o Studio fecha;
- ser espalhado em arquivos ad hoc, sem uma raiz reservada e sem schema claro;
- misturar configuracao local do projeto com estado global do launcher, quebrando o boundary entre "este projeto no Studio" e "preferencias gerais da aplicacao".
## Context
Domain owner: `studio`
Owner surfaces: `docs/specs/studio/1. Studio Shell and Workspace Layout Specification.md`
Related context: `discussion/lessons/DSC-0001-studio-docs-import/LSN-0008-project-scoped-state-and-activity-legacy.md`, `discussion/lessons/DSC-0012-studio-editor-document-vfs-boundary/LSN-0027-project-document-vfs-and-session-owned-editor-boundary.md`
Relevant code: `prometeu-studio/src/main/java/p/studio/projectsessions/StudioProjectSession.java`
Ja existe precedente documental para duas direcoes importantes:
- `.studio/` e a raiz reservada para estado local ao projeto;
- estado que precisa sobreviver a troca de workspace, mas continuar pertencendo ao projeto aberto, deve ser owned por `project session`.
O que ainda nao esta fechado e o contrato desta nova camada de estado persistente do Studio por projeto:
- quais dados entram nela;
- quais dados devem continuar apenas em memoria;
- o que e projeto-local versus launcher-global;
- como versionar, carregar, gravar e tolerar corrupcao parcial;
- se o modelo deve ser um store unico do projeto ou varios arquivos especializados sob `.studio/`.
Exemplos concretos do escopo pretendido agora:
- posicoes de divisorias e proporcoes de layout;
- quais janelas, paineis ou workspaces estavam abertos;
- quais tabs do editor estavam abertas e qual estava ativa;
- caminhos de setup local do Studio para o projeto, como runtime do Prometeu;
- futuras configuracoes locais do Studio que pertencam a este projeto e nao ao launcher global.
Categoria relacionada, mas separada deste contrato principal:
- `project-local activity` pode continuar vivendo sob `.studio/`, mas nao precisa pertencer ao mesmo store canonico de `project session` usado para layout, tabs, janelas e setup.
Observacao importante:
- `project-local setup` ja e requisito relevante agora, mesmo antes de existir uma UI dedicada para edita-lo, porque o Studio pode precisar consumir configuracoes locais do projeto antes da superficie visual de configuracao ficar pronta.
## Open Questions
### What to store
- [ ] Qual deve ser o escopo minimo obrigatorio do estado persistido do Studio por projeto na primeira wave?
- [ ] O owner normativo do runtime deve ser `StudioProjectSession` com persistencia sob `.studio/`, ou cada workspace pode persistir diretamente seu proprio estado?
- [x] O contrato deve usar um arquivo consolidado de estado do projeto ou uma arvore de arquivos especializados dentro de `.studio/`?
Fechado: `single file`. O store principal da `project session` deve usar um arquivo consolidado, por ser mais simples de manter e governar.
- [ ] Quais categorias entram desde a wave 1: layout do shell, divisorias, paineis e janelas abertas, tabs abertas, documento ativo, caminhos de setup local, configuracoes por workspace?
- [ ] `Project-local setup` deve ser tratado como categoria de primeira classe desde o inicio, mesmo antes de haver UI propria?
- [x] A `project-local activity` deve pertencer ao mesmo store de `project session` desta agenda?
Fechado: nao. `Project-local activity` pode viver dentro de `.studio/`, mas deve permanecer dissociada do store principal de `project session` tratado nesta agenda.
- [ ] Quais categorias devem ser explicitamente proibidas por agora: cache derivado, estado efemero de hover, resultados recomputaveis, output operacional pesado, artefatos operacionais transient?
### When to save and restore
- [x] Quando o Studio grava esse estado: sob eventos incrementais, no fechamento da sessao, em pontos de checkpoint, ou combinacao controlada?
Fechado: a politica base deve ser gravacao no fechamento; checkpoints sao aceitaveis apenas para categorias que realmente precisarem disso; gravacao incremental como regra geral nao e a direcao.
- [x] Quais categorias devem ser restauradas imediatamente ao abrir o projeto e quais devem ser carregadas sob demanda?
Fechado: o estado restauravel de shell deve ser reaplicado quando o projeto sobe; no mesmo boundary, quando o shell do projeto desce, o estado correspondente deve ser salvo.
- [x] O setup local do projeto deve ser lido logo na abertura da `project session`, antes mesmo de o usuario abrir workspaces especificos?
Fechado: sim. O setup local do projeto deve ser lido na abertura da `project session`.
- [x] Como o Studio deve reagir a `.studio/` ausente, estado em schema antigo, arquivo invalido ou dados parcialmente corrompidos?
Fechado: fallback para valores default. A ausencia de `.studio/`, schema nao reconhecido ou conteudo invalido/corrompido nao deve impedir a abertura do projeto; o Studio deve cair para defaults seguros.
## Options
### Option A - Persistencia ad hoc por area do Studio sob `.studio/`
- **Approach:** cada area do Studio grava diretamente os arquivos de que precisa sob `.studio/`, por exemplo shell/layout, editor tabs, setup local e outros modulos futuros, sem um owner central de sessao nem um schema compartilhado forte.
- **Pro:** destrava persistencia rapido para features isoladas e exige pouco desenho inicial.
- **Con:** tende a fragmentar naming, lifecycle, migration e recovery; piora consistencia entre workspaces e dificulta distinguir estado normativo de lixo historico.
- **Maintainability:** baixa a media. Facil de iniciar, dificil de governar quando mais workspaces passarem a persistir.
- **Trade-offs detalhados:**
- reduz custo de entrada para a primeira feature consumidora, mas troca esse ganho por uma futura consolidacao mais cara;
- favorece autonomia local de shell e workspaces, mas quebra o boundary de `project session` que o repositorio vem fortalecendo;
- simplifica a escrita inicial, mas complica leitura, migracao de schema e tolerancia a falhas, porque cada workspace pode passar a degradar de um jeito diferente;
- permite fatiar rollout por workspace, mas aumenta o risco de formatos incompatíveis coexistirem dentro de `.studio/`.
### Option B - Project-session state store canonico sob `.studio/`
- **Approach:** definir um contrato explicito de estado persistente do Studio por projeto, owned pela `StudioProjectSession`, com raiz canonica em `.studio/` e schema/versionamento governados pelo Studio.
- **Pro:** preserva o boundary correto entre runtime de sessao, persistencia local do projeto e concerns globais do launcher; facilita recovery, migration e extensao futura.
- **Con:** exige desenhar ownership, schema e politica de gravacao antes de implementar a primeira feature consumidora.
- **Maintainability:** forte. O Studio ganha uma surface clara para persistencia de layout, tabs, setup local e futuras configuracoes por projeto sem espalhar responsabilidade por cada modulo.
- **Trade-offs detalhados:**
- aumenta custo de desenho agora, mas reduz custo estrutural das proximas features que precisarem persistir estado por projeto;
- centraliza ownership e recovery, o que melhora consistencia, mas exige uma API suficientemente clara para nao virar gargalo ou objeto “god state”;
- facilita schema versioning, migration e corrupcao parcial, mas pede disciplina para separar configuracao local canonica de cache derivado;
- protege a diferenca entre projeto-local e launcher-global, mas exige que o recorte inicial seja pequeno o bastante para nao bloquear implementacao por excesso de ambicao;
- acomoda bem layout, setup e estado restauravel de UI, mas precisa de limites claros para nao começar a absorver qualquer detalhe efemero de sessao.
### Option C - Manter apenas estado global do launcher e evitar persistencia por projeto nesta fase
- **Approach:** limitar a memoria persistente a recent projects e preferencias globais; cada projeto reconstroi layout, setup local e tabs do zero a cada abertura.
- **Pro:** menor custo imediato e nenhum contrato novo dentro do projeto.
- **Con:** conflita com o objetivo de tornar o projeto aberto uma unidade com estado proprio; degrada continuidade de uso e ignora o precedente ja registrado para `.studio/`.
- **Maintainability:** simples no curtissimo prazo, mas funcionalmente insuficiente se o Studio quer evoluir como ambiente de trabalho persistente por projeto.
- **Trade-offs detalhados:**
- preserva simplicidade operacional agora, mas empurra o problema para depois sem melhorar a arquitetura do projeto aberto;
- evita erro de modelagem prematuro, mas tambem impede validar cedo a disciplina de `.studio/` e `project session`;
- mantem o launcher como unico ponto persistente, mas mistura setup local do projeto com concerns globais que deveriam permanecer fora do projeto;
- reduz risco de schema local mal desenhado, mas aumenta risco de cada nova feature tentar contornar a ausencia de persistencia por atalhos locais.
## Discussion
O ponto principal aqui nao e apenas "onde salvar um JSON". O que precisa ser fechado e o boundary arquitetural:
1. ownership de runtime:
quem monta o estado em memoria enquanto o projeto esta aberto;
2. ownership de persistencia:
quem serializa e restaura esse estado sem deixar cada workspace inventar sua propria disciplina;
3. shape do dado:
o que conta como organizacao e setup do Studio por projeto, o que e apenas view state efemero e o que pertence ao launcher global;
4. resiliencia:
como o Studio lida com schema evolution, arquivos ausentes e degradacao parcial sem falhar ao abrir um projeto.
O precedente atual aponta para uma direcao relativamente forte:
- `.studio/` deve continuar sendo a raiz reservada do projeto para concerns do Studio;
- `StudioProjectSession` ja e o owner natural do estado que vive acima do foco de um workspace;
- workspaces devem consumir servicos de sessao, nao redefinir ownership de persistencia por conta propria.
- nem todo dado sob `.studio/` precisa cair dentro do mesmo store de `project session`; `activity` e o exemplo claro de uma categoria projeto-local, mas com semantica e politica de persistencia diferentes.
- para o store principal desta agenda, `single file` e a direcao preferida, porque simplifica manutencao, leitura, escrita e governanca inicial.
O risco de ir por um caminho ad hoc e que shell, editor e setup local comecem a salvar layout, tabs e caminhos em formatos independentes e acidentalmente normativos.
Depois disso, consolidar ownership, migration e cleanup fica mais caro do que desenhar a superficie certa agora.
Ao mesmo tempo, uma primeira wave disciplinada nao precisa resolver toda a persistencia futura do Studio.
Ela pode fechar:
- a raiz canonicamente reservada;
- o owner do runtime e da serializacao;
- as categorias de estado permitidas e proibidas na wave inicial;
- o formato geral de schema e versionamento;
- a politica de recovery minima para nao travar abertura de projeto.
Trade-off central da agenda:
- se priorizarmos velocidade local da primeira feature, Option A parece atraente, mas ela compra essa velocidade quebrando o owner correto;
- se priorizarmos architecture hygiene, Option B e a direcao mais consistente, mas ela precisa de um recorte rigoroso para nao tentar resolver persistencia total do Studio numa tacada so;
- Option C so faz sentido se o objetivo real nao for ainda ter projeto aberto como unidade persistente, o que conflita com a premissa desta agenda.
Os trade-offs tambem se separam naturalmente em dois eixos:
1. `what to store`
quanto mais categorias entram na wave 1, maior o valor imediato de restauracao do Studio por projeto;
por outro lado, maior o risco de misturar setup canonico com estado efemero ou cache derivado.
A convergencia atual deste eixo ja sugere uma separacao interna:
- um store principal de `project session` para layout, setup, janelas e restauracao de tabs;
- stores ou artefatos adjacentes sob `.studio/` para categorias com semantica diferente, como `project-local activity`.
2. `when to save/restore`
quanto mais automatico e frequente for o save, menor a perda de estado;
por outro lado, maior o risco de churn de escrita, snapshots inconsistentes e acoplamento excessivo a eventos de UI.
Leituras ja convergidas neste eixo:
- `project-local setup` deve ser restaurado logo na abertura da `project session`;
- o estado restauravel do shell deve subir com o projeto e ser salvo quando esse shell descer;
- `save on close` deve ser a politica padrao;
- checkpoints podem existir, mas apenas quando alguma categoria realmente exigir persistencia intermediaria.
Leitura atual dos trade-offs:
1. o maior risco de produto e nao ter continuidade de organizacao e setup do Studio entre aberturas do projeto;
2. `project-local setup` tem prioridade alta porque pode ser consumido mesmo antes da UI de configuracao existir;
3. o maior risco arquitetural e permitir que shell e workspaces inventem persistencia independente para layout, tabs e configuracao local;
4. o maior risco de execucao em Option B e superdimensionar a primeira wave ou salvar estado demais cedo demais;
5. portanto, a melhor convergencia parece ser um store canonico de sessao/projeto com escopo inicial deliberadamente estreito, `single file` no inicio, mas explicitamente capaz de crescer para layout, setup e configuracoes futuras.
## Resolution
Recommended direction: seguir com **Option B**.
A agenda deve convergir para uma decision com os seguintes fechamentos:
1. `.studio/` permanece a raiz canonica de estado local ao projeto para o Studio;
2. `StudioProjectSession` ou um servico explicitamente owned por ela deve ser o owner do runtime e da persistencia do estado local do Studio por projeto;
3. shell e workspaces devem consumir esse estado por contrato, em vez de cada um persistir arbitrariamente por conta propria;
4. a primeira wave deve definir claramente quais categorias entram, com forte prioridade para `project-local setup`, layout restauravel e tabs/janelas abertas;
5. o contrato deve prever schema/versionamento e recovery de dados ausentes ou invalidos;
6. o boundary entre estado projeto-local e estado launcher-global deve ficar explicito;
7. o desenho inicial deve suportar extensao futura para novas categorias de configuracao local sem exigir reorganizacao ad hoc de `.studio/`;
8. a decision deve separar explicitamente `what to store` de `when to save/restore`, em vez de misturar conteudo e politica operacional;
9. a politica base de persistencia deve ser `read on project-session open`, `restore on shell mount`, `save on shell/project close`, com checkpoints apenas quando justificadamente necessarios;
10. `project-local activity` deve ser explicitamente tratada como concern separado: continua sob `.studio/`, mas fora do store principal de `project session`;
11. o store principal deve comecar como `single file`;
12. ausencia, schema antigo ou conteudo invalido/corrompido devem degradar para valores default seguros, sem bloquear abertura do projeto.
Next step suggestion: fechar nesta agenda, em separado, `what to store` e `when to save/restore`:
- `what to store`: pelo menos `project-local setup`, `shell layout`, `open panels/workspaces`, `editor open tabs + active tab`;
- `when to save/restore`: leitura do setup ja na abertura da `project session`, restauracao do layout/tabs na entrada do shell, save no fechamento, e checkpoints apenas para categorias que realmente precisarem.