Saltar al contenido

Referencia de Diagnósticos

Todos los errores, advertencias y lints que emite el conjunto de herramientas de Zolo. Haz clic en un código para ver la explicación completa, la causa típica y la corrección recomendada.

con explicación completa 170/204
Referencia de Diagnósticos 204
01

Lint

24
float-equality
Comparando floats con `==` o `!=`

La igualdad entre floats es imprecisa. Usa `~=` (tolerancia adaptativa), `!~=` o `math.approx_eq_abs/_rel(...)`. Para comparaciones exactas, usa el tipo `decimal`.

unused-variable
Variable no utilizada

Una variable `let` o parámetro nunca se lee. Prefija el nombre con `_` para silenciar el lint intencionalmente.

unused-function
Función no utilizada

Una función de nivel superior nunca se llama y no está marcada con `pub`, `@test`, `@bench`, `@export`, ruta HTTP ni `main`.

unused-import
Import no utilizado solo resumen

Un nombre importado nunca se referencia en el archivo.

shadowed-variable
La variable hace shadowing de un binding externo solo resumen

Un `let` re-vincula un nombre de un ámbito externo. El shadowing a veces es intencional; renombra uno de los bindings para silenciar la advertencia.

dead-code
Código muerto tras una sentencia terminal solo resumen

El código tras `return`, `break` o `continue` es inalcanzable.

naming-convention
Violación de la convención de nombres

Funciones/variables usan `snake_case`; structs/enums/traits/efectos usan `PascalCase`.

non-exhaustive-match
Match no exhaustivo (lint heredado, ya no emitido)

Alias heredado: los match cerrados ahora los verifica una sola vez el type checker como `TE829`. Se mantiene para que los enlaces antiguos tengan destino.

must-use
Valor `@must_use` descartado solo resumen

Una función o tipo anotado con `@must_use` retornó un valor que el llamador descartó. Vincúlalo (`let _ = ...`) o consúmelo.

deprecated
Uso de elemento obsoleto solo resumen

Se llamó una función anotada con `@deprecated`. El mensaje de la anotación explica el reemplazo.

infinite-loop
Bucle infinito sin salida solo resumen

Un bloque `loop`/`while true` no tiene ningún `break`/`return` alcanzable.

optional-typo
Probable error tipográfico en acceso opcional solo resumen

Un uso de `Some(...)` / `None` / `?.` / `??` que parece un error tipográfico o mal uso de la API de opcional.

unreachable-pattern
Brazo de `match` inalcanzable solo resumen

Un patrón nunca coincide porque un brazo anterior ya lo cubre.

max-line-length
La línea excede la longitud máxima configurada solo resumen

Configurado vía lint config del proyecto. El predeterminado es permisivo; ajústalo en CI si quieres límites estrictos.

max-nesting-depth
Bloque anidado más profundo de lo permitido solo resumen

El anidamiento profundo perjudica la legibilidad. Extrae helpers o usa guard clauses con return temprano.

max-parameters
Función con demasiados parámetros solo resumen

Las listas largas de parámetros son un code-smell. Considera agrupar parámetros relacionados en una struct.

max-function-length
El cuerpo de la función excede la longitud configurada solo resumen

Divide la función en helpers más pequeños.

unknown-repr
Política `@repr(...)` desconocida solo resumen

Solo se reconocen `@repr(C)`, `@repr(packed)`, `@repr(transparent)` y `@repr(zolo)`.

transparent-multi-field
`@repr(transparent)` en struct con varios campos solo resumen

`transparent` solo se aplica a structs newtype de un único campo.

layout-in-default-repr
`@layout(...)` en struct con repr predeterminado solo resumen

`@layout` solo tiene efecto junto a un `@repr` explícito.

align-not-positive
`@layout(align = ...)` debe ser positivo solo resumen

La alineación debe ser una potencia de dos positiva.

align-not-power-of-two
`@layout(align = ...)` debe ser potencia de dos solo resumen

Las reglas de alineación de hardware requieren valores potencia de dos (1, 2, 4, 8, ...).

align-too-large
Valor de `@layout(align = ...)` demasiado grande solo resumen

La alineación solicitada excede el máximo soportado por la plataforma destino.

size-not-positive
`@layout(size = ...)` debe ser positivo solo resumen

El tamaño no puede ser cero ni negativo.

02

Parser

05
03

Tipos

158
E0001
Incompatibilidad de tipos (heredado) solo resumen

Equivalente a `TE001`. Emitido por el clasificador heredado cuando el nuevo typeck no adjuntó un código.

E0002
Variable no definida (heredado) solo resumen

Alias heredado para `TE100`.

E0003
Función no definida / no invocable (heredado) solo resumen

Alias heredado para `TE101`.

E0004
No se puede reasignar (heredado) solo resumen

Alias heredado para `TE004`. La variable se declaró con `let`; usa `let mut` para permitir reasignación.

E0005
Campo no definido (heredado) solo resumen

Alias heredado para `TE102`.

E0006
Campo ausente solo resumen

Un literal de struct omite uno o más campos obligatorios.

E0007
Número incorrecto de argumentos (heredado) solo resumen

Alias heredado para `TE110`.

E0008
Tipo de retorno incompatible solo resumen

El valor retornado no coincide con el tipo de retorno declarado por la función.

E0009
Declaración duplicada solo resumen

Un nombre (función, variable, campo, variante) se declaró dos veces en el mismo ámbito.

E0010
Tipo desconocido solo resumen

Una anotación de tipo se refiere a un tipo que el compilador no puede encontrar.

TE001
Incompatibilidad de tipo en `let`

El valor asignado a un binding `let` no satisface la anotación de tipo declarada.

TE002
Incompatibilidad de tipo en `const`

El valor asignado a un binding `const` no satisface la anotación de tipo declarada.

TE003
Valor de `const` no es constante en tiempo de compilación

`const` requiere una expresión constant-foldable. Usa `let` para valores en runtime.

TE004
No se puede reasignar un binding inmutable

Los bindings `let` son inmutables por defecto. Usa `let mut x = ...` para permitir reasignación, o crea un nuevo binding con shadowing via `let`.

TE005
Asignación compuesta en valor no numérico

Operadores como `+=`, `-=`, `*=` requieren que ambos lados sean numéricos (o cadenas, para `+=`).

