

No responde si una política funciona, sino cuánta gente la cumple y a quién le cae encima.
🔗 enjambre-web.onrender.com, sin registro, sin cuenta, sin instalar nada.
Toda proyección oficial de una política laboral asume que la política se cumple. Ese supuesto es el que nadie mide. Nosotros lo simulamos: qué hace cada tipo de empleador cuando su costo laboral sube, y qué pasa con la probabilidad de que lo sancionen cuando el de al lado también incumple.
Caso demo: el aumento del salario mínimo colombiano del 23% (decretos 1469 y 1470 de 2025), sobre el mercado laboral de Bogotá. Es el primer caso que corre el motor, no el único que puede correr: la misma mecánica sirve para cualquier política que cambie costos o incentivos, y esa generalización es justamente hacia donde va el proyecto.
Los agentes se instancian desde 6.692 personas reales anonimizadas de los microdatos de la GEIH del DANE, expandidas por factor de encuesta a 4,2 millones de ocupados. Sector, tamaño de empresa, ingreso, educación e informalidad vienen en la misma fila de la encuesta: las correlaciones entre atributos son las observadas, no las que un modelo de lenguaje considere plausibles. El lado empleador son 81 celdas con su costo formal, su factor prestacional y su indemnización calculados contra el Código Sustantivo del Trabajo.
Una capa LLM descubre estrategias de adaptación (informalizar, recortar jornada, despedir, absorber) en vez de escogerlas de un menú que escribió un economista. Después, un motor determinista con seed calcula el flujo de caja de la firma y veta lo que es materialmente imposible: una empresa sin caja para pagar indemnizaciones no puede despedir, por convincente que suene la justificación. En casi toda simulación con agentes LLM el modelo también juzga; acá solo propone.
No ve "salario mínimo", ni "decreto", ni un año: solo la mecánica ("tu costo laboral por empleado formal sube X%"). Una guardia revisa cada prompt antes de enviarlo y aborta la corrida entera si encuentra un término prohibido, un símbolo de moneda o un año de cuatro dígitos. Es fail-closed: no filtra, aborta. Si el agregado emerge igual sin el nombre, no es memoria del modelo, es mecánica.
La capacidad de inspección laboral es fija, derivada de la cifra de inspectores de la OIT, así que cada evasor adicional diluye la probabilidad de que la sanción te caiga a ti. Las decisiones individuales se vuelven una cascada que el modelo oficial, que asume cumplimiento, no puede ver.
Eso es el mecanismo del modelo, no un resultado del proyecto. La diferencia importa y la sostenemos abajo — incluso contra nosotros mismos: cuando medimos cuánto aporta esa cascada al resultado en el camino determinista, la respuesta fue 0,0 pp (evidencia §E2). El mecanismo opera —p(sanción) se mueve de 67,8% a 62,0% según cuánta gente evade— pero ese movimiento todavía no cambia el agregado. Está publicado porque lo medimos nosotros.
Escribimos los criterios de éxito antes de tener los datos, en un commit fechado y verificable
(git log --date=iso -- VALIDATION.md). Después corrimos el backtest fuera de muestra contra el
episodio real de 2025→2026:
Error del backtest: +37,37 pp
Skill vs. persistencia: −8,182 (la persistencia le gana ocho veces al modelo)
Delta observado: −4,07 pp (la informalidad BAJÓ)
Delta predicho: +33,3 pp (el modelo dice que SUBE)
El modelo falló, y el signo está al revés. Se activó la rama que habíamos pre-escrito para ese caso: se publica el error, se acota el claim al margen formal→informal dentro de quienes ya tienen empleador, y se nombran los confusores que no cubrimos —la reforma laboral, la jornada de 42 horas, el ciclo— como límite declarado y no como excusa. Un backtest negativo pero medido y reportado con honestidad sigue siendo más serio que una cifra que nadie puede refutar.
Lo que el backtest falsó es la predicción agregada para Bogotá. Lo que el motor sí hace, de forma consistente y reproducible sin API key, es otra cosa y más estrecha:
python scripts/barrido_politicas.py --desde 0 --hasta 30 --paso 2
16 políticas, 9,7 segundos, USD 0,00:
| Alza | 0% | 2% | 4% | 6–12% | 14–16% | 23% |
|---|---|---|---|---|---|---|
| Brecha | +3,2 pp | +3,7 | +5,8 | +9,2 | +10,6 | +10,58 pp |
Monótona no decreciente en los 16 puntos, con señal de 12,26 pp entre políticas y ruido/señal
0,00. Con sus límites en la misma frase, y uno es serio: es el camino de reglas fijas, no el de
descubrimiento con LLM —ahí la pendiente no se sostiene, dos corridas dan signos opuestos y el
ruido de reformulación del prompt iguala a la señal—; hay una meseta entre 6% y 12%; y 🔴 el
placebo dejó de ser cero: con alza 0% la informalidad sube +3,2 pp cuando no debería moverse, lo
que significa que α = 1,875 quedó descalibrado tras el arreglo de unidades del PR #41 y hay que
recalibrarlo. Todo eso, con su comando, en
docs/evidencia/2026-08-23-E1-E2-E3.md.
Límites declarados, no omisiones. Están en el repo con la dirección del sesgo de cada uno:
Lo que hoy es alcance acotado ya está escrito como hoja de ruta, no improvisado. El detalle, con
costo y comando de verificación por fase, está en ROADMAP.md:
make test # el núcleo determinista, 104 tests
make validate # los candados e imprime EL número (sale 1 mientras haya compuertas bloqueadas)
make supuestos # cada supuesto marcado en el punto donde se toma
python scripts/barrido_politicas.py --desde 0 --hasta 30 --paso 2 # la curva, sin API key
Mismo seed, mismo resultado. Repo público, licencia MIT, y grep -rn "SUPUESTO:" es el informe de
honestidad del proyecto.