6.5 KiB
| id | ticket | title | status | created | accepted | agenda | plans | tags | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DEC-0007 | compiler-analyze-compile-build-pipeline-split | Canonical compiler entrypoints for analyze, compile, and build | in_progress | 2026-03-30 | 2026-03-30 | AGD-0011 |
|
|
Decision
O dominio compiler SHALL expor tres entrypoints canonicos sobre um unico pipeline compartilhado:
analyzecompilebuild
Esses entrypoints MUST corresponder aos seguintes cortes normativos de stages:
analyze = ResolveDeps + LoadSources + FrontendPhasecompile = analyze + LowerToIRVM + OptimizeIRVM + EmitBytecode + LinkBytecode + VerifyBytecodebuild = compile + WriteBytecodeArtifact
BuilderPipelineService MUST deixar de expor run como entrypoint publico.
O comportamento atualmente observado em run MUST ser preservado como o comportamento default de build, usando config/contexto de filesystem construido fora do pipeline em si.
LSP, editor e outros consumidores MUST reutilizar esse mesmo pipeline canonico. Eles MAY fornecer configs/contextos distintos por entrypoint, mas esses contextos MUST NOT alterar a semantica central dos stages canonicos nem introduzir um pipeline paralelo disfarçado.
Rationale
O pipeline atual ja possui um seam natural entre:
- analise semantica da workspace;
- producao de artefato executavel em memoria;
- persistencia terminal em disco.
Transformar esses cortes em entrypoints explicitos melhora a superficie operacional do compiler sem duplicar infraestrutura nem esconder semantica em flags ad hoc.
Essa decisao tambem preserva duas propriedades importantes:
- compatibilidade comportamental com o fluxo atual que produz artefato executavel para PBS, que passa a ser tratado como baseline de corretude;
- generalidade suficiente para que outros frontends consumam o compiler sem herdarem regras exclusivas de PBS.
Remover run evita que o nome antigo continue funcionando como conceito normativo opaco.
O nome correto do fluxo default passa a ser build.
Technical Specification
1. Canonical pipeline
O compiler MUST manter um unico pipeline canonico compartilhado. Esse pipeline MUST preservar a semantica e a ordem dos stages normativos:
ResolveDepsPipelineStageLoadSourcesPipelineStageFrontendPhasePipelineStageLowerToIRVMPipelineStageOptimizeIRVMPipelineStageEmitBytecodePipelineStageLinkBytecodePipelineStageVerifyBytecodePipelineStageWriteBytecodeArtifactPipelineStage
Nenhum entrypoint MAY reordenar esses stages.
2. Entry point contracts
analyze MUST terminar em FrontendPhasePipelineStage.
analyze MUST retornar um AnalysisSnapshot estavel ou equivalente de mesmo papel semantico.
Esse resultado MUST expor, no minimo:
- diagnosticos;
- facts semanticos produzidos pelo frontend;
- referencias estaveis para os sources carregados, incluindo o equivalente ao
FileTable; - metadados de resolucao da workspace necessarios para tooling.
Implementacoes MAY expor campos adicionais, mas MUST NOT omitir esses elementos minimos.
analyze MUST NOT executar lowering, emissao, verificacao de bytecode ou persistencia de artefato.
compile MUST terminar em VerifyBytecodePipelineStage.
compile MUST produzir resultado executavel validado em memoria, incluindo bytecodeModule e bytecodeBytes ou equivalentes de mesmo papel semantico.
compile MUST incluir LinkBytecode e VerifyBytecode.
compile MUST NOT persistir artefato em disco.
build MUST terminar em WriteBytecodeArtifactPipelineStage.
build MUST ser definido como compile seguido apenas da persistencia terminal.
build MUST preservar o comportamento default atual de escrita de artefato em filesystem.
3. Service surface
BuilderPipelineService MUST evoluir para uma superficie com entrypoints explicitos equivalentes a:
analyze(config, logs)compile(config, logs)build(config, logs)
Os nomes exatos MAY variar, mas a separacao semantica MUST ser preservada.
run MUST ser removido como entrypoint publico.
Qualquer composicao equivalente ao comportamento atual MUST ser expressa por build com config/contexto apropriado.
4. Context and config model
Configs/contextos distintos por entrypoint MAY existir para suportar CLI, editor, LSP e outros callsites.
Esses contextos MAY ajustar:
- fontes de entrada;
- sinks/collectors;
- shape de retorno;
- estrategia de composicao externa.
Esses contextos MUST NOT:
- redefinir a semantica central dos stages canonicos;
- introduzir ordem diferente de stages para os mesmos entrypoints;
- criar um pipeline paralelo com regras semanticas proprias sob os mesmos nomes
analyze,compileoubuild.
A construcao do contexto default de filesystem MUST acontecer fora do pipeline itself, no callsite ou camada de composicao apropriada.
5. Compatibility and propagation
Esta decisao MUST preservar compatibilidade comportamental com o fluxo atual que produz artefato executavel para PBS. Essa compatibilidade MUST cobrir, no minimo:
- a mesma ordem semantica de stages hoje usada para chegar ao artefato executavel;
- o mesmo nivel de corretude do resultado executavel produzido em memoria antes da persistencia;
- a ausencia de regressao nos gates de emissao, link e verificacao que hoje protegem esse fluxo.
PBS MUST ser tratado como consumidor importante e baseline de corretude, mas MUST NOT virar detalhe normativo exclusivo da API publica.
Esta decisao MUST ser propagada para:
- a spec operacional do pipeline do compiler;
- os contratos de CLI e callsites existentes;
- a documentacao dos resultados intermediarios (
AnalysisSnapshot, resultado decompile, resultado debuild).
Esta decisao MUST NOT reinterpretar a spec de PBX como requisito de persistencia em disco. A authority da spec de PBX permanece na fronteira de emissao e mapeamento de artefatos.
Constraints
SourceProviderFactorypermanece como boundary de leitura do compiler nesta decisao.- Esta decisao nao define ainda novos providers especificos de editor.
- Esta decisao nao autoriza pipelines paralelos por frontend.
- Esta decisao nao permite tratar requisito normativo aqui definido como opcional em plan ou implement.
- Qualquer revisao futura sobre os cortes de stage, o modelo de contexto ou a remocao de
runMUST ocorrer por nova decisao explicita.
Revision Log
- 2026-03-30: Initial draft from AGD-0011.
- 2026-03-30: Accepted and decomposed into PLN-0009, PLN-0010, and PLN-0011.