TE006
Aridad de retorno múltiple (faltan valores)

La función declaró un retorno en tupla, pero la sentencia `return` proporciona menos valores.

TE007
Aridad de retorno múltiple (demasiados valores)

La función retorna más valores de los que su tipo de retorno único puede contener.

TE008
Tipo de elemento de array incompatible

Un literal de array mezcla tipos incompatibles; los arrays son homogéneos.

TE009
Aritmética entre tipos incompatibles

La aritmética binaria requiere que ambos operandos sean numéricos y (en modo strict) del mismo tipo numérico.

TE100
Variable no definida

El nombre no está declarado en ningún ámbito envolvente. El compilador adjunta una sugerencia "¿quisiste decir?" cuando existe un nombre similar.

TE101
Llamando un valor que no es función

El objetivo de una expresión de llamada no es un tipo invocable.

TE102
Struct no tiene ese campo

La struct no declara este campo. Se adjuntan sugerencias "¿quisiste decir?" para nombres similares.

TE103
Nombre de tipo desconocido

Una anotación de tipo o campo de variante de enum hace referencia a un tipo que el compilador no puede resolver.

TE104
Método inexistente

El tipo receptor no tiene un método con ese nombre. Verifica la ortografía, los imports y la visibilidad del trait.

TE105
Módulo de la stdlib usado sin `use std::…`

Un nombre simple corresponde a un módulo conocido de la biblioteca estándar (`math`, `json`, `http`, `os`, …) que nunca se trajo al ámbito. A diferencia de TE100, el compilador reconoce el nombre e indica exactamente qué línea `use` falta.

TE107
Campo faltante en la construcción del struct

Un literal de struct omite un campo que no tiene valor por defecto ni zero-value de respaldo. Todo campo sin default debe proporcionarse explícitamente en la construcción.

TE108
No se puede derivar `Default`: campo sin valor por defecto

Un struct con `@derive(Default)` tiene un campo cuyo tipo no posee zero-value ni default explícito, por lo que no se puede sintetizar ninguna impl de `Default`.

TE109
No se puede inferir el tipo del campo por su valor por defecto

Un campo de struct se escribió sin anotación de tipo, apoyándose en su valor por defecto para inferirlo (`nombre = valor`) — pero el tipo de ese valor es ambiguo (p. ej. `nil`, o una expresión que resuelve a `any`).

TE110
Aridad incorrecta en la llamada al método

El número de argumentos pasados no coincide con la cantidad de parámetros de la función.

TE111
Tipo de argumento incompatible en llamada al método

El tipo de un argumento no coincide con el tipo del parámetro correspondiente.

TE112
Campo embebido por `using` es ambiguo

Dos o más campos embebidos con `using` declaran un campo con el mismo nombre, por lo que un acceso `.campo` en el struct externo no sabe de cuál embed promoverlo.

TE113
El campo `using` debe embeber un struct

Un campo marcado con `using` debe embeber otro struct — son sus campos los que se promueven. Un escalar, o cualquier tipo que no sea una declaración de struct conocida, no tiene campos que promover.

TE114
Un enum con discriminantes numéricos no puede ser genérico

Un enum optó por discriminantes numéricos (tipo de respaldo, o un `= n` explícito) pero es genérico o tiene una variante con payload. Los discriminantes solo tienen sentido para enums planos, con todas las variantes unitarias.

TE115
El discriminante no cabe en el tipo de respaldo

El discriminante de una variante está fuera del rango del tipo de respaldo declarado (`enum E: u8` lo limita a `0..=255`), por lo que no sobreviviría al ida y vuelta de `to_int()`/`from_int()`.

TE116
Valor de discriminante duplicado

Dos variantes del mismo enum resolvieron al mismo entero — o dos `= n` explícitos colisionan, o un valor autoincrementado cayó sobre uno ya usado.

TE117
Un enum `@stable` exige discriminante explícito

Bajo `@stable` el autoincremento está prohibido: insertar una variante en el medio renumeraría silenciosamente todas las siguientes, rompiendo la codificación que la anotación promete mantener.

TE118
El discriminante debe ser una constante entera

El discriminante `= expr` de una variante o no evaluó a un entero en tiempo de compilación, o no pudo evaluarse como constante de compilación.

TE119
Un enum `@flags` debe ser plano y no genérico

Un enum `@flags` es genérico o tiene una variante con payload. `@flags` modela una bitmask sobre un conjunto fijo y plano de variantes unitarias — no hay espacio para parámetros de tipo ni payloads.

TE120
El valor de la flag debe ser potencia de dos o un compuesto

Cada variante `@flags` debe ser un bit nuevo (autoincrementado o potencia de dos explícita) o un compuesto nombrado construido solo a partir de bits declarados encima de ella.

TE121
El valor de la flag no cabe en el tipo de respaldo

El valor de una flag está fuera del rango del tipo de respaldo del enum — las flags en `enum: u8` llegan hasta `255` (bit 7).

TE122
Dos flags ocupan el mismo bit

Dos flags de un solo bit en el mismo enum `@flags` resolvieron al mismo bit, normalmente porque recibieron el mismo valor explícito.

TE123
Campo inexistente en el patrón de destructuring

Un patrón de destructuring — `let Struct { … } = expr`, un `let { … }` anónimo, un patrón de parámetro o una asignación con destructuring de struct — nombra un campo que el struct no tiene.

TE124
El bloque `let … else` debe divergir

El bloque `else` puede caer fuera. Si lo hiciera, la ejecución seguiría hacia los bindings del patrón con un valor que NO coincidió, por lo que todo camino por `else` debe retornar, hacer panic, romper o continuar.

TE125
Un patrón refutable en `let` exige `else`

El patrón puede no coincidir (patrón de variante de enum, patrón de longitud de array, …) y no tiene cláusula `else`. Sin ella, un valor que no coincide ligaría basura silenciosamente.

TE126
No se puede inferir el struct detrás de `let { … }`

Un patrón de struct anónimo necesita saber qué struct desestructura, pero el tipo del valor no resuelve a un struct concreto — normalmente por falta de anotación de tipo.

TE127
El struct del patrón de parámetro no coincide con su anotación

