# Método del informe T3 2026

Versión 1 · extracción 14-oct-2026. Fuente descriptiva de agregados, para posterior maquetación; no publicada por esta tarea. El método anterior del observatorio se reutiliza sin sobrescribir su corte anual. Este informe cambia la ventana y valida la fecha original sin fallback. No se compara con el anual como tendencia.

## Fuente y capa de cobertura

Conexión pública TY-LIC existente en `norte-runner-1`, vía `~/licitaciones-ty/rutina.sh psql`. Tabla leída: `public.licitaciones`. No se consulta la app privada ni su histórico comercial. La instantánea contiene **325.312 expedientes** y **430.326 elementos de adjudicación**. La ingesta almacena el estado disponible de cada expediente, no un historial de todas sus versiones.

Los expedientes se distribuyen por origen almacenado: **238.388 del canal 643** (perfiles alojados en PLACSP) y **86.924 del 1044** (mecanismos de agregación de plataformas). Ambos conjuntos oficiales excluyen contratos menores en su definición. No se certifica que la base recoja todos los expedientes de esos canales o todo el mercado español. La fecha de publicación mínima almacenada es 29-sep-2021 y la máxima, 14-oct-2026; no demuestra continuidad completa entre ambas. La última actualización máxima de la instantánea es `2026-10-14T02:00:06.017+02:00`.

