Saltar al contenido principal

Códigos de error

Todos los diagnósticos que TDC puede emitir, por código. Consúltelo cuando una ejecución se detiene y el mensaje por sí solo no alcanza.

Cómo leer un diagnóstico

Un diagnóstico lleva cuatro cosas, y el código es la parte que no cambia entre versiones: la redacción puede mejorar, TDC193 sigue siendo TDC193.

./run demo.tdc
error[TDC193]: "Naem" is not a declared sequence — it would be printed literally
--> demo.tdc:8:11
|
8 |     <line><data>${{Naem}}</data></line>
|           ^^^^^^^^^^^^^^^^^^^^^^
|
help: did you mean "Name"?
note: Declare it in <env>, or set a different inject= pattern if you really want the text ${{…}} in the output.
  • el código — qué salió mal; estable entre versiones;
  • el lugar — archivo, línea y columna, con el elemento culpable subrayado;
  • help: — una conjetura de lo que quiso decir, cuando el nombre casi acierta;
  • note: — qué hacer al respecto.

La validación corre antes de la generación, así que un config con errores no produce dato alguno en vez de medio archivo. Casi cada diagnóstico aquí es un error y detiene el run: si el config pidió algo que no va a obtener, TDC se niega en vez de devolver datos que parecen correctos pero no lo son. Las excepciones son doce advertencias que dejan terminar el run: TDC136 (una fila de <map> malformada, omitida mientras las válidas siguen aplicando), TDC171 (un archivo de data pack cuya cabecera lo deja sin dirección), TDC200 (una estimación de memoria grande pero que cabe), TDC216 (una expresión que siempre es verdadera o siempre falsa), TDC221 (un grupo <uniq> o <distinct> con un solo miembro, que no restringe nada), TDC231 (un pool que nadie lee), TDC234 (un pool de más de 100.000 miembros), TDC299 (una columna uniq más allá de 100.000 filas, cuya memoria crece con el número de filas — en su segundo sentido, un pool declarado fuera de orden, es un error), TDC251 (una proporción de percent que pide menos de una fila), TDC272 (una locale que da nombres muy bien y no trae nombres de meses, así que las fechas salen en inglés) y TDC284 (un secret= escrito como literal dentro del config — una clave viaja a donde viaje él) y TDC301 (una lista de porcentajes que deja un valor declarado en 0%, de modo que ya nunca puede salir). Cada una lo indica en su fila más abajo.

Los números se reparten más o menos en el orden en que se revisa un config — primero la estructura, luego los generadores, luego todo lo construido encima — pero el número es un identificador, no una clasificación. Guíese por los grupos de abajo.

Estructura del documento

CódigoCuándo saltaQué hacer
TDC001El archivo no tiene raíz <tdc>, o no se pudo analizar en absoluto — un error de sintaxis, incluida una etiqueta de cierre con otro nombre (<sequence>…</gen>) o elementos anidados a más de 64 niveles, algo a lo que ninguna configuración real llega y una generada síEnvuelva todo en un único <tdc>…</tdc>, o corrija la sintaxis que señala el mensaje. Nada más se comprueba hasta que el archivo se analice
TDC002<tdc> no tiene hijo <block>Agregue el <block> con la disposición de un registro
TDC003En <tdc> están version y v a la vezDeje uno — son alias
TDC004La versión declarada no parece una versiónUse una versión que el runtime admita, p. ej. v="0.1" (un valor más nuevo que el runtime lanza TDC005)
TDC005El archivo pide una versión más nueva que este runtimeActualice TDC, o baje la versión declarada
TDC010Bajo <tdc> hay una etiqueta que no es <env> ni <block>Muévala dentro de una de las dos
TDC013Una etiqueta está anidada donde no se permiteVer Etiquetas: qué puede contener qué
TDC014Una etiqueta que necesita hijos se escribió autocerradaEscriba <env …></env>, no <env …/> — sus hijos se perderían en silencio
TDC015Una etiqueta lleva un atributo que el motor no leeLa corrida se detiene: el config pidió algo que no iba a obtener. Revise la escritura — el mensaje sugiere el nombre real más cercano
TDC020count no es un entero no negativocount="1000"
TDC021Un patrón inject sin hueco, o con más de unoUn % es el hueco sólo donde tiene texto a AMBOS lados, y un marcador tiene exactamente uno: inject="[[%]]". Ninguno ("%%", "%x", sin %) y no se sustituye nada; varios ("[%]-[%]") y sólo se lee el de la derecha, quedando los otros como un % literal que su texto no contiene. inject="%{%}%" es válido: sólo cumple su % central

Secuencias

CódigoCuándo saltaQué hacer
TDC030Una etiqueta que necesita nombre no lo tieneAgregue name="…"
TDC031Un nombre de secuencia empieza con _Ese prefijo está reservado a los integrados
TDC032Dos secuencias comparten nombreRenombre una — la referencia sería ambigua
TDC033Un nombre choca con un integradoElija otro; el integrado siempre gana
TDC034Un valor de parent no es Padre.ValorUse las dos partes, p. ej. parent="Gender.Male"
TDC035La secuencia padre se declara después de estaSuba el padre — la resolución va de arriba abajo
TDC214parent= nombra una secuencia compuestaEl padre se filtra por el valor que produjo, y un grupo de campos no produce ninguno
TDC036Un <sequence> no tiene <gen> dentroSin generador una secuencia no produce nada
TDC110retirado — un <gen> sin nombre junto a uno con nombre ahora compone el valor en vez de fallar
TDC111Dos campos de una misma compuesta comparten nombreRenombre uno
TDC129Un <sequence> dentro de una etiqueta de nivel config no da nada útil allíVer Secuencias

Generadores