Un patrón de struct nombrado en posición de parámetro (`fn f(NombreStruct { … }: T)`) nombra un struct distinto al de la anotación de tipo del propio parámetro.

TE128
El origen del spread debe ser un struct o record

El spread final de un literal de struct (`Struct { ..origen }`) tiene un `origen` que no es struct ni record, por lo que no hay campos que esparcir.

TE129
Cantidad de valores incompatible en la asignación de tupla

Una asignación con destructuring de tupla (`(a, b, c) = expr`) tiene un número de destinos distinto al número de valores de `expr`.

TE130
La asignación con destructuring solo acepta `=`

Los operadores compuestos (`+=`, `-=`, …) no tienen significado por elemento cuando el lado izquierdo es un patrón entero, y el spread `..` no tiene sentido como destino de asignación.

TE131
La llamada con argumento nombrado no se puede reordenar

Un argumento nombrado (`f(nombre: valor)`) no coincide con los parámetros declarados de la función llamada — un nombre desconocido o duplicado, un argumento posicional después de uno nombrado, un parámetro intermedio omitido, o una llamada cuya firma no se conoce localmente.

TE132
Placeholder `_` inválido

El placeholder `_` solo es válido como argumento directo en la llamada del lado derecho (RHS) de una etapa de pipe `|>`/`?>` (como máximo uno por etapa), o como la cabeza de una cadena de campo/método/índice usada como argumento de llamada (`_.campo`). Un `_` suelto, un segundo `_` en la misma etapa de pipe, o `_` como lado izquierdo de un pipe son todos rechazados.

TE133
Variante de enum desconocida

Se identificó un enum real y declarado para este punto — como base de `EnumName::variante`, o como tipo del valor evaluado por un pattern con atajo `.variante` — pero el nombre de la variante no coincide con ninguna variante declarada. Se incluye una sugerencia "¿quisiste decir?" en el mensaje cuando existe un nombre cercano.

TE134
Un nombre del preludio de la VM no tiene implementación nativa

El nombre forma parte del preludio siempre-en-ámbito de la VM, pero el backend native/LLVM no tiene implementación para él. Compilar igual haría que evaluara silenciosamente a `nil` y saliera con 0, así que el build falla.

TE135
Un nombre desconocido no tiene binding nativo

Chequeo exclusivo de native/LLVM: un identificador simple no resolvió a nada. Sin preludio Lua de respaldo, se convertiría silenciosamente en `nil` en runtime — la clase "un typo se vuelve un no-op silencioso" que esto detecta en tiempo de build.

TE136
No se puede inferir el enum de un atajo `.Variante`

El atajo `.Variante` obtiene su enum del tipo que espera la posición donde aparece, y esta posición no aporta nada utilizable — ningún tipo esperado (un `let` sin anotación, un argumento de una función cuya firma no se conoce), un parámetro genérico aún sin fijar, o un tipo que no es un enum. Anota la variable o escribe la forma calificada `Enum::Variante`.

TE137
Variante desconocida en un atajo `.Variante`

El atajo `.Variante` resolvió su enum a partir del tipo esperado por la posición, pero ese enum no tiene ninguna variante con ese nombre. Se incluye una sugerencia "¿quisiste decir?" cuando existe un nombre cercano. La forma de pattern del mismo error reporta `TE133` en lugar de este código.

TE138
Colisión de prefijo del linker de decl-module o referencia no soportada

Un build native/LLVM no logró unir (splice) un módulo de declaración: o una declaración del usuario comienza con el prefijo `__zolo_std_`, reservado por el compilador, o una función alcanzable del módulo de declaración hace referencia a un elemento hermano que el linker no puede llevar al programa final. Cualquiera de los dos casos haría que el build AOT divergiera silenciosamente de la VM.

TE139
Elemento de texto crudo `<style>`/`<script>` sin cerrar

`<style>` y `<script>` son elementos de texto crudo: su contenido corre literal hasta el `</style>`/`</script>` correspondiente, sin markup anidado y sin interpolación `{expr}`. Llegar al final del archivo antes de ese cierre reporta TE139 en lugar del mensaje genérico "unclosed element" — normalmente una etiqueta de cierre olvidada, o una cadena con forma `</tag` dentro del contenido (por ejemplo, un literal de cadena JS) que cerró el bloque antes de tiempo.

TE140
La recipe del Resource Graph no pudo sellarse

Una recipe del Resource Graph en tiempo de build (`Resource.dir(...).seal()`) no pudo sellarse en su Resource Image inmutable — una ruta ausente o que no es un directorio, un patrón `include` que no coincidió con nada, una ruta que escapa de la raíz del recurso, una colisión de ruta lógica, o un archivo que no se pudo leer mientras se sellaba el snapshot. No existe respaldo hacia el directorio de trabajo en runtime: el build falla en su lugar.

TE141
Valor de Resource Graph o Resource Image malformado

El compilador recibió un valor interno malformado del Resource Graph, o una Resource Image sellada falló sus comprobaciones de integridad — un campo de recipe inválido (`root`, `includes`, `excludes`) o un estado de build corrupto, distinto de las fallas accionables de entrada/sellado de `TE140`.

TE142
Conclusión void usada en posición de valor

Un `;` colocado después de la expresión final de un bloque suprime su valor, así que el bloque concluye `void` en vez de producir un resultado. `TE142` se dispara cuando ese void causado por un terminador se usa donde se exige un valor — vinculado a un `let`, pasado como argumento, etcétera.

TE143
El tipo de retorno declarado entra en conflicto con una cola terminada

Una función declara `-> T`, pero un `;` después de su expresión final suprime ese valor, así que el cuerpo concluye `void` en lugar de un `T`. A menos que otro `return expr` proporcione el valor, la función nunca puede satisfacer su propia firma.

TE144
Escritura en un campo que solo tiene getter

El campo declara `get`, pero no `set`; por eso no se permiten asignaciones después de construirlo.

TE145
Acceso recursivo dentro de un accesor de campo

Usar `self.<mismo-campo>` dentro de su propio accesor causaría recursión; usa el nombre contextual `field`.

TE146
El accesor amplía la visibilidad del campo

Un accesor puede heredar o restringir la visibilidad del campo, pero no puede exponer públicamente un campo privado.

TE147
La cola falible devuelve un valor desempaquetado

