# LT1 · «La ley y los datos» · Definiciones y aceptación previas Ejecutor: LT1 (Opus 5.5) · 22-oct-2026 · 0 tokens, 0 €, producción sin tocar. Escrito ANTES de calcular ningún cambio antes/después, ninguna serie mensual por órgano y ningún panel. md5 y hora en `DEFINICIONES_PREVIAS.md5`; copia sellada en `DEFINICIONES_PREVIAS.original.md` (444). Enmiendas solo al final (§12), fechadas y rotuladas ANTERIOR (antes del primer cálculo de efectos) o POSTERIOR, con motivo y efecto. Catálogo e hipótesis por norma: `CATALOGO_LEGAL.md` (escrito antes que esto, mismo criterio). **Qué se conoce al escribir esto** (declarado; puede contaminar hipótesis): - `salidas/01_cobertura.txt` y `03_cobertura2.txt`: recuentos por fuente × año × menor, % de importe sin IVA, % de NIF válido, tramitación por año. Ahí **se ve ya a nivel anual** que las adjudicaciones con tramitación de emergencia pasan de 797 (2019) a 29.986 (2020): la hipótesis de L12 sobre NM_EMER no es ciega (es un **control positivo**, por eso). - NE1 (umbrales de 2018: el amontonamiento se desplaza; 2/3 de la masa de 15.000-18.000 € vuelve como menor rebajado), BU1/BU2 (amontonamiento 2019-2025 estable), OU1 (oferta única anual 0,277 en 2018 → 0,359 en 2023), ES1 (cota baja de publicación en el DOUE por año, 66 % → 86 % en 2018-2025), EJ1 (modificaciones con fecha válida desde 2021). - Las series E-M2b (misma necesidad leída con modelos) son muestras de candidatas por año natural, con 2019 sin cerrar: **no son serie mensual** → «no medible» en todos los eventos, se dice. Vocabulario: «respuesta a la norma», «cambio medido», «repetición del adjudicatario», «tope por contratista». Nunca «troceo», «fraccionamiento», «fraude», «sospechoso» ni ranking. Nunca empresas, personas ni órganos con nombre en salidas. ## 1. Datos y universo - `unified_20261018` (`:ro`), `.vinculos/filas.parquet` y `parejas.parquet`, `.identidad/organos_filas.parquet`, `organos_tipo.parquet`, `.modificaciones/modificaciones.parquet`. - **Fila base**: `unidad='adjudicacion'`, `vigente`, `es_contrato`, **`NOT es_copia`** (= `copia_de IS NULL`, `correccion_imp_adj` ≠ 'copia_otra_fuente', `coalesce(cuenta, TRUE)` en vínculos por `source`+`id_canonical`), `tipo_contrato IN ('Servicios','Suministros','Obras')`, `fecha_adj` en [2012-01-01, 2026-09-30], con `organo_clave` (terna NIF-nombre-DIR3 con `IS NOT DISTINCT FROM`). - **Grupo**: **SS** = Servicios + Suministros de órganos **no** `agente_secti`; **SSI** = Servicios + Suministros de agentes SECTI; **O** = Obras (todos los órganos). Subgrupo «SSI sin salud» = SSI con `organos_tipo.tipo` ≠ 'salud'. - **Tipo de órgano**: AGE (`tipo='age'`) / no AGE. **Cataluña** (para L03 y L05): órgano cuya mayoría de filas PLACSP no menores en 2014-2019 tiene `ccaa` de Cataluña. - **Importe sin IVA** = `imp_adj_eur_comparable` con `> 0`, `iva_base IN ('sin','sin_medido')` y fuera ARAGON 'sin_medido'; si no, nulo (la fila cuenta en las series de recuento, no en las de importe). - **NIF del adjudicatario** = `adjudicatario_nif` con `adjudicatario_nif_valid`; si no, nulo (fuera de M_REP y M_1183). - **Menores** = `es_menor`, de todas las fuentes. **Deduplicado entre fuentes**: en cada evento, para cada (órgano, grupo), **una sola fuente**, la de más menores en los meses [d−18, d+18] (empate: PLACSP, después alfabético). En `series_mensuales.csv`, una fuente por (órgano, grupo, año natural) con la misma regla. - **No menores** = `source='PLACSP'` y `NOT coalesce(es_menor, FALSE)` (la PLACSP es la única fuente con procedimiento, tramitación, nº de ofertas y valor estimado comparables en toda la serie). **TED**: un lote PLACSP «está en el DOUE» si tiene pareja `ted__placsp_lic` o `ted__placsp_agr` en `parejas.parquet` (cota baja: ES1). - **Reloj**: mes de `fecha_adj`, salvo las series de decisión en la licitación (NM_OU, NM_URG, NM_SIMPL, NM_DOUE, NM_SARA), que usan el mes de `fecha_pub`. **Regla**: si en el tramo [d−18, d+18] más del 20 % de las filas de esa serie no tienen `fecha_pub`, se usa `fecha_adj` y se dice. ## 2. Calendario de los eventos - d = mes que contiene la entrada en vigor (catálogo). **Antes** = meses [d−12, d−1]; **después** = [d+1, d+12]; el mes d fuera. Datos hasta sep-2026: un evento con d+18 > 2026-09 es «no medible (ventana incompleta)». - Eventos medidos (con su d): L02a dic-2014 y L02b dic-2015 (Ley 19/2013), L03 jun-2016 (Cataluña DL 3/2016), **L05 mar-2018 (LCSP)**, L06 ene-2018, **L07 jul-2018 (DA 54.ª, diseño especial §5.2)**, **L08 feb-2019 (RDL 3/2019)**, **L09 mar-2019 (Instrucción OIReScon)**, L10 ene-2020, **L11 feb-2020 (RDL 3/2020)**, **L12 mar-2020 (COVID)**, **L14 ene-2021 (RDL 36/2020 + Ley 11/2020)**, L18 mar-2023 (Ley 2/2023, control negativo), L19 ene-2024. No medibles por diseño: L01, L04, L13, L15 (banda de 1.000 €), L16, L20 (ventana incompleta), L22 (no vigente), L23, L24, Tres presupuestos (L09) y E-M2b. - **Normas vecinas** (se dice en cada fila de `eventos.csv` qué otras normas caen dentro de [d−18, d+18]): el diseño mide el paquete; las vecinas más graves son L08/L09 (un mes), L11/L12 (un mes), L12/L14 (el «antes» de L14 es el año COVID). ## 3. Series (por celda órgano × grupo × mes: numerador y, si es razón, denominador) | Código | Unidad | Numerador | Denominador | Grupos | |---|---|---|---|---| | M_N | menor | nº de menores | — (recuento) | SS, SSI, O | | M_EUR | menor con importe sin IVA | Σ importe sin IVA | — (suma) | SS, O | | M_FRANJA | menor sin IVA, sin múltiplos exactos de 500 € | importe en [0,95u, u) | importe en [0,70u, u) | SS, O. u = 18.000 / 50.000 € con `fecha_adj` < 9-mar-2018; 15.000 / 40.000 € después | | M_ALTO | menor SS sin IVA | importe en [15.000, 50.000] | importe en [5.000, 50.000] | SS, SSI (L07) | | M_FRANJA50 | menor SS sin IVA, sin múltiplos de 500 € | importe en [47.500, 50.000] | importe en [35.000, 50.000] | SS, SSI (L07) | | M_N2 | menor con firma N2 | otro menor del mismo órgano, grupo y fuente con la misma firma a ≤ 182 días | menores con firma | SS, O | | M_REP | menor con NIF | el par (fuente, órgano, grupo, NIF, año natural) ya tenía un menor antes (orden `fecha_adj`, `id_canonical`) | menores con NIF | SS, SSI, O | | M_1183 | menor con NIF e importe sin IVA | el acumulado del par en el año natural, contando este, supera el **tope fijo** de 15.000 € (SS, SSI) / 40.000 € (O) | menores con NIF e importe | SS, SSI, O | | NM_N | adjudicación no menor PLACSP | nº | — (recuento) | SS, O | | NM_OU | lote del universo de OU1 (abierto, restringido, negociado con publicidad, diálogo, asociación; sin derivados de acuerdo marco ni emergencia) con `num_ofertas` ≥ 1 | `num_ofertas` = 1 | lotes | SS, O | | NM_URG | no menor con tramitación ordinaria o urgente | urgente | ordinaria + urgente | SS, O (L14: por financiación UE) | | NM_EMER | no menor con tramitación conocida | emergencia | todas | SS, O | | NM_NSP | no menor con procedimiento abierto, restringido, negociado (con o sin publicidad), diálogo o asociación | negociado sin publicidad | esos | SS, O | | NM_SIMPL | no menor con procedimiento abierto | `procedimiento_native` = 'Abierto simplificado' | abiertos | SS, O | | NM_DOUE | lote SS PLACSP de procedimiento con publicidad (abierto, restringido, negociado con publicidad, diálogo, asociación) con valor estimado V (`valor_estimado_eur_expediente`, si no `valor_estimado_eur`) en la banda | con pareja TED | lotes de la banda | banda que **cambia** de régimen en d (AGE: umbral a; resto: umbral b) y banda **siempre SARA** [max(u_viejo, u_nuevo), 1,5·max) | | NM_SARA | ídem | `sara` = TRUE | `sara` no nulo | L19 | | NM_MOD | adjudicación no menor del feed propio PLACSP (`tabla_origen='resultados_licitaciones'`) | su `id_canonical` tiene una modificación con `fecha_version` ≤ `fecha_adj` + 548 días | adjudicaciones | SS, O (solo L18). Si el casamiento con `.modificaciones` es < 50 % del que da EJ1 o 0, «no medible» | **Firma N2** (versión SQL de NE1 §5, declarada): objeto en minúsculas sin tildes, no alfanumérico → espacio; tokens de ≥ 3 caracteres fuera de las palabras vacías S de NE1; singular (≥ 5 letras acabadas en «es» tras r, n, l, d, j, y: quitar «es»; ≥ 4 letras acabadas en «s» sin «ss»: quitar «s»); fuera los genéricos G de NE1; firma = primer token + primer token distinto del primero entre los siguientes. Menos de 2 → sin firma. ## 4. Panel equilibrado y normalización - Celda = (órgano, grupo) [y, en L14, × financiación UE]. **Panel del evento** para una serie: celdas con ≥ 1 unidad del denominador (o del recuento) en **cada uno de los seis semestres** [d−18, d−13], [d−12, d−7], [d−6, d−1], [d+1, d+6], [d+7, d+12], [d+13, d+18]. Panel fijo para el evento y sus dos placebos. - Excepciones: NM_DOUE y NM_SARA (bandas de pocos lotes por órgano): **todos los órganos**, sin equilibrar; L14 tratados (financiación UE): sin equilibrar (casi no hay antes de 2021), el contraste (sin UE) sí equilibrado; L07: §5.2. - **Normalización**: las sumas se hacen dentro del panel; un recuento (M_N, NM_N, M_EUR) se lee como «por órgano del panel» (la razón de sumas en el panel fijo es la razón de medias por órgano). Las razones (cuotas) son razones de sumas. ## 5. Estadístico ### 5.1 Diseño general - R_w = Σ num / Σ den en la ventana w (razón) o Σ num (recuento). **Δ(c) = ln R(después de c) − ln R(antes de c)**, con ventanas de 12 meses a cada lado y el mes c fuera. - **Efecto** = Δ(d); cambio relativo = e^Δ − 1. - **Placebos** (fechas falsas ±6 meses, mismo panel): Δ(d−6) y Δ(d+6). **K = Δ(d) − ½[Δ(d−6) + Δ(d+6)]**: lo que salta en d por encima de la tendencia local (con un escalón puro, K ≈ Δ/2; con una tendencia lineal, K ≈ 0). - **Contraste (DiD)** donde está pre-registrado (§5.3): Δ* = Δ_T(d) − Δ_C(d); K* igual sobre la diferencia. Si no hay contraste, Δ* = Δ y K* = K. - **IC 95 %**: bootstrap por **órgano** (B = 1.000, semilla 20261022, numpy `default_rng`, órganos en orden de clave, remuestreo multinomial dentro de estrato; estrato = tratado / contraste cuando son órganos distintos; un solo estrato cuando el contraste está dentro de los mismos órganos). Percentiles 2,5 y 97,5. Réplica con R = 0 → descartada (se cuenta). - **Veredicto** por norma × serie × grupo: - **no medible**: panel < 20 órganos, o Σ den (o Σ recuento) < 200 en la ventana antes o después de d (en tratado o contraste); - **efecto**: IC(Δ*) excluye 0 **y** IC(K*) excluye 0 con el mismo signo; se dice si va en la dirección de la hipótesis; **efecto claro** si además |Δ*| ≥ ln 1,25; - **sin efecto**: IC(K*) contiene 0 **y** IC(Δ*) dentro de (−ln 1,15, +ln 1,15); - **no concluyente**: el resto. - **Comparaciones múltiples**: hay del orden de 80 celdas. Solo las celdas **primarias** (§8) llevan veredicto al registro; el resto se lee como descripción, y se dice cuántos «efecto» saldrían por azar (≈ 0,05 × 0,05 por celda si Δ y K fueran independientes; en la práctica más, porque no lo son). ### 5.2 L07 (DA 54.ª, 5-jul-2018): diseño especial El «antes» de 12 meses cruza la LCSP (mar-2018), que mueve las mismas cuantías. Ventanas: **antes = abr-jun 2018** (después de la LCSP), **después = ago-2018 a ene-2019** (antes del RDL 3/2019). Series M_ALTO y M_FRANJA50, T = SSI, C = SS. Panel: ≥ 1 menor SS sin IVA de [5.000, 50.000] en cada ventana. **Placebo de calendario** (+12 meses: abr-jun 2019 frente a ago-2019 a ene-2020). Efecto si IC(DiD) excluye 0 y el DiD del placebo tiene IC que contiene 0 o |DiD placebo| < |DiD|/2. Sin K. ### 5.3 Contrastes pre-registrados | Evento | Series | Tratado | Contraste | Hipótesis del DiD | |---|---|---|---|---| | L03 Cataluña jun-2016 | NM_NSP (SS, O) | órganos catalanes | resto | < 0 | | L05 LCSP mar-2018 | NM_NSP (SS, O) | resto | órganos catalanes (ya sin negociado por cuantía) | < 0 | | L06/L10/L19 SARA | NM_DOUE (SS) | banda que cambia | banda siempre SARA | L06 < 0, L10 > 0, L19 < 0 | | L07 DA 54.ª | M_ALTO, M_FRANJA50 | SSI | SS | > 0 | | L08 RDL 3/2019 | M_REP, M_1183 | SSI | SS | > 0 | | L11 RDL 3/2020 | M_REP, M_1183 | SS | **SSI sin salud** (exentos desde L08); sensibilidad: SSI entero | > 0 | | L12 COVID | NM_EMER (secundario) | AGE | no AGE | > 0 (el art. 16 RDL 7/2020 es de la AGE) | | L14 RDL 36/2020 | NM_URG, NM_SIMPL, NM_OU (SS, O) | financiación UE | sin financiación UE, mismos órganos | > 0 | Sin contraste (Δ y K): L02 (M_N), L05 (M_N, M_EUR, M_FRANJA, M_REP, M_1183, M_N2, NM_N, NM_OU, NM_URG, NM_SIMPL), L09 (M_REP, M_1183 en SS y O, sin SECTI), L11 en O (M_REP, M_1183), L12 (NM_EMER, NM_N, NM_URG, NM_OU, M_N, M_EUR), L18 (NM_OU, NM_N, M_N, M_REP, NM_MOD). ## 6. Segunda implementación pandas + pyarrow + numpy, **sin DuckDB** (imagen report-worker), escrita desde este documento, desde los parquet: rehace universo, deduplicado, panel, celdas y estadísticos de **tres celdas**: L05 × M_1183 y M_REP (SS), L11 × M_REP (SS frente a SSI sin salud) y L12 × NM_EMER (SS y O). **Pasa** si el panel, Σ num y Σ den por ventana coinciden en ≥ 99,5 % de las celdas, y Δ, K y DiD puntuales difieren ≤ 0,5 % (relativo) o ≤ 0,005 (absoluto). ## 7. Cotejo de 10 normas Para LCSP, RDL 3/2020, RDL 7/2020, RDL 8/2020, RDL 36/2020, Ley 2/2023, RDL 3/2019, Ley 19/2013, Cataluña DL 3/2016 y Euskadi Ley 3/2016: la fecha de entrada en vigor del catálogo frente a la que resulta de la **cláusula de entrada en vigor del propio texto** (disposición final, leída en el XML del BOE) aplicada a su fecha de publicación. **Pasa** si 10/10 coinciden; cada discrepancia se explica. Se da también el cotejo del catálogo inicial (apunte del TRASPASO) contra el BOE. ## 8. Celdas primarias y registro de precisión Una entrada por evento medido, con su celda primaria; veredicto del registro: **pasa** si la primaria da «efecto» en la dirección de la hipótesis (o «sin efecto» en el control negativo L18), y la segunda implementación pasa cuando la cubre; **no pasa** si da «sin efecto» (o «efecto» en L18) o «efecto» en contra; **cota** si «no concluyente»; «no medible» se registra como tal. | Evento | Celda primaria | |---|---| | L02 | M_N (SS) en dic-2015 | | L03 | NM_NSP (SS), DiD | | L05 | M_1183 (SS) ↓ | | L06 / L10 / L19 | NM_DOUE, DiD (↓ / ↑ / ↓) | | L07 | M_ALTO, DiD ↑ | | L08 | M_REP, DiD ↑ | | L09 | M_REP (SS) ↑ | | L11 | M_REP (SS frente a SSI sin salud), DiD ↑ | | L12 | NM_EMER (SS) ↑ (control positivo) | | L14 | NM_URG (SS), DiD ↑ | | L18 | NM_OU (SS) ≈ (control negativo) | ## 9. Salidas `salidas/eventos.csv` (norma × serie × grupo × diseño: d, panel, R antes/después, Δ, cambio %, IC, Δ placebos, K e IC, DiD, veredicto, hipótesis, dirección, normas vecinas), `salidas/series_mensuales.csv` (serie × grupo × mes 2012-01 a 2026-09: num, den, valor, órganos activos en el mes y en los 12 meses previos, valor por órgano activo), `salidas/para_registro_precision.json` (formato OU1), bocetos SVG escritos a mano (línea temporal 2012-2026 de M_REP (SS) y NM_EMER (SS+O) con las marcas de las normas; y un gráfico de efectos con IC por norma), `salidas/20_eventos.json`, `31_cotejo_impl2.json`, `50_cotejo_normas.json`. Nada por órgano, empresa o persona. ## 10. Implementación Principal: DuckDB + numpy (imagen `medir-consultas:local`); contenedores `lt1-NN`, `-m 8g --cpus 4 --network none`, datos `:ro`, `temp_directory` en `tmp/` con `max_temp_directory_size='5GB'`. `lt1-fetch` (con red) solo para el BOE (≤ 40 peticiones, pausa 3 s; 29 gastadas en el catálogo, antes de sellar). ## 11. Límites conocidos - La publicación de menores crece con la LCSP y con cada fuente: el panel corrige la forma, no la selección de qué se publica. - M_REP y M_1183 dependen del NIF (Cataluña CSV sin NIF; Valencia-menores ~ 60 %): las fuentes sin NIF no entran. - M_1183 usa un tope fijo y el año natural (la lectura de la Instrucción 1/2019), sin mirar el objeto: mide la repetición por encima del tope, no el incumplimiento (el 118.3 permitía objetos distintos tras la Instrucción). - La financiación UE de la PLACSP se rellena mucho mejor desde 2022: el tratado de L14 cambia de composición. - La cota baja del DOUE (ES1) vale para comparar en el tiempo, no como tasa. - Ningún cambio medido dice por qué; las normas vecinas se dicen, no se separan. ## 12. Enmiendas (ninguna antes de medir)