CódigoCuándo saltaQué hacer
TDC040<gen> no tiene typeAgregue type="…" — ver Generadores
TDC041El tipo es desconocido, o no se admite en un <gen> en líneaRevise la escritura; TDC sugiere el nombre más cercano
TDC050type="text" sin valueDé la lista, p. ej. value="a,b,c"
TDC051Un percent tiene más entradas que la lista valueUn porcentaje por valor
TDC052Una entrada de percent no es un número no negativoLas posiciones llenas son números; una vacía reparte el resto
TDC053Los valores de percent no suman 100Ajústelos a 100, o deje una posición vacía para el resto
TDC060type="file" sin srcApunte src al archivo
TDC061El archivo no se puede leerRevise la ruta — se cuenta desde el config, o use --data-path
TDC062column no se resuelveUn nombre de cabecera (column="email") o un índice desde 1 (column="2")
TDC064row sin columnEl enlace por fila necesita saber de qué columna del CSV tomar
TDC065type="http" sin srcApúntelo al servicio — src="http://127.0.0.1:5566/gen"
TDC066src no es una URL http(s)Use http://… o https://…, con host y ruta
TDC067in= no nombra nada declarado antesEl valor enviado por fila viene de una <sequence> anterior
TDC068on_error no es fail ni emptyfail (por omisión) detiene la corrida; empty deja la celda vacía
TDC069timeout no es un número positivo de segundostimeout="30" espera treinta segundos por una respuesta; omítalo para el valor por omisión de 30
TDC070type="template" sin valueDé la dirección con puntos, p. ej. value="person.lastName"
TDC071La dirección de plantilla es desconocidaRevise la escritura, o instale el pack que la provee
TDC072value="date.range" sin range, o un parámetro de type="template" que el pack no declaraAgregue range="…"; o revise el nombre del parámetro — el mensaje lista los válidos
TDC073Un range heredado no son dos fechas válidasUse YYYY.MM.DD - YYYY.MM.DD
TDC081Un rango numérico está mal escritovalue="10..99"
TDC082first_zero no es true ni falseNo hay otros valores
TDC083length no es un número, un rango ni una lista con comasp. ej. length="8", length="6..9", length="4,6,8"
TDC084Un percent sobre un value numérico tiene más entradas de las que el rango admiteUn porcentaje por valor
TDC085Una entrada de percent sobre un número no es un número no negativoLas posiciones llenas son números
TDC086percent sobre un número no suma 100Ajuste los valores a 100
TDC087include/exclude sin rango numérico en valueFiltran un rango, así que el rango debe existir
TDC088distribution se combina con un atributo incompatibleUna distribución con nombre define ella misma el sorteo
TDC089Los parámetros de la distribución están malVer Distribuciones
TDC090Un atributo que debe ser número no lo esRevise el valor
TDC095type="regex" sin valueEl patrón va en value
TDC096regex_max_length no es un entero positivop. ej. regex_max_length="64"
TDC097La expresión regular no parseaCorrija el patrón — sigue el mensaje del propio parser
TDC098A type="symbol" se le dan value y alphabet, o ningunoDé exactamente uno — un conjunto en value o un alphabet con nombre
TDC099El alfabeto con nombre es desconocidoVer Symbol
TDC128type="advanced_regex" sin valueEl patrón va en value
TDC128(segundo significado) default= o if= escritos en un <case>Un <mix> elige su caso por porcentaje y un <switch> por la clave is: ninguno pregunta una condición. Para valores por condición use una <sequence> con ramas <gen if="…">
TDC130El patrón avanzado no parseaVer Advanced regex

Expresiones en if

CódigoCuándo saltaQué hacer
TDC100La expresión no parseaVer Salida y formato
TDC101Un operador binario no está admitidoAdmitidos: == != === !== < > <= >= && || + - * /
TDC102Un operador unario no está admitidoAdmitidos: !, -, +
TDC103Se usa acceso calculado a un miembroSolo se permiten nombres simples
TDC215Un nombre en un if= que ninguna secuencia tieneSe lee como su propio texto: solo, la rama siempre se activa; comparado, nunca
TDC216(advertencia) una rama que nunca puede dispararse: if="Seq.Value" o if="Seq == Value" con un valor que la secuencia nunca produce; <case is="…"> o una clave de <map> fuera de la lista del sujeto; parent="Seq.Value" sobre un valor que no ocurreLa rama está muerta. Advertencia y no error: acotar la lista a propósito es algo que se hace
TDC217Una ruta de plantilla existe, pero no para la configuración regional de la corridaEl mensaje nombra la configuración regional; ponga local= en el <gen> o el <env>, o elija una ruta que su configuración regional traiga
TDC218uniq="true" en una secuencia sin valores propios — <compute> lee otras, if= elige una rama por fila, y running/stat/formula/un desplazamiento de fecha se calculan en vez de sortearsePonga uniq= en las secuencias que lee, o envuélvalas en <uniq>
TDC219Un <compute> y un <gen> en la misma <sequence> — uno de los dos se descartaríaMueva el <compute> a su propia <sequence> y lea la sorteada con <field>
TDC220uniq="true" sobre un valor compuesto que junta dos o más partes sorteadasLas partes no tienen ancho fijo, así que un conjunto único de partes no da un string único: 9+15 y 91+5 son los mismos tres caracteres. Deje una sola parte sorteada, o fije los anchos
TDC221(advertencia) Un <uniq> o <distinct> alrededor de menos de dos <sequence>Un grupo restringe a sus miembros entre sí, así que un solo miembro no restringe nada. Agregue un segundo, o escriba uniq="true" en la secuencia misma

<pool>

Ver Registros coherentes.