`?` propaga el fallo, pero desempaqueta el éxito. Una función que devuelve `Result` u `Option` debe envolver ese éxito explícitamente con `.Ok(...)` o `.Some(...)`.

TE148
El literal de Tailwind contiene interpolación

Un literal `tw"..."` debe ser una lista estática de nombres de clase de Tailwind. Interpolar un valor en él (`tw"bg-{color}-600"`) ocultaría parte del nombre de la clase del escáner de Tailwind en tiempo de build, así que Zolo lo rechaza — elige entre literales completos usando control de flujo común.

TE201
Modo strict: la variable necesita anotación

El tipado strict requiere que cada `let`/`const` tenga una anotación de tipo explícita.

TE202
Modo strict: el parámetro necesita anotación

El tipado strict requiere que cada parámetro de función tenga un tipo explícito.

TE210
Categoría de syntax incompatible con la salida del derive

Un derive estructurado devolvió syntax que no puede insertarse en el destino; el resultado debe ser `Syntax<.Items>` o `Syntax<.Item>`.

TE211
El valor del hole no puede convertirse en syntax

Un hole `${value}` recibió un valor sin representación segura en código fuente; inserta un primitivo o un nodo `Syntax<K>`.

TE212
Identificador inválido pasado a `syntax.ident`

`syntax.ident(text)` recibió un texto que no es un único identificador Zolo válido y que no sea palabra reservada.

TE213
Spread de syntax inválido o heterogéneo

Un spread `${..values}` recibió algo distinto de una lista o tupla de nodos de syntax de una misma categoría compatible.

TE214
Los ítems generados por el derive violan el ámbito declarado

Los ítems generados escapan del ámbito de expansión declarado por `@derive_for`, como una función libre no relacionada creada por un derive restringido a impl.

TE216
El deriver devolvió un tipo de valor no compatible

Una función `@derive_for` devolvió algo distinto de los resultados compatibles: `str`, `Syntax<.Items>` o `Syntax<.Item>`.

TE217
El atributo tipado del derive no coincide con su esquema de opciones

Un atributo namespaced del derive contiene una opción desconocida, duplicada, ausente, no literal o con tipo incorrecto.

TE218
El objetivo del derive no tiene deriver registrado

Un tipo usa `@derive(T)`, pero ningún deriver para `T` está disponible en el ámbito. Zolo nunca lo ignora silenciosamente — un nombre mal escrito no puede producir un programa parcialmente generado que solo falla en runtime. Importa o declara la función pública que expone el deriver, exportada por convención con el mismo nombre que la capacidad.

TE220
El operando de await no es un Future ni un Task

`await` recibió un valor cuyo tipo conocido no es `Future<T>` ni `Task<T>`. Solo esos dos wrappers pueden suspenderse; un valor común ya está disponible y no tiene nada que esperar.

TE221
Yield usado fuera de un generator

`yield` solo es válido dentro de un generator declarado con `fn*`. Una función común o `async fn` produce un único resultado y no expone ningún iterador pull donde hacer yield.

TE222
El generator retorna un valor

Un generator (`fn*`) usó `return valor`. La terminación y los ítems producidos son conceptos separados en un generator: `return` puede detenerlo antes de tiempo, pero su valor nunca se produce como ítem del iterador — usa `yield` para eso.

TE223
Tipo incompatible en el yield del generator

Un valor producido por `yield` no satisface el tipo de elemento declarado del generator. Todo `yield` dentro de `fn* ... -> T` debe producir un valor asignable a `T`.

TE224
`await` no es compatible dentro de un generator

`await` apareció dentro de un generator `fn*`. Los generators asíncronos aún no tienen un contrato de scheduler compartido por todos los backends, así que Zolo rechaza la combinación en vez de dejar que un backend la reanude con una semántica distinta a la de otro.

TE225
Label de loop desconocido

`break :label` o `continue :label` nombra un loop que no está activo léxicamente. Los labels nunca cruzan un límite de función/lambda, y una task `spawn`eada o un callback agendado con `every`, `after` o `timeout` inicia su propia región de control de flujo, por lo que no puede saltar a un loop del llamador.

TE226
Label de loop activo duplicado

Dos loops anidados, activos al mismo tiempo, declaran el mismo label. Una salida etiquetada sería ambigua para quien lee, aunque la declaración más interna pudiera resolverse mecánicamente.

TE227
`break`/`continue` usado fuera de un loop

Un `break` o `continue` sin label aparece fuera de un loop. Estas sentencias solo pueden transferir el control dentro de un `loop`, `while` o `for` envolvente.

TE228
El valor de break apunta a un loop de sentencia

Un `break` que lleva un valor apunta a `while` o `for`. Solo la forma incondicional `loop` es una expresión que produce valor, así que un `break` con valor solo es válido allí.

TE229
Tipo del valor de break del loop incompatible

Los valores que llevan los `break` alcanzables no concuerdan con el tipo de resultado de una expresión `loop`. Un `break` sin valor aporta `void`, así que no puede salir de un loop que debería producir un valor no-void.

TE233
El resultado de timeout debe tratarse como `Result`

`timeout duración { ... }` retorna `Result<Any, TimeoutError>`. El fallo de timeout es control de flujo tipado común — no es un record sin tipo, y nunca se convierte silenciosamente en el valor de éxito.

TE301
Cantidad incorrecta de argumentos de tipo genérico

El número de argumentos de tipo proporcionados no coincide con la cantidad de parámetros del tipo genérico.

TE302
Trait desconocido

Un bound de trait, bloque `impl` o cláusula `where` hace referencia a un trait que el compilador no encuentra.

TE303
Miembro de impl de trait no declarado o superpuesto

Un `impl Trait for Tipo` no es coherente con la declaración del trait — o agrega un método que el trait no declara, o otra implementación ya satisface el mismo objetivo parametrizado y la misma instancia de trait.

TE304
La firma del método del trait es incompatible

Un método en `impl Trait for Tipo` no coincide con el trait después de sustituir `Self`, los argumentos del trait, los tipos asociados y los parámetros genéricos del método — los tipos/calificadores de parámetro, el tipo de retorno, los bounds genéricos y las filas de efecto forman parte del contrato.

