Referência de Diagnósticos
Todos os erros, avisos e lints emitidos pelo conjunto de ferramentas do Zolo. Clique em um código para ver a explicação completa, a causa típica e a correção recomendada.
Lint
24float-equalityA igualdade entre floats é imprecisa. Use `~=` (tolerância adaptativa), `!~=`, ou `math.approx_eq_abs/_rel(...)`. Para comparações exatas, use o tipo `decimal`.
unused-variableUma variável `let` ou parâmetro nunca é lida. Prefixe o nome com `_` para silenciar o lint intencionalmente.
unused-functionUma função top-level nunca é chamada e não está marcada com `pub`, `@test`, `@bench`, `@export`, rota HTTP ou `main`.
unused-importUm nome importado nunca é referenciado no arquivo.
shadowed-variableUm `let` re-vincula um nome de um escopo externo. Shadowing às vezes é intencional; renomeie um dos bindings para silenciar o aviso.
dead-codeCódigo depois de `return`, `break` ou `continue` é inalcançável.
naming-conventionFunções/variáveis usam `snake_case`; structs/enums/traits/efeitos usam `PascalCase`.
non-exhaustive-matchAlias legado: matches fechados agora são verificados uma vez pelo type checker como `TE829`. Mantido para que links antigos tenham destino.
must-useUma função ou tipo anotado com `@must_use` retornou um valor que o chamador descartou. Vincule-o (`let _ = ...`) ou consuma-o.
deprecatedUma função anotada com `@deprecated` foi chamada. A mensagem da anotação explica a substituição.
infinite-loopUm bloco `loop`/`while true` não tem nenhum `break`/`return` alcançável.
optional-typoUm uso de `Some(...)` / `None` / `?.` / `??` que parece um erro de digitação ou mau uso da API de opcional.
unreachable-patternUm padrão nunca casa porque um braço anterior já o cobre.
max-line-lengthConfigurado via lint config do projeto. O padrão é permissivo; aperte no CI se quiser limites rígidos.
max-nesting-depthAninhamento profundo prejudica a legibilidade. Extraia helpers ou use guard clauses com return cedo.
max-parametersListas longas de parâmetros são um code-smell. Considere agrupar parâmetros relacionados em uma struct.
max-function-lengthQuebre a função em helpers menores.
unknown-reprApenas `@repr(C)`, `@repr(packed)`, `@repr(transparent)` e `@repr(zolo)` são reconhecidos.
transparent-multi-field`transparent` só se aplica a structs newtype com um único campo.
layout-in-default-repr`@layout` só tem efeito junto com um `@repr` explícito.
align-not-positiveAlinhamento deve ser uma potência de dois positiva.
align-not-power-of-twoRegras de alinhamento de hardware exigem valores que sejam potência de dois (1, 2, 4, 8, ...).
align-too-largeO alinhamento solicitado excede o máximo suportado pela plataforma alvo.
size-not-positiveO tamanho não pode ser zero nem negativo.
Parser
05P0001O lexer chegou ao fim do arquivo (ou da linha, em certos contextos) antes de encontrar a aspa de fechamento da string.
P0002O parser esperava um token específico (por exemplo `}`, `)`, identificador, tipo) mas encontrou outra coisa. Geralmente uma chave, parêntese ou pontuação ausente.
P0003Um token apareceu onde a gramática não permite — tipicamente um símbolo perdido, palavra-chave digitada errada ou separador ausente na linha anterior.
P0004Um erro de parsing que não casou com nenhum classificador específico. Leia a mensagem do diagnóstico para a causa precisa.
P0005Um comentário `<!-- -->` foi escrito entre `<` e `>`, onde o próprio HTML também não permite. Dentro da tag, use os comentários de Zolo: `//` ou `/* */`. Nos filhos de um elemento, `<!-- -->` funciona normalmente.
Tipos
162E0001Equivalente a `TE001`. Emitido pelo classificador legado quando o novo typeck não anexou um código.
E0002Alias legado para `TE100`.
E0003Alias legado para `TE101`.
E0004Alias legado para `TE004`. A variável foi declarada com `let`; use `let mut` para permitir reatribuição.
E0005Alias legado para `TE102`.
E0006Um literal de struct omite um ou mais campos obrigatórios.
E0007Alias legado para `TE110`.
E0008O valor retornado não corresponde ao tipo de retorno declarado pela função.
E0009Um nome (função, variável, campo, variante) foi declarado duas vezes no mesmo escopo.
E0010Uma anotação de tipo se refere a um tipo que o compilador não consegue encontrar.
TE001O valor atribuído a um binding `let` não satisfaz a anotação de tipo declarada.
TE002O valor atribuído a um binding `const` não satisfaz a anotação de tipo declarada.
TE003`const` exige uma expressão constant-foldable. Use `let` para valores de runtime.
TE004Bindings `let` são imutáveis por padrão. Use `let mut x = ...` para permitir reatribuição, ou crie um novo binding com shadowing via `let`.
TE005Operadores como `+=`, `-=`, `*=` exigem que ambos os lados sejam numéricos (ou strings, para `+=`).
TE006A função declarou um retorno em tupla, mas a instrução `return` fornece menos valores.
TE007A função retorna mais valores do que seu tipo de retorno único pode comportar.
TE008Um literal de array mistura tipos incompatíveis; arrays são homogêneos.
TE009Aritmética binária exige que ambos os operandos sejam numéricos e (em modo strict) do mesmo tipo numérico.
TE100O nome não está declarado em nenhum escopo envolvente. O compilador anexa uma sugestão "quis dizer?" quando existe um nome similar.
TE101O alvo de uma expressão de chamada não é um tipo invocável.
TE102A struct não declara este campo. Sugestões "quis dizer?" são anexadas para nomes similares.
TE103Uma anotação de tipo ou campo de variante de enum se refere a um tipo que o compilador não consegue resolver.
TE104O tipo receptor não tem um método com esse nome. Verifique a grafia, os imports e a visibilidade do trait.
TE105Um nome simples corresponde a um módulo conhecido da biblioteca padrão (`math`, `json`, `http`, `os`, …) que nunca foi trazido ao escopo. Diferente do TE100, o compilador reconhece o nome e diz exatamente qual linha `use` está faltando.
TE107Um literal de struct omite um campo que não tem valor padrão nem zero-value de fallback. Todo campo sem default precisa ser fornecido explicitamente na construção.
TE108Um struct com `@derive(Default)` tem um campo cujo tipo não possui zero-value nem default explícito, então nenhuma impl de `Default` pode ser sintetizada.
TE109Um campo de struct foi escrito sem anotação de tipo, contando com o valor padrão para inferi-lo (`nome = valor`) — mas o tipo do padrão é ambíguo (ex.: `nil`, ou uma expressão que resolve para `any`).
TE110O número de argumentos passados não corresponde à quantidade de parâmetros da função.
TE111O tipo de um argumento não corresponde ao tipo do parâmetro correspondente.
TE112Dois ou mais campos embutidos com `using` declaram um campo de mesmo nome, então um acesso `.campo` no struct externo não sabe de qual embed promovê-lo.
TE113Um campo marcado com `using` precisa embutir outro struct — são os campos dele que são promovidos. Um escalar, ou qualquer tipo que não seja uma declaração de struct conhecida, não tem campos a promover.
TE114Um enum optou por discriminantes numéricos (tipo de backing, ou um `= n` explícito) mas é genérico ou tem variante com payload. Discriminantes só fazem sentido para enums planos, com todas as variantes unitárias.
TE115O discriminante de uma variante está fora da faixa do tipo de backing declarado (`enum E: u8` limita a `0..=255`), então não sobreviveria ao ida-e-volta de `to_int()`/`from_int()`.
TE116Duas variantes do mesmo enum resolveram para o mesmo inteiro — ou dois `= n` explícitos colidem, ou um valor auto-incrementado caiu em cima de um já usado.
TE117Sob `@stable` o auto-incremento é proibido: inserir uma variante no meio renumeraria silenciosamente todas as seguintes, quebrando a codificação que a anotação promete manter.
TE118O discriminante `= expr` de uma variante ou não avaliou para inteiro em tempo de compilação, ou não pôde ser avaliado como constante de compilação.
TE119Um enum `@flags` é genérico ou tem variante com payload. `@flags` modela uma bitmask sobre um conjunto fixo e plano de variantes unitárias — não há espaço para parâmetros de tipo ou payloads.
TE120Cada variante `@flags` precisa ser um bit novo (auto-incrementado ou potência de dois explícita) ou um composto nomeado construído só a partir de bits declarados acima dela.
TE121O valor de uma flag está fora da faixa do tipo de backing do enum — flags em `enum: u8` param em `255` (bit 7).
TE122Duas flags de bit único no mesmo enum `@flags` resolveram para o mesmo bit, normalmente porque receberam o mesmo valor explícito.
TE123Um padrão de destructuring — `let Struct { … } = expr`, um `let { … }` anônimo, um padrão de parâmetro ou uma atribuição com destructuring de struct — nomeia um campo que o struct não tem.
TE124O bloco `else` pode cair para fora. Se caísse, a execução seguiria para os bindings do padrão com um valor que NÃO casou — por isso todo caminho pelo `else` precisa retornar, panicar, quebrar ou continuar.
TE125O padrão pode não casar (padrão de variante de enum, padrão de tamanho de array, …) e não tem cláusula `else`. Sem ela, um valor que não casa ligaria lixo silenciosamente.
TE126Um padrão de struct anônimo precisa saber qual struct está desestruturando, mas o tipo do valor não resolve para um struct concreto — normalmente por falta de anotação de tipo.
TE127Um padrão de struct nomeado em posição de parâmetro (`fn f(NomeStruct { … }: T)`) nomeia um struct diferente da anotação de tipo do próprio parâmetro.
TE128O spread final de um literal de struct (`Struct { ..origem }`) tem uma `origem` que não é struct nem record, então não há campos a espalhar.
TE129Uma atribuição com destructuring de tupla (`(a, b, c) = expr`) tem um número de alvos diferente do número de valores de `expr`.
TE130Operadores compostos (`+=`, `-=`, …) não têm significado por elemento quando o lado esquerdo é um padrão inteiro, e o spread `..` não faz sentido como alvo de atribuição.
TE131Um argumento nomeado (`f(nome: valor)`) não corresponde aos parâmetros declarados da função chamada — nome desconhecido ou duplicado, um argumento posicional depois de um nomeado, um parâmetro do meio pulado, ou uma chamada cuja assinatura não é conhecida localmente.
TE132O placeholder `_` só é válido como argumento direto na chamada do lado direito (RHS) de um estágio de pipe `|>`/`?>` (no máximo um por estágio), ou como a cabeça de uma cadeia de campo/método/índice usada como argumento de chamada (`_.campo`). Um `_` solto, um segundo `_` no mesmo estágio de pipe, ou `_` como lado esquerdo de um pipe são todos rejeitados.
TE133Um enum real e declarado foi identificado para este ponto — como base de `EnumName::variante`, ou como tipo do valor testado por um pattern com atalho `.variante` — mas o nome da variante não corresponde a nenhuma variante declarada. Uma sugestão "quis dizer?" é incluída na mensagem quando existe um nome próximo.
TE134O nome faz parte do prelúdio sempre-em-escopo da VM, mas o backend native/LLVM não tem implementação para ele. Compilar assim mesmo faria o nome virar `nil` silenciosamente e sair com 0 — por isso o build falha.
TE135Check exclusivo de native/LLVM: um identificador simples não resolveu para nada. Sem prelúdio Lua de fallback, ele viraria `nil` silenciosamente em runtime — a classe "typo vira no-op quieto" que isso pega em tempo de build.
TE136O atalho `.Variante` descobre seu enum a partir do tipo esperado pela posição onde aparece, e esta posição não fornece nada utilizável — nenhum tipo esperado (um `let` sem anotação, um argumento de uma função cuja assinatura não é conhecida), um parâmetro genérico ainda não fixado, ou um tipo que não é um enum. Anote a variável ou escreva a forma qualificada `Enum::Variante`.
TE137O atalho `.Variante` resolveu seu enum a partir do tipo esperado pela posição, mas esse enum não tem nenhuma variante com esse nome. Uma sugestão "quis dizer?" é incluída quando existe um nome próximo. A forma de pattern do mesmo erro reporta `TE133` em vez deste código.
TE138Um build native/LLVM não conseguiu unir (splice) um módulo de declaração: ou uma declaração do usuário começa com o prefixo `__zolo_std_`, reservado pelo compilador, ou uma função alcançável do módulo de declaração referencia um item irmão que o linker não consegue levar ao programa final. Qualquer um dos casos deixaria o build AOT divergir silenciosamente da VM.
TE139`<style>` e `<script>` são raw text elements: o conteúdo corre verbatim até o `</style>`/`</script>` correspondente, sem markup aninhado e sem interpolação `{expr}`. Chegar ao fim do arquivo antes desse fechamento reporta TE139 em vez da mensagem genérica "unclosed element" — geralmente uma tag de fechamento esquecida, ou uma string no formato `</tag` dentro do conteúdo (por exemplo, um literal de string JS) que fechou o bloco cedo demais.
TE140Uma recipe do Resource Graph em tempo de build (`Resource.dir(...).seal()`) não pôde ser selada em sua Resource Image imutável — um caminho ausente ou que não é diretório, um padrão `include` que não casou com nada, um caminho que escapa da raiz do recurso, uma colisão de caminho lógico, ou um arquivo que não pôde ser lido durante a selagem do snapshot. Não existe fallback para o diretório de trabalho em runtime: o build falha em vez disso.
TE141O compilador recebeu um valor interno malformado do Resource Graph, ou uma Resource Image selada falhou nas checagens de integridade — um campo de recipe inválido (`root`, `includes`, `excludes`) ou estado de build corrompido, diferente das falhas acionáveis de entrada/selagem do `TE140`.
TE142Um `;` colocado depois da expressão final de um bloco suprime seu valor, então o bloco conclui `void` em vez de produzir um resultado. `TE142` dispara quando esse void causado por terminador é usado onde um valor é exigido — vinculado a um `let`, passado como argumento, e assim por diante.
TE143Uma função declara `-> T`, mas um `;` depois de sua expressão final suprime esse valor, então o corpo conclui `void` em vez de um `T`. A menos que outro `return expr` forneça o valor, a função nunca consegue satisfazer a própria assinatura.
TE144O campo declara `get`, mas não `set`; por isso, atribuições após a construção não são permitidas.
TE145Usar `self.<mesmo-campo>` dentro do próprio acessor causaria recursão; use o nome contextual `field`.
TE146Um acessor pode herdar ou restringir a visibilidade do campo, mas não pode expor publicamente um campo privado.
TE147`?` propaga a falha, mas desempacota o sucesso. Uma função que retorna `Result` ou `Option` deve envolver esse sucesso explicitamente com `.Ok(...)` ou `.Some(...)`.
TE148Um literal `tw"..."` precisa ser uma lista estática de nomes de classe Tailwind. Interpolar um valor nele (`tw"bg-{cor}-600"`) esconderia parte do nome da classe do scanner do Tailwind em tempo de build, por isso Zolo rejeita — escolha entre literais completos usando controle de fluxo comum.
TE150A expansão inline exige um corpo Zolo real; declarações nativas e de plugin precisam de um wrapper Zolo.
TE151Use exatamente uma forma: `@inline`, `@inline(always)` ou `@inline(never)`.
TE152Um corpo always-inline não pode expandir a si mesmo recursivamente; use uma dica ou separe o núcleo recursivo.
TE153O contrato always-inline exige um corpo higiênico suportado; simplifique-o ou use `@inline` sem modo.
TE201A tipagem strict exige que todo `let`/`const` tenha uma anotação de tipo explícita.
TE202A tipagem strict exige que todo parâmetro de função tenha um tipo explícito.
TE210Um derive estruturado retornou syntax que não pode ser inserida no destino; o resultado deve ser `Syntax<.Items>` ou `Syntax<.Item>`.
TE211Um hole `${value}` recebeu um valor sem representação segura em código-fonte; insira um primitivo ou um nó `Syntax<K>`.
TE212`syntax.ident(text)` recebeu um texto que não é um único identificador Zolo válido e que não seja palavra reservada.
TE213Um spread `${..values}` recebeu algo diferente de uma lista ou tupla de nós de syntax de uma mesma categoria compatível.
TE214Os itens gerados escapam do escopo de expansão declarado por `@derive_for`, como uma função livre sem relação criada por um derive restrito a impl.
TE216Uma função `@derive_for` retornou algo diferente dos resultados suportados: `str`, `Syntax<.Items>` ou `Syntax<.Item>`.
TE217Um atributo namespaced do derive contém uma opção desconhecida, duplicada, ausente, não literal ou com tipo incorreto.
TE218Um tipo usa `@derive(T)`, mas nenhum deriver para `T` está disponível no escopo. Zolo nunca ignora isso silenciosamente — um nome digitado incorretamente não pode gerar um programa parcialmente gerado que só falha em runtime. Importe ou declare a função pública que expõe o deriver, exportada por convenção com o mesmo nome da capacidade.
TE220`await` recebeu um valor cujo tipo conhecido não é `Future<T>` nem `Task<T>`. Só esses dois wrappers podem ser suspensos; um valor comum já está disponível e não há o que aguardar.
TE221`yield` só é válido dentro de um generator declarado com `fn*`. Uma função comum ou `async fn` produz um único resultado e não expõe nenhum iterador pull para receber o yield.
TE222Um generator (`fn*`) usou `return valor`. Terminação e itens produzidos são conceitos separados num generator: `return` pode encerrá-lo antes do tempo, mas seu valor nunca é produzido como item do iterador — use `yield` para isso.
TE223Um valor produzido por `yield` não satisfaz o tipo de elemento declarado do generator. Todo `yield` dentro de `fn* ... -> T` precisa produzir um valor atribuível a `T`.
TE224`await` apareceu dentro de um generator `fn*`. Generators assíncronos ainda não têm um contrato de scheduler compartilhado por todos os backends, então Zolo rejeita a combinação em vez de deixar um backend retomá-la com semântica diferente de outro.
TE225`break :label` ou `continue :label` nomeia um loop que não está ativo lexicamente. Labels nunca atravessam fronteira de função/lambda, e uma task `spawn`ada ou um callback agendado com `every`, `after` ou `timeout` inicia sua própria região de controle de fluxo, então não pode saltar para um loop do chamador.
TE226Dois loops aninhados, ativos ao mesmo tempo, declaram o mesmo label. Uma saída rotulada seria ambígua para quem lê, mesmo que a declaração mais interna pudesse ser resolvida mecanicamente.
TE227Um `break` ou `continue` sem label aparece fora de um loop. Essas instruções só podem transferir o controle dentro de um `loop`, `while` ou `for` envolvente.
TE228Um `break` carregando um valor aponta para `while` ou `for`. Só a forma incondicional `loop` é uma expressão que produz valor, então um `break` com valor só é válido nela.
TE229Os valores carregados pelos `break`s alcançáveis não concordam com o tipo de resultado de uma expressão `loop`. Um `break` isolado contribui com `void`, então não pode sair de um loop que deveria produzir um valor não-void.
TE233`timeout duração { ... }` retorna `Result<Any, TimeoutError>`. A falha de timeout é controle de fluxo tipado comum — não é um record sem tipo, e nunca é convertida silenciosamente para o valor de sucesso.
TE301O número de argumentos de tipo fornecidos não corresponde à quantidade de parâmetros do tipo genérico.
TE302Um bound de trait, bloco `impl` ou cláusula `where` faz referência a um trait que o compilador não encontra.
TE303Um `impl Trait for Tipo` não é coerente com a declaração do trait — ou ele adiciona um método que o trait não declara, ou outra implementação já satisfaz o mesmo alvo parametrizado e a mesma instância de trait.
TE304Um método em `impl Trait for Tipo` não corresponde ao trait depois de substituir `Self`, argumentos do trait, tipos associados e parâmetros genéricos do método — tipos/qualificadores de parâmetro, tipo de retorno, bounds genéricos e linhas de efeito fazem parte do contrato.
TE305Uma implementação omite um tipo associado obrigatório, o define mais de uma vez, nomeia um tipo associado que o trait não declara, ou fornece um tipo que falha nos bounds do tipo associado.
TE480Uma implementação escolheu um tipo associado concreto que não satisfaz um bound declarado pelo trait para ele. O diagnóstico nomeia a implementação, o tipo associado projetado e o requisito que falhou — o tipo original é preservado, nunca é ampliado silenciosamente para `Any`.
TE481Um trait declara um tipo associado sem default, mas uma implementação não o define, então o compilador não consegue projetar `Self::Item` (ou outro nome associado) a partir dessa implementação.
TE482O tipo concreto implementa o nome de trait solicitado, mas com argumentos de tipo diferentes. Witnesses de trait são exatas — implementar `Sink<str>` não prova `Sink<int>`.
TE486Um valor tipado como union só pode ser usado sem narrowing através de membros compartilhados por todas as alternativas. Ler um campo ou chamar um método que falta em algumas alternativas seria válido para um valor em runtime e inválido para outro.
TE708Um aviso, não uma falha de build. Um loop `for` produz uma lista de linhas e a linha que carrega um componente `@island` não tem `key` — o morph do lado cliente então reescreve a linha nó por nó ao reordenar, em vez de aplicar o patch no lugar, e a island perde o estado hidratado do DOM (signals reiniciam, foco e scroll se perdem).
TE719Um handler de evento dentro de um `@island` contém uma expressão que a redução do cliente do Verniz não consegue representar em JavaScript. A renderização no servidor ainda produziria o controle, mas publicá-lo sem o handler criaria um elemento com aparência interativa que não faz nada — por isso o build falha em vez disso.
TE720Uma atribuição tem como alvo um signal derivado declarado com `let<signal>`. Uma cell derivada é definida pelo seu inicializador e recalculada a partir das cells de origem que lê — não é estado gravável, então atribuir a ela a deixaria em desacordo com seu próprio grafo de dependências.
TE721Um `effect` dentro de um `@island` contém comportamento que a redução do cliente do Verniz não consegue compilar para JavaScript. Diferente da renderização no servidor, um effect de island não tem uma metade no servidor capaz de preservar o comportamento — se não for emitido para o cliente, ele nunca roda, então o build é rejeitado em vez de descartá-lo silenciosamente.
TE727Um aviso, não uma falha de build. Uma função declara seu próprio parâmetro `key`, mas `key` é um atributo reservado do markup (spec V24) que é sempre roteado pelo mapa de extras — ele nunca chega ao parâmetro `key` da própria função, que volta silenciosamente ao seu default. O build passa e mais nada parece errado.
TE730`@(expr)` compila para uma ponte de custom property de CSS (`var(--…)`), que só existe em valores de declaração — depois do `:`, antes do `;`. Em seletor, nome de propriedade ou prelúdio de at-rule não há `var()` para a ponte compilar, e splice de texto do usuário ali é anti-feature deliberada. Mova a parte dinâmica para um valor, ou alterne classes estáticas no markup.
TE731Um `<style children={expr}>` carrega conteúdo de runtime que o compilador não enxerga — não dá para içar nem escopar; escopar texto desconhecido seria mentira. Spec §6.1: conteúdo dinâmico precisa optar por `global` explicitamente (`<style global children={…}>`), a única forma de style que continua sendo nó de render.
TE732Um valor de `@()` viaja como custom property de CSS, e só `str`, `int` e `float` serializam para uma. Valor tipado `bool`, `View`, map, struct ou função é rejeitado em compilação — no render viraria lixo ou sumiria. Valores sem tipo (`Any`) ficam em silêncio: este erro nunca chuta.
TE733`@()` compila para `var(--…)`, e CSS não concatena strings em valores comuns — `var(--w)px` é erro de sintaxe que o browser descarta, não "número mais unidade". Escreva `calc(@(x) * 1px)` ou interpole a string inteira (`@(f"{x}px")` — dentro de `@()` você está de volta em Zolo). `!important`, `/` e `*` em `calc()` são vizinhos sem espaço legais.
TE734`:global(…)` isenta um compound do carimbo de escopo hermético. Um wrapper vazio (`:global()`) não isenta nada, e um aninhado (`:global(:global(a))`) escapa de um escape — os dois só podem ser engano. Num corpo `<style global>`, `:global()` nem é sintaxe Zolo e passa intacto.
TE735Aviso, nunca falha de build. O escopo hermético carimba cada compound com a classe do componente, então um seletor que nomeia classe/id/tag que o markup do próprio componente nunca produz é regra morta — e `:root` sob escopo é estruturalmente morto. Vem com "quis dizer?" (distância de edição ≤ 2) e o conjunto renderizado do componente. Valores dinâmicos de class/id ou chamadas `el`/`raw` abrem o conjunto e suprimem o aviso — ele nunca chuta.
TE736Um `<style>` escopado pertence ao fn de componente que o cerca — o carimbo de classe do fn é o escopo dos seletores. Em statement top-level ou método de `impl`/`trait` não há componente, logo não há escopo. Adicione `global` (um `<style global>` estático fora de componente renderiza no lugar) ou mova para um fn de componente. Corpo com `@()` reporta isso mesmo com `global`: os valores precisam de um elemento-raiz de componente.
TE737Todo valor de `@()` viaja como custom property de CSS no elemento-raiz do componente (o literal de elemento em posição de cauda), herdando DOM abaixo. Um componente que delega a view inteira — sem raiz de elemento própria — não dá onde os valores andarem. Faça a cauda ser um literal de elemento (um `<div>` de embrulho serve) ou remova a interpolação.
TE738Aviso, nunca falha de build. Nomes de propriedade são checados contra uma tabela curada que vem com a toolchain (dado estático, sem download de registry); um quase-acerto volta com "quis dizer?" (distância de edição ≤ 2). Nomes começando com `-` — prefixos de vendor e custom properties `--` — nunca são checados, nem descritores de at-rule (o `src` de `@font-face`, …). Propriedade mais nova que a tabela custa um sublinhado, nunca um release.
TE740Um atributo HTML conhecido não é válido para o elemento escrito. Verniz valida tags nativas contra sua tabela DOM versionada; props de componente continuam passando pelos diagnósticos comuns de argumento nomeado.
TE741Um binding `bind:` de mão dupla não é suportado no elemento, ou seu tipo de origem conhecido é incompatível com a propriedade de DOM alvo — por exemplo, vincular uma cell `str` a `bind:checked`, que espera `bool`.
TE742Um atributo de handler de evento nomeia um evento que Verniz não reconhece nesse elemento. Nomes de evento usam a grafia do atributo DOM, como `onclick`, `oninput` e `onchange`.
TE743Um elemento HTML void, como `input`, `img` ou `br`, foi escrito com filhos ou uma tag de fechamento explícita. Elementos void nunca podem ter conteúdo, então use a forma self-closing.
TE744Uma checagem de acessibilidade de alta confiança: uma `<img>` não tem texto alternativo, ou um controle interativo não tem nome que um leitor de tela consiga anunciar. Só dispara quando a ausência do nome é certa — conteúdo dinâmico, `children` ou um spread de `HtmlAttrs` ainda podem fornecê-lo em runtime.
TE745Um atributo ou role ARIA conhecido é usado com grafia ou valor inválido, ou um label tem como alvo um id de elemento que não existe no markup escrito.
TE746Um alvo de `ref` não consegue receber um elemento do browser. Um `ref` precisa ser uma cell de origem `DomRef` opcional (`var<signal> nome: DomRef = nil`) declarada dentro do `@island` que a possui.
TE747Um `{...spread}` é incompatível com seu alvo. O encaminhamento dinâmico para um elemento nativo precisa ser tipado `HtmlAttrs`; um spread de componente precisa expor campos de record estaticamente conhecidos para que a checagem comum de props continue ativa.
TE748Um modificador de evento (`prevent`, `stop`, `once`, `capture`, `passive`, `self`) é desconhecido, duplicado, ou combinado de forma incompatível — `passive` não pode ser combinado com `prevent`.
TE749Um contrato de attach não pode ser cumprido — o compilador pega alvos de portal estaticamente vazios, e o verificador de attach de desenvolvimento também reporta alvos de portal ausentes, marcadores de island obsoletos, propriedades de binding inválidas e refs que não pertencem à island.
TE750Um membro de lifecycle como `pending`, `error` ou `state` foi lido a partir de uma referência de função comum. Só uma referência a uma função declarada `@action` tem o tipo nominal `ActionFn<...>` e uma lane do lado cliente.
TE751Um código fora de qualquer `@island` tenta observar o lifecycle de um `ActionFn`. Uma referência de action continua chamável no servidor, mas `pending`, `state`, `retry` e o resto do lifecycle observável são capacidades do browser que não conseguem cruzar uma fronteira de island ou de wire.
TE752Uma mutation action solicitou uma política desconhecida, ou uma política de substituição/cancelamento como `.Latest`. Uma mutation já aceita pelo servidor ainda pode ser confirmada mesmo depois que o cliente deixa de se importar com a resposta, então cancelar só a continuação do cliente faria a UI mentir sobre o efeito.
TE753Um `ActionFn` que retorna `Result<_, E>` é chamado por uma island que nunca observa o estado de falha da lane — lendo `.error`/`.state`, ou chamando `.try_run(...)`. Sem um observador explícito, uma falha de validação ou transporte passa despercebida com facilidade.
TE754Uma `.lane()` foi criada diretamente dentro de um `for` renderizado. Uma lane explícita possui estado mutável de lifecycle do cliente, mas uma iteração de lista não tem identidade lexical estável assim que linhas são inseridas, removidas ou reordenadas.
TE763Um valor que cruza entre Zolo e o TypeScript do browser não tem representação JSON determinística que a ponte Wire aceite — a ponte nunca recorre a `any`. Funções, closures, handles, `ResourceFs`, chaves de map que não são string, e tipos do usuário sem marcação ficam do seu lado de origem; structs/enums precisam de `@wire`.
TE764Uma declaração marcada `@secret` é alcançável a partir de um tipo `@wire` ou de um contrato de browser `@action`. Publicá-la colocaria um valor privado numa declaração, codec, request, response ou bundle de browser gerado — remover `@secret` só para silenciar o diagnóstico é inseguro.
TE775Verniz não conseguiu transformar um arquivo Markdown/JSON/TOML/YAML escrito no struct de metadados declarado por `content.collection` — um campo de frontmatter ausente ou com tipo errado, uma data que não parseia, um caminho não portável, ou (para `ContentTransform`) um problema de route callback/alias/fallback.
TE820Uma função genérica foi chamada com um argumento de tipo que não implementa um trait exigido por um de seus bounds.
TE821Um operador é usado sobre um parâmetro de tipo genérico que não carrega o trait bound correspondente. Sem ele, o compilador não garante que a operação vale para todo argumento de tipo possível.
TE822Um bound na assinatura da função nomeia um trait que o compilador não conhece.
TE823Um operador é usado sobre um valor de struct/enum concreto cujo tipo não implementa o trait exigido. Sem ele não há método para dirigir o operador, e quebraria em runtime.
TE824Caminhos qualificados de trait precisam ser `core::<módulo>::<Trait>` ou `std::<módulo>::<Trait>`, nomeando um `pub trait` realmente declarado ali — tanto em bound genérico quanto em cabeçalho de `impl`.
TE825Um `impl Trait for Tipo` está sem um ou mais métodos obrigatórios (os que não têm corpo padrão). Sem eles, o despacho de método e operador quebraria em runtime.
TE826Um método de coleção (`each`, `filter`, `len`, …) foi chamado diretamente sobre um wrapper `Result` ou `Option`. Desembrulhe-o primeiro com `?>`, `?` ou `.unwrap()`.
TE827`?.` é encadeamento null-safe, não desembrulhamento falível. Um `Result` ou `Option` nunca é `nil`, então o encadeamento opera sobre o wrapper. Use `expr ?> .m(...)`, `let v = expr?` ou `expr!.m(...)` em vez disso.
TE828`for x in expr` exige que `expr` produza uma sequência. Zolo itera coleções nativas e qualquer tipo que implemente `Iterator`/`IntoIterator`; um struct ou enum que não implementa nenhum dos dois não dá nada ao laço.
TE829Um `match` sobre um tipo fechado — `bool`, um enum (incluindo payloads), um optional de payload fechado, uma union fechada, ou tuplas/records de campos fechados — tem braços sem guard que não cobrem todos os valores possíveis. Um braço com guard nunca prova cobertura, porque o guard pode avaliar para `false`.
TE830Um pattern de enum nomeia uma variante real mas a desestrutura com a forma de payload errada — variantes unit, tuple e struct exigem cada uma sua própria forma de pattern, e a aridade da tuple ou os campos do struct precisam concordar com a declaração.
TE831Toda alternativa de um or-pattern (`A(x) | B(x)`) precisa introduzir os mesmos nomes com tipos compatíveis, já que o corpo do match roda depois que qualquer alternativa der certo e pode ler o nome que ela vinculou.
TE832O postfix `?` e o pipe falível `?>` exigem um valor que pode falhar — `T?`, `Option<T>` ou `Result<T, E>`. Aplicar qualquer um deles a um valor estaticamente simples não tem caminho de falha para propagar.
TE833O postfix `?`/`?>` retorna o `nil`, `Option.None` ou `Result.Err` correspondente a partir da função envolvente, e essa falha precisa ser compatível com o tipo de retorno declarado. `Option.None` não é intercambiável com `Result.Err`, e uma falha nilable nunca é embrulhada silenciosamente em nenhum dos dois enums.
TE834`?.` e `??` são operadores exclusivos de nil, mas `Option<T>` e `Result<T, E>` são valores de enum embrulhados — nenhum dos dois wrappers é `nil` em si, então `??` não consegue desembrulhá-lo. Use o postfix `?`, pattern matching, ou um método explícito do wrapper como `unwrap_or`.
TE835`as` só executa casts conhecidos pelo compilador — não faz parsing de texto, não calcula truthiness, não serializa dados nem executa uma conversão implementada por um tipo do usuário. Use `parse::<T>()`, `to_string()`, `try_into::<T>()`, ou uma comparação explícita.
TE836`valor as? T` promete uma conversão exata, checada em runtime, mas os tipos de origem e destino não têm um caminho checado que preserve o valor — por exemplo, fazer parsing de texto não é cast. Use `parse`, `try_into`, ou uma política de cast numérico.
TE837Um `as` numérico pode estreitar um range, mudar o sinal, descartar uma parte fracionária, ou arredondar um inteiro grande demais para o float de destino. Use `as?` quando só um valor exato for aceitável, ou `cast` com uma política nomeada de arredondamento/overflow quando a perda for intencional.
TE838Um cast `as` simples a partir de `Any` não consegue provar que o valor em runtime realmente tem o tipo solicitado, então Zolo rejeita. Use um cast checado (`as?`) ou narrowing de fluxo (`is`).
TE839`valor as str` mistura cast com formatação, e continua disponível apenas como ponte de migração. Use `.to_string()` explicitamente, ou um codec como `json.encode` ao produzir um formato de wire.
TE840O valor de origem já tem o tipo solicitado, então `as Tipo` não comunica nenhuma intenção nova e não executa trabalho algum. Remova a expressão de cast redundante.
TE841Uma política de `cast` numérico só se aplica à família de conversão que ela nomeia — `.wrap` é definida só para conversão inteiro-para-inteiro, enquanto `.trunc`/`.floor`/`.ceil`/`.nearest_even` convertem valores de ponto flutuante. Escolha uma política compatível, ou use `as?` quando só valores exatos forem aceitos.
TE842`into::<T>()` exige um `impl From<Origem> for T` direto, e `try_into::<T>()` exige um `impl TryFrom<Origem> for T` direto. Zolo nunca inventa uma cadeia de conversão passando por um tipo intermediário — implemente o trait correspondente, ou chame o construtor pretendido explicitamente.
TE843O `parse::<T>()` genérico é uma operação de texto: o receptor precisa ser `str` ou `bytes`, e `T` precisa ser um dos tipos numéricos suportados pelo parser do core. Use um decoder específico de domínio (como `json.decode`) para dados estruturados.
TE844`unsafe bitcast::<T>(valor)` reinterpreta os bits da representação em vez de fazer uma conversão numérica ou de domínio, então os dois tipos precisam ser tipos numéricos de largura fixa com exatamente a mesma quantidade de bits. Use `as?`, `cast::<T>(política)`, `into` ou `try_into` para de fato mudar o valor.
TE845Um `impl From<S>`/`TryFrom<S>` só é legal no pacote que possui o tipo de origem `S` ou o tipo de destino — caso contrário, dois pacotes sem relação poderiam definir significados concorrentes para a mesma conversão. Zolo também rejeita implementações sobrepostas e nunca busca cadeias de conversão como `A -> B -> C`.
TE846`as?` e `is` só conseguem sondar uma categoria primitiva ou o nome declarado de um tipo do usuário (tipos genéricos pelo nome-base). Uma forma estrutural como `[int]`, `{str: int}`, um record, uma tupla, uma união ou `T?` não tem testemunha em runtime: sonde a categoria (`as? array`, `is map`) ou decodifique o valor com `@derive(Deserialize)` para validar os elementos.
TE970Um tagged template `tag"…"` não é sintaxe especial — ele se reduz a uma chamada comum a uma função chamada `tag`, e nenhuma função com esse nome está em escopo.
TE976`parallel { … }` roda cada statement de topo como sua própria task concorrente, então todo statement do bloco precisa ser uma expressão que possa virar uma.
Efeitos
16TE800Uma função executa um efeito (`!io`, `!net`, `!fs`, ...) que não declarou em sua assinatura.
TE801Um efeito foi executado mas nenhum bloco `handle` envolvente o trata.
TE802Um bloco `handle` tenta tratar uma operação que o efeito não declarou.
TE803Um bloco `handle` está sem a implementação de uma das operações declaradas pelo efeito.
TE804O handler referencia um nome de operação que não existe no efeito.
TE805Uma assinatura de função ou handler faz referência a um efeito que o compilador não encontra.
TE806Uma chamada `perform` ou operação de handler não corresponde à assinatura declarada do efeito.
TE807`handle … with <handler_valor>` usa um handler-valor que cobre só parte das operações do efeito. O erro aparece no `with` e nomeia as operações faltantes.
TE808Uma chamada `perform Efeito::op(…)` passou um argumento cujo tipo não corresponde ao tipo do parâmetro declarado da operação.
TE809A forma resumida do TE800: em vez de reportar cada `perform`, junta todos os efeitos que a função de fronteira realmente precisa e reporta todos na assinatura.
TE810É um aviso, não uma falha de build. Um bloco `handle` usando um handler-valor com anotação explícita `handler<…>` cobre um efeito que o corpo tratado nunca realiza.
TE811Um parâmetro genérico é usado tanto como parâmetro de tipo quanto como cauda de variável de linha numa cláusula `with` (`{Fs | e}`). Um mesmo nome não pode significar um tipo e um conjunto de efeitos extras ao mesmo tempo.
TE812Um `perform` mira uma operação declarada `multi` (retomável mais de uma vez). Continuações multi-shot hoje são exclusivas da VM.
TE813O parâmetro de tipo de um efeito genérico não resolveu num `perform` — nem os tipos dos argumentos nem um `with Efeito<Concreto>` deram um tipo concreto.
TE814`h` precisa ser algo cujo tipo seja `handler<…>`. Se resolver para outra coisa, não há conjunto de braços para despachar as operações realizadas.
TE815Um parâmetro tipado como função simples (`fn(...) -> T`, sem cláusula `with`) promete pureza — nada do que roda nele realiza um efeito que o chamador já não conheça. Passar ali uma função que ela própria exige um efeito deixa esse efeito escapar totalmente não declarado, a mesma classe de vazamento que `TE802` bloqueia na direção comum de chamada.