# PR-029 - PBS Builtin Slot Inference and Canonical Layout Semantics ## Briefing Hoje o frontend aceita `Slot(index=...)` manual em `declare builtin type`, e parte da validacao de layout fica empurrada para `load-facing`. Isso abre espaco para inconsistencias entre declaracao de campos, flattening e offsets. Esta PR move ownership de slot para o compilador: offsets passam a ser inferidos deterministicamente a partir do layout canonico flattenado, sem autoria manual de `Slot`. ## Motivation - Reduzir superficie de erro humano em builtin layout. - Alinhar semantica estatica com o contrato de layout flattenado. - Evitar que erros de layout aparecam tarde em `load-facing` quando sao semanticos. ## Target - Tornar `Slot(index=...)` proibido na superficie de fonte de builtin field. - Banir `Slot(...)` da gramatica PBS (erro de sintaxe), sem fallback transitorio. - Inferir `slotStart` automaticamente no frontend com base em: - ordem canonica dos campos, - largura flattenada dos tipos admissiveis, - composicao builtin aninhada. - Mover validacoes de layout para `static semantics`. - Atualizar extracao de metadata reservada para usar slots inferidos (nao lidos de atributo). - Atualizar fixtures do SDK minimo (`@core:color` etc.) removendo `Slot`. ## Scope - `frontends/prometeu-frontend-pbs` (semantica + metadata extraction + testes). - Atualizacao de specs PBS relacionadas a builtin layout e diagnosticos. ## Method 1. Introduzir um resolvedor de layout builtin na fase semantica. 2. Calcular largura flattenada por tipo builtin e mapear offsets por campo. 3. Banir `Slot(...)` no parser (erro de sintaxe deterministico) com remocao da forma da superficie da linguagem. 4. Produzir diagnosticos `E_SEM_*` deterministicos para: - tipo de campo nao admissivel para layout builtin, - composicao ciclica de builtin layout, - impossibilidade de resolver largura flattenada. 5. Persistir offsets inferidos no metadata model de lowering (`IRReservedMetadata`). 6. Remover a exigencia de `Slot` no loader/extractor. ## Acceptance Criteria - Builtin fields sem `Slot` compilam quando o layout e admissivel. - Qualquer `Slot(...)` manual e rejeitado como erro de sintaxe (breaking imediato). - `Pixel(x:int, y:int, color:Color)` recebe offsets inferidos consistentes com flattening. - Erros de layout builtin deixam de depender de `E_LOAD_*` para serem detectados. - Suite Gate U cobre positivo e negativo para inferencia de slot. ## Tests - Positivo: inferencia de offsets em builtin simples e composto. - Negativo: `Slot` manual presente (falha de parser). - Negativo: campo com tipo nao admissivel. - Negativo: ciclo de composicao builtin. - Asserts por `code`, `phase`, `templateId`, `span`. ## Non-Goals - Alterar o contrato de runtime/verifier para alem da inferencia de layout no frontend. - Definir encoding final de artifact/PBX. ## Affected Documents - `docs/pbs/specs/4. Static Semantics Specification.md` - `docs/pbs/specs/3. Core Syntax Specification.md` - `docs/pbs/specs/6.1. Intrinsics and Builtin Types Specification.md` - `docs/pbs/specs/8. Stdlib Environment Packaging and Loading Specification.md` - `docs/pbs/specs/12. Diagnostics Specification.md`