TE305
El contrato de tipo asociado está incompleto o es inválido

Una implementación omite un tipo asociado obligatorio, lo define más de una vez, nombra un tipo asociado que el trait no declara, o proporciona un tipo que falla los bounds del tipo asociado.

TE480
El tipo asociado no satisface el bound declarado

Una implementación eligió un tipo asociado concreto que no satisface un bound que el trait declaró para él. El diagnóstico nombra la implementación, el tipo asociado proyectado y el requisito que falló — el tipo original se conserva, nunca se amplía silenciosamente a `Any`.

TE481
El tipo asociado falta o no se puede resolver sin ambigüedad

Un trait declara un tipo asociado sin valor por defecto, pero una implementación no lo define, así que el compilador no puede proyectar `Self::Item` (u otro nombre asociado) desde esa implementación.

TE482
Los argumentos de tipo del trait son incompatibles con el witness requerido

El tipo concreto implementa el nombre de trait solicitado, pero con argumentos de tipo diferentes. Los witnesses de trait son exactos — implementar `Sink<str>` no prueba `Sink<int>`.

TE486
El miembro no es común a todas las alternativas de la union

Un valor tipado como union solo puede usarse sin narrowing a través de miembros compartidos por todas las alternativas. Leer un campo o llamar un método que falta en algunas alternativas sería válido para un valor en runtime e inválido para otro.

TE708
Lista de islands sin `key`

Una advertencia, no un fallo de build. Un loop `for` produce una lista de filas y la fila que lleva un componente `@island` no tiene `key` — el morph del lado cliente reescribe la fila nodo por nodo al reordenar, en vez de aplicar el patch en su lugar, y la island pierde el estado hidratado del DOM (los signals se reinician, se pierden el foco y el scroll).

TE719
El handler en un `@island` no se puede compilar a JavaScript

Un handler de evento dentro de un `@island` contiene una expresión que la reducción del cliente de Verniz no puede representar en JavaScript. El renderizado en el servidor aún produciría el control, pero publicarlo sin su handler crearía un elemento con apariencia interactiva que no hace nada — por eso el build falla en su lugar.

TE720
No se puede asignar a una cell derivada (`let<signal>`)

Una asignación apunta a un signal derivado declarado con `let<signal>`. Una cell derivada se define por su inicializador y se recalcula a partir de las cells de origen que lee — no es estado escribible, así que asignarle la dejaría en desacuerdo con su propio grafo de dependencias.

TE721
El `effect` en un `@island` no se puede compilar a JavaScript

Un `effect` dentro de un `@island` contiene comportamiento que la reducción del cliente de Verniz no puede compilar a JavaScript. A diferencia del renderizado en el servidor, un effect de island no tiene una mitad en el servidor capaz de preservar el comportamiento — si no se emite al cliente, nunca se ejecuta, así que el build se rechaza en vez de descartarlo silenciosamente.

TE727
El argumento `key` queda oculto por el atributo `key` del markup

Una advertencia, no un fallo de build. Una función declara su propio parámetro `key`, pero `key` es un atributo reservado del markup (spec V24) que siempre se enruta por el mapa de extras — nunca llega al parámetro `key` propio de la función, que vuelve silenciosamente a su valor por defecto. El build pasa y nada más parece incorrecto.

TE730
Interpolación `@()` fuera de un valor de declaración

`@(expr)` compila a un puente de custom property de CSS (`var(--…)`), que solo existe en valores de declaración — después del `:`, antes del `;`. En un selector, un nombre de propiedad o el preludio de una at-rule no hay `var()` al que compilar, y hacer splice de texto del usuario ahí es un anti-feature deliberado. Mueve la parte dinámica a un valor, o alterna clases estáticas en el markup.

TE731
`children` de runtime en `<style>` exige `global`

Un `<style children={expr}>` lleva contenido de runtime que el compilador no puede ver — no puede izarlo ni acotarlo; acotar texto desconocido sería una mentira. Spec §6.1: el contenido dinámico debe optar por `global` explícitamente (`<style global children={…}>`), la única forma de style que sigue siendo un nodo de render.

TE732
Valor de interpolación CSS con tipo no serializable

Un valor de `@()` viaja como custom property de CSS, y solo `str`, `int` y `float` serializan a una. Un valor tipado `bool`, `View`, map, struct o función se rechaza en compilación — en el render se convertiría en basura o desaparecería. Los valores sin tipo (`Any`) quedan en silencio: este error nunca adivina.

TE733
`@()` pegado a texto adyacente del valor CSS

`@()` compila a `var(--…)`, y CSS no concatena cadenas en valores comunes — `var(--w)px` es un error de sintaxis que el navegador descarta, no "número más unidad". Escribe `calc(@(x) * 1px)` o interpola la cadena completa (`@(f"{x}px")` — dentro de `@()` estás de vuelta en Zolo). `!important`, `/` y `*` en `calc()` son vecinos sin espacio legales.

TE734
`:global()` malformado — vacío o anidado

`:global(…)` exime a un compound del sello de ámbito hermético. Un wrapper vacío (`:global()`) no exime nada, y uno anidado (`:global(:global(a))`) escapa de un escape — ambos solo pueden ser un error. En un cuerpo `<style global>`, `:global()` ni siquiera es sintaxis Zolo y pasa intacto.

TE735
El selector con ámbito no coincide con ningún elemento del componente

Advertencia, nunca un fallo de build. El ámbito hermético sella cada compound con la clase del componente, así que un selector que nombra una clase/id/etiqueta que el markup del propio componente nunca produce es una regla muerta — y `:root` bajo ámbito está estructuralmente muerto. Incluye un "¿quisiste decir?" (distancia de edición ≤ 2) y el conjunto renderizado del componente. Valores dinámicos de class/id o llamadas `el`/`raw` abren el conjunto y suprimen la advertencia — nunca adivina.

TE736
`<style>` fuera de un componente no tiene ámbito

Un `<style>` con ámbito pertenece al fn de componente que lo rodea — el sello de clase del fn es el ámbito de los selectores. En una sentencia de nivel superior o un método de `impl`/`trait` no hay componente, así que no hay ámbito. Añade `global` (un `<style global>` estático fuera de un componente se renderiza en su lugar) o muévelo a un fn de componente. Un cuerpo con `@()` lo reporta incluso con `global`: sus valores necesitan un elemento raíz de componente.