Fuentes primarias: [perfiles alojados](https://datos.gob.es/es/catalogo/e05250001-licitaciones-publicadas-en-los-perfiles-del-contratante-ubicados-en-la-plataforma-de-contratacion-del-sector-publico-excluyendo-los-contratos-menores), [plataformas agregadas](https://datos.gob.es/es/catalogo/e05250001-licitaciones-publicadas-en-la-plataforma-mediante-mecanismos-de-agregacion-excluyendo-los-contratos-menores). Se contrastaron sus páginas y las [condiciones de reutilización](https://www.hacienda.gob.es/es-ES/Paginas/Avisolegal.aspx) el 14-oct-2026: las tres respondieron HTTP 200, con recibos en `evidencia/fuentes-http.json`.

## Fecha original y periodo cerrado

El trimestre usa **1-jul-2026 ≤ fecha original validada < 1-oct-2026**. Se conserva el día de calendario informado; no se convierte una fecha XML en otro día por huso horario. El mapper de la fuente obtiene el campo de `cbc:AwardDate` (`licitacion-mapper.ts`, asignación `fecha_adjudicacion`). El parser temporal acepta fecha ISO completa y, si viene informada, una zona o tiempo ISO válido según el patrón declarado. Comprueba calendario y representación; elimina espacios exteriores y devuelve nulo ante fecha imposible, vacía, formato parcial o texto ajeno al patrón. El parser exacto está en `sql/00-fecha-valida.sql`.

En toda la base hay **296.433 fechas aceptadas**, **133.893 ausentes o vacías** y **0 no vacías inválidas**. El indicador histórico `con_fecha_adj` solo significa no nulo: no se usa para seleccionar T3 ni para contar fallback. La consulta cuenta explícitamente sus falsos positivos potenciales; en esta extracción fueron cero.

Hay **49.907 elementos con fecha original válida en T3**, antes de filtros de comparabilidad/ofertas/sector. **13.580 elementos sin fecha válida tienen publicación en T3**: se identifican como candidatos a fallback, pero se excluyen. Este recuento es de toda la base antes de los filtros y no se interpreta como adjudicaciones comparables que habrían entrado. **Cero** observaciones incluidas sustituyen adjudicación por publicación; extremos incluidos comprobados: 1-jul y 30-sep. La fecha de publicación almacenada corresponde al primer día visto por el sistema de ingesta; no sirve como fecha alternativa de adjudicación para este informe.

## Unidad, importes y selección

Unidad: un elemento del array de adjudicaciones por `(id, ord)`. Las claves se mantienen solo dentro de la sesión del runner. No equivale a licitación, lote único o empresa. El control detectó **0 duplicados** de esa unidad en la muestra incluida.

Fórmula: `baja_pct = (1 − importe_adjudicacion_sin_impuestos / presupuesto_comparable_sin_impuestos) × 100`. Ambos importes son sin impuestos; no se cruza importe con IVA contra presupuesto sin IVA. Se usa el presupuesto del lote emparejado por identificador. Sin lote emparejado, se admite el presupuesto del expediente únicamente con una adjudicación y como máximo un lote. Se excluyen varios adjudicatarios en el mismo lote.

**Límite de moneda:** la estructura de adjudicación usada por TY-LIC guarda los importes como números sin su `currencyID` (mapper, campos `importe_adjudicacion_sin_impuestos`, y schema `InformacionAdjudicacionSchema`). Los presupuestos de lote pueden conservar moneda, pero falta la del resultado para comprobar la igualdad en cada pareja. No se ha realizado conversión de divisas ni certificado EUR en cada fila. El filtro de presupuesto `>=1000` opera sobre el número cargado; el informe lo expresa en unidades monetarias del registro, sin certificar un umbral homogéneo en euros. Esta limitación no se oculta detrás del tratamiento uniforme de impuestos.

Se aplican los motivos del método previo, en su prioridad original: falta de emparejamiento, presupuesto no positivo/ausente, importe no positivo/ausente, constitución de acuerdo marco o SDA (códigos 1/2), varios adjudicatarios del lote, presupuesto menor de 1.000, baja menor de −10 % o mayor de 60 %. Después se excluyen basados en acuerdo marco (3), ofertas ausentes/no numéricas, no enteras/negativas y menos de dos, y ausencia de sector. Los basados en SDA (4) que cumplen el resto se conservan: **1.150 observaciones incluidas**. Dos ofertas recibidas no acreditan admisión o independencia de licitadores. Los límites de bajas son filtros de muestra, no reglas jurídicas; las negativas dentro del rango se conservan.

## Cascada de exclusiones, sin doble conteo

Cada elemento tiene un solo motivo en `cobertura.json`. La primera causa en el orden indicado gana; no sumar marginales de cada condición ni tratar esta cascada como incidencia bruta de un problema.

| Primera causa | Elementos |
|---|---:|
| Sin fecha de adjudicación válida | 133.893 |
| Fecha válida fuera de T3 | 246.526 |
| Sin emparejar | 1.376 |
| Sin presupuesto positivo | 1.897 |
| Sin importe positivo | 6.153 |
| Constituye acuerdo marco o SDA | 745 |
| Varios adjudicatarios del mismo lote | 401 |
| Presupuesto menor de 1.000 | 1.761 |
| Adjudicado más de 10 % sobre presupuesto | 475 |
| Baja mayor de 60 % | 1.642 |
| Basado en acuerdo marco | 5.914 |
| Ofertas ausentes/no numéricas | 1 |
| Ofertas no enteras o negativas | 0 |
| Menos de dos ofertas | 13.112 |
| Sin sector clasificado | 12 |
| Incluido | 16.418 |
| Total | 430.326 |

Los motivos posteriores a la ventana eliminan **33.489** de los **49.907** candidatos T3. Los pequeños recuentos de control explican filtros del universo y no son segmentos de personas ni celdas sectoriales publicables.

## Clasificación, agregación y supresión

Sector por CPV y prefijo más largo de la taxonomía TY-LIC/TY-OUT existente: CPV del lote si hay, del expediente en otro caso. Se deduplica por `(id,ord,sector)` dentro de un sector y por `(id,ord)` para nacional. Una adjudicación puede pertenecer a varios sectores. **No sumar sectores.** La fila nacional conserva la restricción del método previo: solo elementos con algún sector clasificado. Se excluyeron 12 candidatos finales sin clasificación.

Provincia por NUTS del expediente, sin inferir domicilio del adjudicatario. **1.912** elementos incluidos carecen de provincia y permanecen en nacional/sector; no entran en sector–provincia. Tampoco se reconstruye nacional sumando provincias, porque hay grupos suprimidos.

Una celda se publica con **n ≥20** y **≥5 códigos distintos no nulos de adjudicatario**. Los NIF normalizados y enmascarados solo se usan dentro de PostgreSQL para contar; no se exportan. Un código enmascarado puede colapsar identidades: el conteo no acredita empresas independientes verificadas. Los agregados contienen **297 grupos**: 1 nacional, 79 sectores y 217 sector–provincia. Se suprimen **2.506 celdas**; su ausencia no implica cero actividad.

Media aritmética no ponderada y `percentile_cont` 0,25/0,50/0,75, sobre la baja en cada grupo; porcentajes redondeados a dos decimales al exportar. Percentiles interpolados y descriptivos, sin intervalo de confianza, causa, recomendación de precio, significación estadística ni comparación temporal. No se usa el motor de pruebas para fabricar un veredicto que esta pregunta descriptiva no pide.

## Repetición, integridad y prueba

`exportar.py` compone el parser temporal, `00-taxonomia.sql`, una adaptación controlada de `01-base.sql` y `sql/02-trimestre.sql`. La adaptación reemplaza solo la fecha con fallback por la original validada, añade el original en TEMP para auditar y protege el parser de plazo (que T3 no consume). Ante cambios de los anclajes, aborta. Se conservan los hashes de fuentes, base adaptada y SQL realmente enviado en `procedencia.json` y `evidencia/consulta-recibo.json`.

La consulta ejecutó `BEGIN ISOLATION LEVEL REPEATABLE READ`, timeout de 180 s por sentencia y 600 s total, y `ROLLBACK`. Solo creó funciones `pg_temp`, tablas/vistas TEMP y cambió esas tablas temporales. No hay `COMMIT`, ingesta ni DML de tablas persistentes. Exit 0, acuse de rollback y duración 231,088 s están en el recibo. Snapshot `2026-10-14T13:13:00.199205Z`; extracción de los agregados `2026-10-14T13:16:48.363518Z`.

Los interruptores JSON y del proceso local/remoto se comprobaron antes: `licitaciones` no estaba apagada; no se consultan tablas de otras funciones. La conexión usa el rol existente de Docker mediante la rutina ya instalada, sin mostrar credenciales.

Pruebas pequeñas en runner: `gate-nube.py sql` valida calendario, ventana, fallback y supresión con datos sintéticos; `gate-nube.py artefactos` coteja CSV/JSON/cobertura, afirmaciones del informe y regeneración byte a byte. No se corrieron suites pesadas en el Mac. La base es viva: repetir la consulta en otra fecha puede cambiar los datos. Regenerar el informe desde este CSV sellado sí debe dar los mismos archivos.

## Reutilización

Origen de los datos: Ministerio de Hacienda, PLACSP. Agregación de tenderyou. Conservar atribución, fecha, metadatos de actualización y condiciones aplicables; no desnaturalizar la información ni insinuar patrocinio o aval del Ministerio. La autorización oficial permite reutilización comercial y no comercial bajo sus condiciones; no se etiqueta este corte como CC0. El diseño y logos del Ministerio tienen reglas distintas y no se han tomado para esta entrega. [Condiciones oficiales consultadas](https://www.hacienda.gob.es/es-ES/Paginas/Avisolegal.aspx).
