61 lines
2.7 KiB
Markdown
61 lines
2.7 KiB
Markdown
# PR-031 - PBS Dependency-Scoped Fail-Fast Admission
|
|
|
|
## Briefing
|
|
|
|
Hoje o pipeline pode continuar emitindo parte do `IRBackend` mesmo após erros de admissão em módulos dependidos (ex.: `E_LOAD_*`).
|
|
Isso permite artefato parcialmente válido em build com erro, o que aumenta risco de interpretação incorreta do resultado.
|
|
|
|
Esta PR formaliza política de fail-fast por dependência: módulos que dependem de módulo reprovado não devem ser lowered/emitidos, sem interromper globalmente a coleta de diagnósticos.
|
|
|
|
## Motivation
|
|
|
|
- Evitar saída parcial enganosa quando há falha estrutural em módulo upstream.
|
|
- Manter diagnósticos úteis e completos no restante do grafo.
|
|
- Preservar determinismo do contrato de admissão no boundary do frontend.
|
|
|
|
## Target
|
|
|
|
- Ajustar admissão do `PBSFrontendPhaseService` para bloqueio transitivo por dependência de módulo falho.
|
|
- Preservar compilação/diagnóstico de módulos independentes no mesmo build.
|
|
- Tornar comportamento explícito e testável.
|
|
|
|
## Scope
|
|
|
|
- `prometeu-compiler/frontends/prometeu-frontend-pbs` (pipeline de admissão e merge de `IRBackendFile`).
|
|
- Testes de integração em `PBSFrontendPhaseServiceTest`.
|
|
|
|
## Method
|
|
|
|
1. Introduzir rastreamento de dependências entre módulos no frontend pipeline (import graph por módulo) usando apenas `import` explícito de source `.pbs`.
|
|
2. Quando um módulo falhar em admissão (`syntax`, `static semantics`, `linking`, `load-facing`, `host-admission` quando aplicável), marcar módulo como reprovado.
|
|
3. Propagar reprovação somente para módulos que importam (direta ou transitivamente) o módulo reprovado.
|
|
4. Impedir merge no `IRBackend` para:
|
|
- módulo reprovado,
|
|
- módulos bloqueados por dependência.
|
|
5. Manter emissão de diagnósticos e processamento para módulos independentes.
|
|
|
|
## Acceptance Criteria
|
|
|
|
- Se `A` falha e `B` depende de `A`, `B` não é emitido no `IRBackend`.
|
|
- Se `C` é independente de `A`, `C` continua apto a ser emitido.
|
|
- Build com erro não produz artefato parcial inconsistente no subgrafo dependente.
|
|
- Diagnósticos permanecem completos e com identidade estável (`code`, `phase`, `templateId`, `span`).
|
|
|
|
## Tests
|
|
|
|
- Cenário positivo: módulos independentes sobrevivem ao fail-fast por dependência.
|
|
- Cenário negativo: módulo dependente de módulo com `E_LOAD_*` não é lowered.
|
|
- Cenário negativo: módulo dependente de módulo com `E_LINK_*` não é lowered.
|
|
- Asserts por diagnóstico e por conteúdo final de `IRBackend`.
|
|
|
|
## Non-Goals
|
|
|
|
- Fail-fast global do build ao primeiro erro.
|
|
- Alterar contrato de runtime/loader.
|
|
- Redefinir severidade de diagnósticos existentes.
|
|
|
|
## Affected Documents
|
|
|
|
- `docs/pbs/specs/12. Diagnostics Specification.md`
|
|
- `docs/pbs/specs/13. Lowering IRBackend Specification.md`
|