TE737
`@()` necesita un elemento raíz que lleve su valor

Cada valor de `@()` viaja como custom property de CSS en el elemento raíz del componente (el literal de elemento en posición de cola), heredándose DOM abajo. Un componente que delega toda su vista — sin raíz de elemento propia — no da a los valores dónde viajar. Haz que la cola sea un literal de elemento (un `<div>` envolvente sirve) o quita la interpolación.

TE738
Propiedad CSS desconocida

Advertencia, nunca un fallo de build. Los nombres de propiedad se comprueban contra una tabla curada que viene con la toolchain (datos estáticos, sin descarga de registro); un casi-acierto vuelve con un "¿quisiste decir?" (distancia de edición ≤ 2). Los nombres que empiezan con `-` — prefijos de proveedor y custom properties `--` — nunca se comprueban, ni tampoco los descriptores de at-rules (el `src` de `@font-face`, …). Una propiedad más nueva que la tabla cuesta un subrayado, nunca un release.

TE740
El atributo HTML no es válido para el elemento

Un atributo HTML conocido no es válido para el elemento escrito. Verniz valida las etiquetas nativas contra su tabla DOM versionada; las props de componente siguen pasando por los diagnósticos comunes de argumento nombrado.

TE741
El binding del DOM no es válido para el elemento

Un binding `bind:` de doble vía no es compatible con el elemento, o su tipo de origen conocido es incompatible con la propiedad de DOM destino — por ejemplo, vincular una cell `str` a `bind:checked`, que espera `bool`.

TE742
Evento de DOM desconocido

Un atributo de handler de evento nombra un evento que Verniz no reconoce en ese elemento. Los nombres de evento usan la grafía del atributo DOM, como `onclick`, `oninput` y `onchange`.

TE743
El elemento HTML void tiene hijos o etiqueta de cierre

Un elemento HTML void, como `input`, `img` o `br`, se escribió con hijos o una etiqueta de cierre explícita. Los elementos void nunca pueden tener contenido, así que usa la forma de autocierre.

TE744
Al control le falta un nombre accesible de alta confianza

Una comprobación de accesibilidad de alta confianza: una `<img>` no tiene texto alternativo, o un control interactivo no tiene un nombre que un lector de pantalla pueda anunciar. Solo se dispara cuando la ausencia del nombre es segura — contenido dinámico, `children` o un spread de `HtmlAttrs` aún pueden proporcionarlo en runtime.

TE745
Atributo ARIA conocido inválido

Un atributo o role ARIA conocido se usa con una grafía o valor inválido, o un label apunta a un id de elemento que no existe en el markup escrito.

TE746
El destino del ref de DOM no es una cell de origen opcional compatible

Un destino de `ref` no puede recibir un elemento del navegador. Un `ref` debe ser una cell de origen `DomRef` opcional (`var<signal> nombre: DomRef = nil`) declarada dentro del `@island` que la posee.

TE747
El spread de markup es incompatible con HtmlAttrs/record estático del componente

Un `{...spread}` es incompatible con su destino. El reenvío dinámico hacia un elemento nativo debe estar tipado como `HtmlAttrs`; un spread de componente debe exponer campos de record estáticamente conocidos para que la comprobación común de props siga activa.

TE748
El modificador de evento del DOM es inválido o incompatible

Un modificador de evento (`prevent`, `stop`, `once`, `capture`, `passive`, `self`) es desconocido, está duplicado, o se combina de forma incompatible — `passive` no se puede combinar con `prevent`.

TE749
El portal, boundary o DOM ref no puede conectarse a su destino declarado

Un contrato de attach no se puede cumplir — el compilador detecta destinos de portal estáticamente vacíos, y el verificador de attach de desarrollo también reporta destinos de portal ausentes, marcadores de island obsoletos, propiedades de binding inválidas y refs que no pertenecen a la island.

TE750
Miembro de lifecycle de action usado en una función común

Se leyó un miembro de lifecycle como `pending`, `error` o `state` desde una referencia a una función común. Solo una referencia a una función declarada `@action` tiene el tipo nominal `ActionFn<...>` y una lane del lado cliente.

TE751
La lane observable de la action no tiene island propietaria

Un código fuera de cualquier `@island` intenta observar el lifecycle de un `ActionFn`. Una referencia de action sigue siendo invocable en el servidor, pero `pending`, `state`, `retry` y el resto del lifecycle observable son capacidades propias del navegador que no pueden cruzar un límite de island o de wire.

TE752
Política de mutation action insegura o desconocida

Una mutation action solicitó una política desconocida, o una política de sustitución/cancelación como `.Latest`. Una mutation ya aceptada por el servidor puede seguir confirmándose incluso después de que el cliente deja de interesarse por la respuesta, así que cancelar solo la continuación del cliente haría que la UI mintiera sobre el efecto.

TE753
Se llama a una action falible sin manejo observable de errores

Se llama a un `ActionFn` que retorna `Result<_, E>` desde una island que nunca observa el estado de fallo de la lane — leyendo `.error`/`.state`, o llamando a `.try_run(...)`. Sin un observador explícito, es fácil pasar por alto un fallo de validación o de transporte.

TE754
La lane explícita de action tiene identidad de lista inestable

Se creó un `.lane()` directamente dentro de un `for` renderizado. Una lane explícita posee estado mutable de lifecycle del cliente, pero una iteración de lista no tiene identidad léxica estable en cuanto se insertan, eliminan o reordenan filas.

TE763
El valor no implementa el contrato Wire del navegador

Un valor que cruza entre Zolo y el TypeScript del navegador no tiene una representación JSON determinística que el puente Wire acepte — el puente nunca recurre a `any`. Las funciones, closures, handles, `ResourceFs`, claves de map que no son string, y los tipos de usuario sin marcar se quedan en su lado de origen; los structs/enums necesitan `@wire`.

TE764
Un valor secreto/privado es alcanzable desde código de cliente

Una declaración marcada `@secret` es alcanzable desde un tipo `@wire` o un contrato de navegador `@action`. Publicarla colocaría un valor privado en una declaración, codec, request, response o bundle de navegador generado — quitar `@secret` solo para silenciar el diagnóstico es inseguro.