CódigoCuándo saltaCómo arreglarlo
TDC222Un <pool> sin name, o sin countUn pool se lee por nombre y tiene un número fijo de miembros: <pool name="Doctors" count="30">
TDC223Un <pool count="…"> que no es un entero de al menos 1Un pool vacío no tiene ningún miembro que entregar
TDC224<gen type="pool" value="X"> sin ningún <pool name="X"> declaradoEl mensaje enumera los pools declarados. Declárelo en el mismo <env>
TDC225filter="field == X" donde los dos lados nunca pueden coincidirAmbas listas están escritas en la configuración y no se cruzan, así que cada fila se reduce a ningún miembro. El mensaje nombra las dos. Aquí solo se informa la contradicción segura; un valor que simplemente sale poco se rechaza en la fila que lo saca
TDC226filter= lee Pool.field y el pool no tiene ese campoEl mensaje enumera los campos del pool. Un nombre desconocido sin cualificar se deja pasar: el lenguaje de expresiones lee una palabra suelta como literal
TDC229${{Ref}} donde Ref sortea un miembro enteroUn miembro es un registro, no un valor. Lea un campo: ${{Ref.lastName}}
TDC230Un <block>, una etiqueta de formato u otro <pool> dentro de un <pool>Un pool es una tabla que otras columnas leen, no algo que se escriba en un archivo, y los pools no se anidan
TDC231(advertencia) Un <pool> que ningún <gen type="pool"> leeSe construye entero antes de la primera fila y se mantiene en memoria todo el run, así que uno sin leer se paga y se tira. Léalo o quítelo
TDC232Un nombre en filter= que es a la vez campo del pool y secuenciaRenombre uno de los dos. Cualificar un lado no ayuda: el otro nombre sigue leyéndose como el campo del miembro, así que la comparación sería consigo misma
TDC234(advertencia) Más de 100.000 miembrosUn pool se mantiene en memoria toda la ejecución — unos 320 bytes por miembro con cuatro campos. Si quería decir el número de FILAS, eso es count en <env>
TDC235Más de 1.000.000 de miembrosLa misma causa, pasado el punto en que vale la pena ejecutarlo. Reduzca el pool, o mueva el número a <env count="…">
TDC236Un pool lee un pool declarado más abajo, o a sí mismoLos pools se construyen en orden de declaración, así que un pool solo puede leer los que están por encima. Suba el que lee. Ese mismo orden es la razón por la que un ciclo entre pools no se puede escribir
TDC241Dos pools declarados con el mismo nombreA un pool se llega por su nombre, así que dos no pueden compartirlo. El segundo reemplazaba al primero en silencio, y la única señal era un TDC193 en el bloque sobre un campo que «no existe»
TDC242anomaly o missing no es un número en [0, 1]Ambos son una PROPORCIÓN de los valores: anomaly="0.05", missing="0.1"
TDC243anomaly sobre una lista value sin ningún númeroUna anomalía multiplica un número, así que una lista de palabras vuelve sin cambios
TDC246anomaly_flag en un <gen> dentro de un <case>El cuerpo de un caso son varias partes unidas, así que una marca en una parte no describe la fila: ponga flag="NOMBRE" en el <mix>
TDC247step en un <gen type="date"> no es un paso que pueda recorrer, o mezcla una unidad de calendario con una fijaEscriba 15m, 1h30m, 2d, 3mo, 1y — unidades s, m, h, d, w, mo, y; un número solo significa días
TDC248step sin order="sequential" en el mismo <gen>Nadie recorre el rango: las fechas se siguen sorteando al azar. Añada order="sequential" o quite step
TDC249weekdays nombra un día de la semana que no existesun, mon, tue, wed, thu, fri, sat — un rango mon..fri o una lista sun,wed
TDC250weekdays con un paso de un número entero de semanas, o un paso de calendarioDos razones bajo un mismo código. Un número entero de semanas fija el día de la semana, así que el filtro coincidiría con todas las filas o con ninguna. Un paso de calendario hace lo contrario — 1mo recorre jueves, domingo, domingo, miércoles — así que qué filas sobreviven lo decidiría el calendario y no la configuración
TDC252peak_at en un <gen type="timeseries"> no es un númeropeak_at es la fila en la que la onda estacional alcanza su máximo, contada como period: peak_at="182" con period="365" pone el pico el primero de julio
TDC253peak_at sin period en el mismo <gen>Una onda necesita un largo antes de poder tener un punto más alto. Añada period, o quite peak_at
TDC251(advertencia) Una proporción de percent pide menos de una fila enterapercent es una cuota exacta sobre las filas que llegan a ella, así que el 10 % de un subconjunto de cinco filas pide medio registro. Medio registro no se puede emitir: la rama dispara una vez o ninguna, y lo decide el seed. Suba la proporción, o suba count
TDC254Un recorrido sin paso: un repeat="2..5" por rango junto a order="sequential", o una date recorrida con cualquier repeat=Un repeat="4" fijo sí funciona: la fila toma cuatro valores del recorrido. Uno por rango no tiene un número fijo de valores por fila, así que la fila 5 empezaría donde las filas 0 a 4 hubieran acabado. Y una fecha recorrida lleva un instante junto a su texto, y una fila con varias fechas no tiene uno solo que dar a of= y plus=
TDC255decimals= junto con include= o exclude=Deje uno. Un conjunto formado por include/exclude contiene números enteros y la elección es uniforme entre ellos, así que no hay nada fraccionario que redondear — el motor emitía enteros en silencio
TDC256Una máscara sin patrón — <mask> sin pattern=, o ${{X|mask}} sin argumentoDéle un patrón. Sin él la máscara no conserva nada y devuelve la cadena vacía, así que la columna sale en blanco
TDC257Una expresión if= llama a una función que no existeO es una errata, y entonces se ofrece el nombre cercano, o es una de sin, cos, exp, log y afines, y entonces se da la razón: cada lenguaje anfitrión las calcula un poco distinto, y una comparación convierte el último bit en otra fila. Hoy están: abs, ceil, floor, max, min, round, trunc
TDC258Una función de una expresión if= recibe un número de argumentos equivocadoabs, ceil, floor, round y trunc toman exactamente uno; min y max toman los que les dé
TDC259Una [lista] está en un sitio que no es la derecha de inUna lista es un conjunto de valores contra el que comparar, así que solo significa algo como Country in [US, CA, MX]. Por sí sola no le da ningún valor a la condición
TDC260at() recibe algo que no es una listaUna lista de repeat llega a la expresión como su texto unido, así que at(Items, 1) pide el segundo elemento de una lista de uno y responde con nada. Córtela primero: at(split(Items, ","), 1)
TDC261at() recibe un índice que no lo esUn índice es un número entero, cero o más. Pasado el final el resultado es texto vacío a propósito — las filas de repeat="1..4" tienen longitudes distintas — pero -1, 1.5 y "one" son errores, y cada uno producía esa misma columna en blanco
TDC262<gen type="stat"> no dice qué resumir (of=) ni qué estadística (op=), o nombra una que no existeUna estadística lee otra columna y no genera nada propio, así que ambas son obligatorias. op= es una de sum, mean, median, min, max, count, stddev; decimals= va de 0 a 10
TDC263${{Name}} en un atributo que no lo expandeLa interpolación llega al texto dentro de <data> y a <gen type="template" value=>, y a ningún otro sitio — en cualquier otro las llaves son caracteres literales. Para que una columna dependa de otra, léala en una condición if= o construya el valor en una secuencia <compute>
TDC264<gen type="date" of="…"> está mal escritoUn desplazamiento necesita plus= (7d, 3..10d, 1..3mo, -10..-3d), con el límite menor primero y en una unidad que step= también usa. Los atributos que acotan el sorteo PROPIO del generador — value, from, to, range, oldest, youngest, order, step — no dicen nada una vez que of= ha situado la fecha respecto a otra columna, así que se rechazan en lugar de ignorarse. El caso simétrico también se rechaza: un plus= en una fecha sin of= no tiene de qué distanciarse
TDC265<assert> no tiene condiciónUna aserción es la única construcción cuyo valor entero está en que FALLE, y sin that= no puede hacerlo nunca. Escribe la propiedad que la ejecución debe cumplir, en el lenguaje de if=, sobre columnas iguales en toda la ejecución
TDC266<assert> no tiene mensajesays= es lo que lee una persona meses después, en un log de CI. Una expresión sola la deja reconstruyendo qué estaba defendiendo
TDC267(segundo significado) uniq="true" en una <sequence> que envuelve un <distinct><distinct> repara un registro para que sus campos difieran; uniq luego reordena las columnas terminadas y no sabe qué combinaciones descartó la reparación, así que la deshace. Quédese con uno — o dé a cada campo su propia <sequence>, envuélvalas en <uniq> y ponga el <distinct> a nivel de env
TDC267uniq="true" junto con mask=, case=, missing=, repeat=, separator= o anomaly=Un sorteo sin reemplazo produce la columna directamente y nunca llega a la capa que reescribe los valores, así que el atributo solo podía perderse. Aplicarlo rompería la otra promesa: una máscara lleva dos sorteos distintos a los mismos caracteres
TDC268if= en un <gen type="pool">Una referencia publica un REGISTRO entero, y un <gen> con if= pasa a ser una rama condicional que el resolutor de pools no reconoce — no se registraba ninguna columna Ref.field y ${{Ref.name}} llegaba a la salida como su propio texto literal. Para dejar filas sin miembro, use parent=
TDC269if= en un <gen> dentro de un <case>El cuerpo de una rama son varias partes unidas en un solo valor, así que una condición sobre una parte no tiene valor al que replegarse. Se aceptaba y se ignoraba, y la parte aparecía en todas las filas — incluidas las que la condición excluía. Ponga la condición en la rama: <case if="…">
TDC270<tdc> tiene un segundo <env> o <block>Ambos se leen tomando el PRIMERO de su clase, así que un segundo se descarta entero — con cada secuencia que declara y cada línea que dispone — mientras la corrida termina como si nada. Se informa sobre el segundo
TDC271percent= junto a order="sequential"Recorrer la lista en orden fija qué valor recibe cada fila, así que no queda cuota que repartir. El porcentaje se aceptaba y se descartaba: percent="98,1,1" sobre cien filas daba 34 / 33 / 33
TDC272(advertencia) <env local=…> nombra un locale sin traducciones de fechasEl locale es una buena fuente de NOMBRES y no trae nombres de meses, así que las fechas salen en inglés. En <gen type="date" local=…> se rechaza (TDC153) y aquí callaba hasta ahora. Solo salta si el formato lee el locale: format="YYYY-MM-DD" es igual en todos los idiomas
TDC273un argumento que el filtro no puede usarslice:5,2 termina antes de empezar y vacía la columna; slice:abc, group:abc, group:0, compact:1 y compact:99 dejan el valor intacto. group y compact SIN argumento conservan sus valores por defecto documentados (3, base 36)
TDC274un argumento en un filtro que no lee ningunotrim, sql, upper, lower, capitalize y title son transformaciones completas; ${{X|trim:junk}} ignoraba junk en silencio. Encadena en su lugar: ${{X|trim|upper}}
TDC275replace sin nada que buscar${{X|replace}} y ${{X|replace:,to}} no cambian nada. Escribe las dos partes: ${{X|replace:from,to}}
TDC276un parámetro clavado con el ancho equivocadoUn identificador con dígito de control tiene un diseño fijo, así que una parte de otro ancho lo rompe en vez de desplazarlo. usa.finance.aba_routing prefix="12345" abortaba la ejecución; tail="678" escribía un número de seis dígitos que no lo es. Solo se informa donde el ancho se puede DEMOSTRAR a partir del cuerpo del propio paquete
TDC277decimals= sin rango que redondearSin value= el generador produce una cadena de DÍGITOS — un identificador — y no hay nada que redondear. <gen type="number" length="4" decimals="2"/> emitía 4566, 5773, 5192
TDC278decimals= junto a length=Un valor fraccionario no tiene ancho entero al que rellenar, así que el descartado era length=: value="1..9" length="3" decimals="2" emitía 3.78, 2.89
TDC279first_zero="false" que el rango no puede cumplirTodo valor de 0..5 es de un dígito, así que una escritura de tres siempre rellena. El generador volvía a sortear cien veces por fila y emitía la forma prohibida igualmente: 005, 002, 003. Solo se informa donde el rango lo DEMUESTRA
TDC280dos grafías del mismo rango de fechasvalue=, el par from/to y range= dicen lo mismo, y el generador los lee en ese orden y se detiene. value="2020-05-05" from="1990-01-01" to="1990-12-31" producía 1990-05-11 y descartaba el resto sin decir nada. value="today", "now" y "birth" también son grafías
TDC281un rango de fechas que termina antes de empezarEl sorteo tomaba el mínimo y el máximo de los dos extremos, así que from="2020-01-01" to="2010-01-01" producía fechas plausibles de un rango que nadie escribió. plus="10..3d" se rechaza como errata en vez de intercambiarse desde que se escribió; esta es la misma errata
TDC282order="sequential" solo en algunos miembros de un enlace row=Póngalo en todos los miembros del enlace, o quítelo — un enlace mixto deja de leer una sola línea por registro
TDC283anomaly_flag en un <gen> que es solo una parte de su <sequence>La bandera registra QUÉ FILAS recibieron un valor atípico, y una secuencia construida con varias partes — un segundo <gen>, un literal <data> o un name= que convierte este <gen> en un campo — no tiene dónde poner esa columna. Mueva el <gen> a su propia <sequence>; así también obtiene el valor como columna propia. El mismo razonamiento que TDC246, un nivel más arriba
TDC284(advertencia) secret= escrito dentro de la configuración, o vacíoUna clave dentro de la configuración viaja a donde viaje ella — al control de versiones incluido. secret="env:TDC_HTTP_SECRET" la lee del entorno, secret="file:~/.tdc/service.key" de un archivo que el repositorio no guarda. Un literal es una ADVERTENCIA, porque un servicio en 127.0.0.1 por una tarde es un uso real; secret="" es un error, porque firmar con nada produce una firma que cualquiera puede falsificar
TDC285Un atributo del dibujo cuyo valor no es ninguna de sus palabras, ni un númeromode=, interp=, spread= y decimals= solo se leían en la corrida, así que check llamaba válido a mode="banana" y la corrida lo rechazaba — el único lugar donde check no respondía «¿esto correría?». Se admiten: `mode="signal
TDC286<is_digit> o <encode> recibió <field name="_count"> o <field name="_total">Esos dos campos llegan como NÚMEROS; ambas etiquetas quieren un carácter de texto. <is_digit> respondía «no» en todas las filas — incluidas aquellas en las que el conteo sí es un solo dígito — y check no decía nada; <encode> detenía la corrida con «expected a single-character string», sin nombrar archivo ni línea, en un config que check también llamaba válido. Compare el número con <equals> o <less_than>, envuélvalo en <concat> para <encode>, o ponga el carácter que quiere decir en un <str>
TDC287<equals>, <greater_than> o <less_than> recibió un literal <str> que no es un númeroLas tres comparaciones trabajan con números. Un <str> con dígitos se lee como el número que deletrea — <equals><str v="7"/><int v="7"/></equals> es verdadero — así que solo se rechaza el literal que no es un número. Antes ese detenía la corrida con «expected an integer in <equals>, got the string …», sin nombrar archivo ni línea, en un config que check llamaba válido. Solo se revisan los literales: lo que tendrá un <field> no se sabe antes de la corrida
TDC288<var> — la etiqueta se renombró a <use>Nunca declaró nada: <let> liga un nombre y esta lo vuelve a leer, que es lo que dice el nombre nuevo. Sin un rechazo propio, la grafía antigua caía en «etiqueta de compute desconocida», que dice que está mal escrita pero no cuál es la correcta. El atributo name= no cambia
TDC289distinct= recibió algo que no es true ni falseEl atributo tiene dos formas y ningún tercer significado. Tratar una palabra desconocida como false dejaría una configuración que pide valores distintos y obtiene repeticiones en silencio
TDC290distinct= sin repeat=Un valor no puede repetirse a sí mismo, así que el atributo se leería y no haría nada. Añada repeat="N" o repeat="A..B", o quite distinct=
TDC291percent= y distinct= en el mismo <gen>percent= promete proporciones exactas sobre toda la ejecución; distinct= cambia esa promesa por una garantía dentro de cada fila. Ambas no pueden sostenerse, así que ninguna se descarta en silencio. Para proporciones sobre las LONGITUDES de las listas, póngalas en un <mix> o <switch> por fuera, con repeat= en el <gen> de dentro
TDC292repeat= bajo distinct= pide más valores de los que la lista puede ofrecerCinco valores no pueden dar seis distintos. Se informa antes de la ejecución cuando el conjunto está en la configuración (type="text", un rango de enteros, un conjunto symbol de un carácter); en tiempo de ejecución cuando no lo está (un archivo de pack, una columna CSV, una regex), ya que solo se leen al generar
TDC293<gen type="pattern"> sin y_range=Un dibujo no trae escala propia: la misma curva sale de una herramienta en coordenadas 0..100 y de otra en 0..10002345345. y_range="min..max" dice qué significan esas coordenadas: se convierte en el piso y el techo del lienzo del dibujo. Sin él toda respuesta sería una conjetura sobre los ajustes de exportación de alguien más, así que el atributo es obligatorio y no se supone
TDC294<gen type="formula"> sin expr=, con un expr= que no se analiza, o un decimals= fuera de 0..10Una fórmula ES su expresión, así que sin ella no hay nada que calcular. La expresión es el mismo lenguaje que if=, vea Expresiones. Un nombre dentro de ella que no sea una columna declarada arriba da TDC240, el mismo código que usan running y stat para la misma regla
TDC295if= en una columna running, stat, formula o un desplazamiento de fechaSe construyen una vez, para toda la corrida, en orden de declaración — un if= pide un valor elegido fila por fila, y ambas cosas no pueden ser ciertas a la vez. Ponga la condición donde el valor se USA (<data if="…">), o calcule la columna sin condición y ramifique después
TDC296Una columna running, stat, formula, una fecha medida desde otra o un <compute> dentro de <uniq> o <distinct>Un grupo REORDENA columnas ya terminadas hasta que cada registro sea único. Un valor sorteado significa lo mismo dondequiera que caiga; uno calculado describe la fila para la que se calculó, así que moverlo deja mal la aritmética. Pon el grupo alrededor de las columnas que esta LEE y deja la calculada fuera: seguirá a lo que el grupo ordene
TDC297Dos lecturas de un mismo archivo a la vez — read="quantile" junto a weight=, row= u order="sequential"; un read= mal escrito; sample= sin élweight= guarda las proporciones en una segunda columna, row= enlaza varias columnas a una LÍNEA, order="sequential" recorre la lista en orden, y read="quantile" dice que los valores SON la distribución y que una fila cae en cualquier punto de la muestra ordenada. Quédese con una lectura: lo contable quiere weight= y su cuota exacta, lo medido quiere la lectura por cuantiles
TDC298Una misma clave row= sobre dos archivos distintosUn enlace es una LÍNEA de un archivo, así que no hay línea que pertenezca a ambos. Apunte a todos los miembros del enlace al mismo src=, o dele a este su propia clave row=
TDC299(advertencia) uniq="true" sobre más de 100 000 filasCumplir una promesa sobre la columna terminada cuesta memoria que crece con count, en cualquier motor: el coste pertenece a la promesa, no a uno de ellos. Unos 250 bytes por valor, medido: 2 000 000 de filas cuestan unos 477 MB, y un uniq compuesto mide aún más. Una sola columna sacada paga dos veces, porque sacar sin reemplazo no se puede hacer fila a fila, así que además se ejecuta en memoria diga lo que diga mode=. Funciona; conviene hacerlo a conciencia
TDC300Un fit= que no es una banda, que va de mayor a menor, o que acompaña a points=/upper=/lower=fit="bajo..alto" dice en qué se convierten el punto más bajo y el más alto del propio dibujo sobre el eje de valores: así se coloca una curva leída de src=, ya que un archivo lleva una forma y ninguna unidad. Dos números, el menor primero; dar la vuelta al dibujo es otra petición. Junto a puntos escritos a mano se rechaza: allí 80 ya significa el 80% de y_range, así que no queda nada que colocar. Omítelo y el dibujo llenará todo el y_range
TDC301(advertencia) Una lista de proporciones que deja un valor declarado en 0%Un percent más corto que value está bien: lo que sobra va a las posiciones que no escribió, así que value="a,b,c" percent="30,40" le da a c los 30 restantes. Cuando las proporciones escritas ya suman 100 no sobra nada, y ese valor queda declarado y no puede salir nunca: percent="50,50" sobre 300 filas dio 150 a, 150 b, ningún c. Un cero que usted mismo escribe — percent="50,0,50" — se toma al pie de la letra y no dice nada
TDC302Un <distinct> o <uniq> sobre referencias <gen type="pool"> en una forma que no puede significar nada: una referencia junto a una secuencia corriente, referencias a dos pools distintos, o más referencias que miembros tiene el poolUn grupo sobre referencias compara QUÉ MIEMBRO tomó cada fila, así que debe haber algo comparable y miembros suficientes. Las tres formas se aceptaban y no hacían nada
TDC303Un missing_when= que no decide nada: sin condición, sin la tasa missing= al lado, o sobre una celda con repeat=La condición es la que nombra el mecanismo — missing_when="Age < 30" es MAR, missing_when="_value > 150000" es MNAR —, así que una escrita y vacía es una pregunta a medio hacer, y una sin tasa no tiene sorteo que condicionar. Una celda repetida guarda varios valores en una fila mientras la condición pregunta por uno; en vez de adivinar qué lectura quería, se rechaza. Las tres se aceptaban en silencio y no hacían nada
TDC304Listas estacionales que no cuadran: amplitude= o peak_at= con distinta cantidad de entradas que period=, o un 0 entre varios períodosperiod="7,365" amplitude="120,400" peak_at="5,182" describe las mismas dos ondas tres veces, posición por posición, así que una longitud que no cuadra no describe ninguna onda — la entrada sobrante se descartaba en silencio. Una sola amplitude para ondas de igual altura es la única abreviatura. period="0" solo significa «sin onda estacional»; entre varios es una onda sin largo junto a ondas que sí lo tienen
TDC305Un noise_correlation= que no se puede honrar: fuera de −1..1, o sin noise= al ladoEs cuánto ruido de una fila pasa a la siguiente. En 1 la serie se iría y no volvería — una caminata aleatoria, no ruido — y por encima de 1 crece sin límite; los dos se rechazan en vez de recortarse. Sin noise= no hay nada que correlacionar, y el atributo no decide nada
TDC306Un <assert> que lleva a la vez that= y each=Responden a preguntas distintas y se comprueban un número distinto de veces: that= una vez, sobre valores de la ejecución entera, y each= en cada fila. Una sola etiqueta con ambos deja a quien lee sin saber a cuál de las dos se refiere la frase de says=. Escriba dos aserciones, cada una con su propio says=, para que un fallo diga cuál se rompió
TDC307distinct="true" junto a order="sequential"distinct= toma los valores de la fila sin reemplazo, y una fila que camina no toma nada: sus valores los decide su posición. Cumplir ambos es imposible, e ignorar uno en silencio es como una configuración acaba afirmando algo que nunca tuvo
TDC308Una condición en un <gen>if= o missing_when= — que nombra una columna declarada más abajoLa condición se resuelve mientras se construye esta columna, así que una columna posterior todavía no existe. Los dos motores no coincidían en qué hacer con eso, y ambas respuestas eran defendibles: el motor en memoria la leía vacía y la condición nunca se cumplía, mientras que el de flujo construía la columna bajo demanda y la condición se cumplía de verdad. Mueva la <sequence> que nombra por encima de esta. Una condición leída cuando la fila ya está terminada — <data if=>, <line if=>, <assert that=> — puede nombrar cualquier columna
TDC244type="pattern" sin points, src ni upperUn dibujo necesita una forma de la que leer: points="0,0 1,5 2,3", un archivo en src, o upper/lower para una banda

Tres números de este rango se reservaron mientras se diseñaban los pools y quedarán sin usar, así que los huecos están declarados en vez de quedar en silencio:

  • TDC227 — un filter= que nombra una columna que no existe. Una palabra suelta en el lenguaje de expresiones siempre ha sido un literal de texto, y eso es lo que usa filter="clinic == North" para decir «solo los del norte». Un error de tipeo y un literal se escriben igual, así que la comprobación pondría un error sobre configuraciones que funcionan. Donde el literal es un error seguro — ningún miembro podría tener ese valor — lo dice TDC225, sin adivinar.
  • TDC228 — un ${{Pool.campo}} que llega al pool sin pasar por una referencia. TDC193 ya lo reporta como un nombre que no resuelve a nada, y un segundo código para la misma frase no vale el número.
  • TDC233 — ningún candidato pasó el filter= en la fila N, para expresiones más ricas que una igualdad simple. Ese rechazo ocurre y vale la pena tenerlo; solo que no es un código de diagnóstico. Compara contra un valor que solo existe cuando la fila ya se está construyendo, así que pertenece a la corrida, y el mensaje de la corrida nombra la fila y el valor con el que nadie coincidió.

Totales acumulados

Véase accumulate= y <gen type="running">.

CódigoCuándo saltaCómo se arregla
TDC237accumulate= en un generador sin repeat=No hay nada que acumular: no hay lista. Agregue repeat="N" o quite accumulate=. (type="running" es la excepción: acumula por columna)
TDC238accumulate= nombra una operación que no existeUna de sum, min, max
TDC239<gen type="running"> no dice qué (of=) ni cómo (accumulate=) acumularUn total acumulado lee la columna de otro y no sortea nada por su cuenta, así que ambos son obligatorios
TDC240of= o reset= nombra una columna que no está declarada más arribaEl total se arma con una columna que ya existe — la misma regla que tiene parent=

<compute>

CódigoCuándo saltaCómo arreglarlo
TDC180Una etiqueta dentro de <compute> que el lenguaje de cálculo no tiene, o un predicado escrito fuera de <test>El mensaje nombra la etiqueta. Contrástela con el Lenguaje de cálculo — un predicado como <eq> solo vale dentro de <test>
TDC181<current>, <current_index> o <acc> fuera de su cuerpo de iteraciónSolo existen dentro de un <do> (o el <do> de un <reduce>)
TDC182<use name="X"> no nombra ningún <let> que lo envuelvaEnvuélvalo en <let name="X">…</let>, o corrija el nombre
TDC183Una operación de compute que toma exactamente dos operandos recibió otro númeroSolo <divide> y <mod> son binarias — un tercer operando no significa nada ahí. <add>, <subtract> y <multiply> son variádicas: <add> sobre tres operandos suma los tres, y sin operandos da 0 (<multiply> da 1)
TDC184<choose> no tiene rama <otherwise>Agregue <otherwise> — cada registro necesita una respuesta
TDC185Un <let name="X"> tapa una vinculación externa del mismo nombreRenombre una — la interna ocultaría la externa
TDC186<encode>: codificación desconocidaUna de: base36, ascii, unicode, hex, binary, octal
TDC187A un predicado le falta su hijo envoltorio<when> quiere <test>, <choose> quiere <then> — el mensaje nombra el par
TDC188<int v="…"> no es un número enteroEscriba un entero; para texto use <str v="…"/>
TDC189<compute> tiene más de un <result>Deje un solo <result> — los anteriores se descartarían

<mix>, <switch>, fixtures

CódigoCuándo saltaQué hacer
TDC120<mix> no tiene ningún <case>Una mezcla necesita ramas entre las que elegir
TDC121Un percent sobre un <mix>/<switch> tiene más entradas que casosUn porcentaje por caso
TDC122Una entrada de percent sobre un <mix>/<switch> no es un número no negativoLas posiciones llenas son números
TDC123percent sobre un <mix>/<switch> no suma 100Ajuste los valores a 100
TDC124<mix> tiene un hijo que no es <case>Allí solo puede ir <case>
TDC125<case> tiene un hijo desconocidoSe permiten <data>, <gen>, <mix>, <switch> — un <switch> anidado dentro de una rama es un constructo de pleno derecho (véase TDC245)
TDC131Una fixture lleva una etiqueta que no acepta, o un <data> sin <line> alrededorEl cuerpo de una fixture se compone de <line>. Un <data> suelto validaba y no renderizaba nada
TDC132Dentro de <line> hay una etiqueta que no correspondeEl bloque de salida es disposición; los generadores viven en <env>
TDC133<switch> no tiene onNombre la secuencia sobre la que se conmuta
TDC134on nombra una secuencia, o un campo suyo, que no existeRevise el nombre — el mensaje dice cuál de las dos mitades falla
TDC135<switch> no tiene entradasAgregue <map>, <case> o <default>
TDC136(advertencia) Una fila de <map> no es CLAVE:VALOR — la fila mala se omite y el resto del mapa sigue aplicandoUn par por entrada, separado por dos puntos
TDC137Un <case> dentro de <switch> no tiene isis es la clave de la rama
TDC245name en un <switch> escrito dentro de un <case>La forma anidada aporta un valor a esa rama; solo un <switch> a nivel de <env> se convierte en columna

Fechas

CódigoCuándo saltaQué hacer
TDC150Solo se dio uno de from / toAmbos extremos o ninguno
TDC151El valor de fecha no parseavalue="2020-01-01..2025-12-31", "birth", "today", "now"
TDC152Un token de format es desconocidoVer la tabla de tokens
TDC153local nombra un locale sin datos de fechaVienen veinticuatro: ar, cs, de, el, en, es, fi, fr, hi, hu, id, it, ja, ko, nl, pl, pt, ru, sv, th, tr, uk, vi, zh-cn. Diecinueve responden también a un alias de tres letras (ara, ces, deu, ell, eng, spa, fin, fra, hun, ind, ita, jpn, kor, nld, pol, por, tur, ukr, vie); hi, ru, sv, th, zh-cn no tienen
TDC154precision no es un paso admitidoVer precision

Durante la generación

Estos surgen al generar, no al validar: el config es correcto, pero la combinación no se puede llevar a cabo.

CódigoCuándo saltaQué hacer
TDC160row="…" en un <gen> en líneaEl enlace por fila necesita un <sequence>
TDC161Se usan opciones ponderadas de advanced_regex en líneaLos porcentajes exactos se calculan sobre toda la columna — muévalo a un <sequence>
TDC162En un contador en línea value o step no es numéricovalue="1" step="2"
TDC170Un archivo de data pack no se puede cargarEl mensaje nombra el archivo — ver Escribir los suyos
TDC171(advertencia) Un archivo de data pack no obtiene dirección, así que se omiteAñada address: o locale: a su cabecera, o muévalo bajo una carpeta de locale
TDC200(advertencia) La estimación de memoria es una parte grande de la RAM de esta máquina — el run continúaPara conjuntos muy grandes use mode="disk", la memoria se mantiene plana
TDC201La estimación de memoria supera la RAM de esta máquinaBaje count, divida el run, o use mode="disk"
A tres de estos no se llega desde una configuración

TDC160, TDC161 y TDC162 describen un <gen> en línea — escrito directamente dentro de <line> en vez de en un <sequence>. La validación rechaza esa forma antes, con TDC131 (a <gen> is not allowed inside <line>) o TDC013, así que una configuración real nunca llega tan lejos. Solo se alcanzan por el export de bajo nivel render(parse(src).tree), que recorre un árbol sin validar a propósito. Por eso mismo no existen en los cuatro ports: compilan la configuración en un modelo donde ese <gen> no tiene dónde ir.

Formato y modificadores

CódigoCuándo saltaQué hacer
TDC190case no es una transformación conocidaupper, lower, capitalize, title
TDC191order no es random ni sequentialEsos son los dos
TDC192Un filtro de interpolación es desconocidoVer Máscaras y mayúsculas
TDC193${{Name}} o ${{Name.field}} nombra algo no declaradoSe imprimiría literal — se comprueba la referencia entera, campo incluido
TDC193(segundo significado) anomaly_flag= en un <gen> sin anomaly=La columna de marca señala qué filas se volvieron atípicas, y no se volvió atípica ninguna. Añada anomaly="p" o quite la marca
TDC194Un <data> tipado no tiene nameSolo un <data> con nombre se vuelve columna
TDC195repeat no es un número ni un rangorepeat="3" o repeat="1..5" (de 0 a 64)
TDC196repeat se usa en <mix>Una mezcla elige una rama; no produce una lista
TDC198separator sin repeatUne valores repetidos, así que tiene que haberlos
TDC199Un índice de mask está mal formadoLos índices empiezan en 0 y los rangos usan ..x[0..3], w[-1]
TDC202Hay flag pero ningún <case> marcado anomaly="true"La columna saldría toda en negativo — marque la rama atípica
TDC203flag en un <mix> anidadoSolo una mezcla con nombre a nivel <env> lleva la columna-respuesta
TDC204repeat en un generador que no puede repetirEl mensaje nombra el tipo
TDC206each="" no nombra ninguna secuenciaNombre la lista a recorrer
TDC207each nombra una secuencia de un solo valorTiene que ser una lista — agregue repeat en el origen
TDC209Un <data> con nombre dentro de una línea con each=Esa línea produce varias filas, y el nombre de columna queda ambiguo
TDC211weight en un generador que no es fileLos pesos vienen de una columna del CSV
TDC212weight sin columnLos pesos viven en una segunda columna, que hay que nombrar
TDC213weight junto con orderorder recorre las filas por posición; ponderar las elige por frecuencia

Vea también