TE775
La colección de contenido no satisface su schema o contrato de slug

Verniz no logró convertir un archivo Markdown/JSON/TOML/YAML escrito en el struct de metadatos declarado por `content.collection` — un campo de frontmatter ausente o mal tipado, una fecha que no parsea, una ruta no portable, o (para `ContentTransform`) un problema de route callback/alias/fallback.

TE820
El tipo no implementa un trait requerido

Una función genérica se llamó con un argumento de tipo que no implementa un trait requerido por uno de sus bounds.

TE821
El operador exige un trait bound en el parámetro de tipo

Se usa un operador sobre un parámetro de tipo genérico que no lleva el trait bound correspondiente. Sin él, el compilador no puede garantizar que la operación sea válida para todo argumento de tipo posible.

TE822
El trait no existe

Un bound en la firma de la función nombra un trait que el compilador no conoce.

TE823
El operador exige que el tipo concreto implemente un trait

Se usa un operador sobre un valor de struct/enum concreto cuyo tipo no implementa el trait requerido. Sin él no hay método que impulse el operador y fallaría en runtime.

TE824
Ruta calificada de trait inválida

Las rutas calificadas de trait deben ser `core::<módulo>::<Trait>` o `std::<módulo>::<Trait>`, nombrando un `pub trait` realmente declarado allí — tanto en un bound genérico como en una cabecera de `impl`.

TE825
Impl de trait incompleta: falta un método requerido

Un `impl Trait for Tipo` carece de uno o más métodos requeridos (los que no tienen cuerpo por defecto). Sin ellos, el despacho de método y operador fallaría en runtime.

TE826
Método de colección sobre `Result`/`Option` sin desenvolver

Se llamó a un método de colección (`each`, `filter`, `len`, …) directamente sobre un wrapper `Result` u `Option`. Desenvuélvelo primero con `?>`, `?` o `.unwrap()`.

TE827
Encadenamiento null-safe `?.` en `Result`/`Option`

`?.` es encadenamiento null-safe, no desenvolvimiento fallible. Un `Result` u `Option` nunca es `nil`, por lo que el encadenamiento opera sobre el wrapper. Usa `expr ?> .m(...)`, `let v = expr?` o `expr!.m(...)` en su lugar.

TE828
El tipo no es iterable

`for x in expr` exige que `expr` produzca una secuencia. Zolo itera colecciones nativas y cualquier tipo que implemente `Iterator`/`IntoIterator`; un struct o enum que no implementa ninguno no le da nada al bucle.

TE829
Match no exhaustivo sobre un tipo cerrado

Un `match` sobre un tipo cerrado — `bool`, un enum (incluyendo payloads), un optional de payload cerrado, una union cerrada, o tuplas/records de campos cerrados — tiene brazos sin guard que no cubren todos los valores posibles. Un brazo con guard nunca prueba cobertura, porque el guard puede evaluar a `false`.

TE830
El pattern de enum tiene la forma de payload incorrecta

Un pattern de enum nombra una variante real pero la destructura con la forma de payload incorrecta — las variantes unit, tuple y struct exigen cada una su propia forma de pattern, y la aridad de la tuple o los campos del struct deben concordar con la declaración.

TE831
Las alternativas del or-pattern vinculan nombres o tipos incompatibles

Cada alternativa de un or-pattern (`A(x) | B(x)`) debe introducir los mismos nombres con tipos compatibles, ya que el cuerpo del match corre después de que cualquier alternativa tenga éxito y puede leer el nombre que esa alternativa vinculó.

TE832
El postfix `?`/`?>` exige un operando estáticamente falible

El postfix `?` y el pipe falible `?>` exigen un valor que pueda fallar — `T?`, `Option<T>` o `Result<T, E>`. Aplicar cualquiera de los dos a un valor estáticamente simple no tiene camino de fallo que propagar.

TE833
El camino de fallo falible es incompatible con el tipo de retorno envolvente

El postfix `?`/`?>` retorna el `nil`, `Option.None` o `Result.Err` correspondiente desde la función envolvente, y ese fallo debe ser compatible con su tipo de retorno declarado. `Option.None` no es intercambiable con `Result.Err`, y un fallo nilable nunca se envuelve silenciosamente en ninguno de los dos enums.

TE834
Operador exclusivo de nil usado directamente sobre `Option`/`Result` envuelto

`?.` y `??` son operadores exclusivos de nil, pero `Option<T>` y `Result<T, E>` son valores de enum envueltos — ninguno de los dos wrappers es `nil` en sí mismo, así que `??` no puede desenvolverlo. Usa el postfix `?`, pattern matching, o un método explícito del wrapper como `unwrap_or`.

TE835
Cast inválido; usa parsing, un predicado o una conversión de dominio

`as` solo ejecuta casts conocidos por el compilador — no parsea texto, no calcula truthiness, no serializa datos ni ejecuta una conversión implementada por un tipo de usuario. Usa `parse::<T>()`, `to_string()`, `try_into::<T>()`, o una comparación explícita.

TE836
El cast comprobado nunca puede tener éxito o no tiene implementación exacta

`valor as? T` promete una conversión exacta, comprobada en runtime, pero los tipos de origen y destino no tienen un camino comprobado que preserve el valor — por ejemplo, parsear texto no es un cast. Usa `parse`, `try_into`, o una política de cast numérico.

TE837
El cast numérico puede perder información

Un `as` numérico puede estrechar un rango, cambiar el signo, descartar una parte fraccionaria, o redondear un entero demasiado grande para el float de destino. Usa `as?` cuando solo se acepte un valor exacto, o `cast` con una política nombrada de redondeo/overflow cuando la pérdida sea intencional.

TE838
Cast no comprobado desde un valor dinámico

Un cast `as` simple desde `Any` no puede probar que el valor en runtime realmente tiene el tipo solicitado, así que Zolo lo rechaza. Usa un cast comprobado (`as?`) o narrowing de flujo (`is`).

TE839
La stringificación vía `as str` es comportamiento heredado

`valor as str` mezcla cast con formateo, y sigue disponible solo como puente de migración. Usa `.to_string()` explícitamente, o un codec como `json.encode` al producir un formato de wire.

TE840
Cast redundante

El valor de origen ya tiene el tipo solicitado, así que `as Tipo` no comunica ninguna intención nueva y no realiza ningún trabajo. Elimina la expresión de cast redundante.

TE841
La política de cast numérico es incompatible con el origen o el destino

Una política de `cast` numérico solo se aplica a la familia de conversión que nombra — `.wrap` está definida solo para conversión de entero a entero, mientras que `.trunc`/`.floor`/`.ceil`/`.nearest_even` convierten valores de punto flotante. Elige una política compatible, o usa `as?` cuando solo se acepten valores exactos.

TE842
No hay implementación directa de conversión From/TryFrom

`into::<T>()` exige un `impl From<Origen> for T` directo, y `try_into::<T>()` exige un `impl TryFrom<Origen> for T` directo. Zolo nunca inventa una cadena de conversión pasando por un tipo intermedio — implementa el trait correspondiente, o llama al constructor pretendido explícitamente.

TE843
El tipo de origen o destino de parse no es compatible

El `parse::<T>()` genérico es una operación de texto: el receptor debe ser `str` o `bytes`, y `T` debe ser uno de los tipos numéricos soportados por el parser del core. Usa un decoder específico del dominio (como `json.decode`) para datos estructurados.

TE844
El bitcast unsafe exige layouts numéricos del mismo tamaño

`unsafe bitcast::<T>(valor)` reinterpreta los bits de la representación en lugar de hacer una conversión numérica o de dominio, así que ambos tipos deben ser tipos numéricos de ancho fijo con exactamente la misma cantidad de bits. Usa `as?`, `cast::<T>(política)`, `into` o `try_into` para cambiar el valor de verdad.

TE845
La implementación From/TryFrom viola la coherencia de conversión

Un `impl From<S>`/`TryFrom<S>` solo es legal en el paquete que posee el tipo de origen `S` o el tipo de destino — de lo contrario, dos paquetes sin relación podrían definir significados en competencia para la misma conversión. Zolo también rechaza implementaciones superpuestas y nunca busca cadenas de conversión como `A -> B -> C`.

TE846
El destino del cast verificado o de `is` no tiene testigo en tiempo de ejecución

`as?` e `is` solo pueden sondear una categoría primitiva o el nombre declarado de un tipo de usuario (los tipos genéricos por su nombre base). Una forma estructural como `[int]`, `{str: int}`, un record, una tupla, una unión o `T?` no tiene testigo en tiempo de ejecución: sondea la categoría (`as? array`, `is map`) o decodifica el valor con `@derive(Deserialize)` para validar sus elementos.

TE970
Tagged template sin función de tag correspondiente

Un tagged template `tag"…"` no es sintaxis especial — se reduce a una llamada normal a una función llamada `tag`, y no hay ninguna función con ese nombre en el ámbito.

TE976
Sentencia que no es expresión dentro de `parallel { }`

`parallel { … }` ejecuta cada sentencia de nivel superior como su propia tarea concurrente, por lo que toda sentencia del bloque debe ser una expresión que pueda convertirse en una.

04

Efectos

16
TE800
Declaración de efecto ausente

Una función ejecuta un efecto (`!io`, `!net`, `!fs`, ...) que no declaró en su firma.

TE801
Efecto no manejado

Se ejecutó un efecto pero ningún bloque `handle` envolvente lo maneja.

TE802
Efecto no declarado por el handler

Un bloque `handle` intenta manejar una operación que el efecto no declaró.

TE803
Operación ausente en el handler

Un bloque `handle` no implementa una de las operaciones declaradas por el efecto.

TE804
Operación desconocida en el handler

El handler hace referencia a un nombre de operación que no existe en el efecto.

TE805
Efecto desconocido

Una firma de función o handler hace referencia a un efecto que el compilador no encuentra.

TE806
Aridad / firma de efecto incompatible

Una llamada `perform` u operación de handler no coincide con la firma declarada del efecto.

TE807
La cobertura del handler-valor está incompleta

`handle … with <handler_valor>` usa un handler-valor que cubre solo parte de las operaciones del efecto. El error aparece en el `with` y nombra las operaciones faltantes.

TE808
Tipo de argumento incompatible en `perform`

Una llamada `perform Efecto::op(…)` pasó un argumento cuyo tipo no coincide con el tipo del parámetro declarado de la operación.

TE809
La función realiza efectos que no declara

La forma resumida de TE800: en lugar de reportar cada `perform`, reúne todos los efectos que la función de frontera realmente necesita y los reporta en la firma.

TE810
El handler cubre un efecto que el cuerpo nunca realiza

Es una advertencia, no un fallo de build. Un bloque `handle` que usa un handler-valor con anotación explícita `handler<…>` cubre un efecto que el cuerpo tratado nunca realiza.

TE811
Parámetro genérico usado como tipo y como variable de fila

Un parámetro genérico se usa a la vez como parámetro de tipo y como cola de variable de fila en una cláusula `with` (`{Fs | e}`). Un mismo nombre no puede significar un tipo y un conjunto de efectos extra a la vez.

TE812
El efecto multi-shot no está soportado en el backend nativo

Un `perform` apunta a una operación declarada `multi` (reanudable más de una vez). Las continuaciones multi-shot hoy son exclusivas de la VM.

TE813
No se puede inferir el argumento de tipo de la operación de efecto

El parámetro de tipo de un efecto genérico no resolvió en un `perform` — ni los tipos de los argumentos ni un `with Efecto<Concreto>` dieron un tipo concreto.

TE814
`handle … with h` exige un handler-valor

`h` debe ser algo cuyo tipo sea `handler<…>`. Si resuelve a otra cosa, no hay conjunto de brazos al que despachar las operaciones realizadas.

TE815
Se pasó una función que exige un efecto donde se espera una función pura

Un parámetro tipado como función simple (`fn(...) -> T`, sin cláusula `with`) promete pureza — nada de lo que corre en ella realiza un efecto que el llamador ya no conozca. Pasar allí una función que ella misma exige un efecto deja que ese efecto escape completamente sin declarar, la misma clase de fuga que `TE802` bloquea en la dirección común de llamada.

05

Runtime

01

Índice global

Encuentra tu camino por Zolo

Prueba una idea

Empieza aquí

9 resultados

9 resultados

enespt-br