<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: lu1tr0n</title>
    <description>The latest articles on Forem by lu1tr0n (@lu1tr0n).</description>
    <link>https://forem.com/lu1tr0n</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F806044%2F070ecfe6-05a6-44e1-95e3-81211fc13ab4.png</url>
      <title>Forem: lu1tr0n</title>
      <link>https://forem.com/lu1tr0n</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/lu1tr0n"/>
    <language>en</language>
    <item>
      <title>Let's Encrypt detiene emisión de certificados tras incidente del 8 de mayo</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Fri, 08 May 2026 20:18:52 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/lets-encrypt-detiene-emision-de-certificados-tras-incidente-del-8-de-mayo-2jfm</link>
      <guid>https://forem.com/lu1tr0n/lets-encrypt-detiene-emision-de-certificados-tras-incidente-del-8-de-mayo-2jfm</guid>
      <description>&lt;p&gt;El &lt;strong&gt;8 de mayo de 2026 a las 18:37 UTC&lt;/strong&gt;, &lt;strong&gt;Let's Encrypt&lt;/strong&gt; publicó un aviso en su página oficial de estado anunciando la &lt;strong&gt;suspensión inmediata de la emisión de certificados&lt;/strong&gt;. La autoridad certificadora gratuita más usada del mundo declaró estar investigando un "potential incident" que afecta a sus componentes de producción y staging, incluyendo &lt;code&gt;acme-v02.api.letsencrypt.org&lt;/code&gt; y el portal de gestión.&lt;/p&gt;

&lt;p&gt;La nota oficial es escueta: &lt;em&gt;"We have been made aware of a potential incident and are shutting down all issuance."&lt;/em&gt; En la práctica, esto significa que cualquier servidor, dispositivo o pipeline CI/CD que dependa de Let's Encrypt para renovar certificados TLS está bloqueado mientras dure la investigación. Para una infraestructura que emite más de cinco millones de certificados al día, una pausa de incluso unas horas tiene un efecto cascada considerable sobre internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué pasó con Let's Encrypt el 8 de mayo de 2026
&lt;/h2&gt;

&lt;p&gt;El aviso publicado en &lt;code&gt;letsencrypt.status.io&lt;/code&gt; es deliberadamente parco. La organización no ha revelado la naturaleza del incidente: no se sabe si se trata de una vulnerabilidad en su software CA &lt;em&gt;Boulder&lt;/em&gt;, un compromiso de infraestructura, una emisión incorrecta detectada por un tercero, o un fallo operacional. Los componentes marcados como afectados son los cuatro endpoints principales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;acme-v02.api.letsencrypt.org&lt;/strong&gt; — endpoint de producción del protocolo ACME donde se solicitan los certificados.- &lt;strong&gt;acme-staging-v02.api.letsencrypt.org&lt;/strong&gt; — endpoint de pruebas, normalmente usado para validar pipelines antes de pegarle a producción.- &lt;strong&gt;portal.letsencrypt.org&lt;/strong&gt; — portal web de administración.- &lt;strong&gt;portal-staging.letsencrypt.org&lt;/strong&gt; — portal de pruebas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La ubicación reportada es &lt;em&gt;High Assurance Datacenter 1&lt;/em&gt; y &lt;em&gt;High Assurance Datacenter 2&lt;/em&gt;, los dos centros de datos donde Let's Encrypt mantiene sus claves de firma offline. El estado oficial es &lt;strong&gt;INVESTIGATING&lt;/strong&gt;: la fase inicial de un incidente público en la que el equipo aún recopila información y todavía no ha confirmado causa raíz.&lt;br&gt;
El aviso oficial detuvo emisiones en producción y staging simultáneamente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; mientras dure la suspensión, cualquier intento de obtener un certificado nuevo o renovar uno existente vía Let's Encrypt fallará. Los certificados ya emitidos siguen siendo válidos hasta su fecha de expiración (normalmente 90 días), pero las renovaciones automáticas configuradas para los próximos días pueden romperse.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Por qué Let's Encrypt es crítico para la web
&lt;/h2&gt;

&lt;p&gt;Para entender la magnitud del incidente conviene recordar qué es Let's Encrypt. Lanzado en 2015 por la &lt;strong&gt;Internet Security Research Group (ISRG)&lt;/strong&gt; con el respaldo de Mozilla, EFF, Akamai y Cisco, Let's Encrypt se propuso un objetivo simple pero ambicioso: &lt;strong&gt;cifrar el 100% de la web&lt;/strong&gt; ofreciendo certificados TLS gratuitos, automatizados y abiertos.&lt;/p&gt;

&lt;p&gt;Antes de Let's Encrypt, un certificado TLS costaba entre 50 y 500 dólares anuales y requería un proceso manual de validación. Para un blog personal, una pyme latinoamericana o una startup en su primer mes, eso era una barrera real. Diez años después, la organización emite más certificados que cualquier otra autoridad del planeta y, según sus propias estadísticas, ha contribuido a que el porcentaje de páginas cargadas con HTTPS en Firefox pasara de menos del 40% a más del 90%.&lt;/p&gt;

&lt;p&gt;Su modelo de operación lo hace particularmente sensible a este tipo de incidentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Validez corta&lt;/strong&gt; — los certificados duran 90 días, lo que obliga a renovaciones frecuentes.- &lt;strong&gt;Automatización vía ACME&lt;/strong&gt; — la mayoría de los servidores los renuevan automáticamente con clientes como Certbot, acme.sh o acme-companion.- &lt;strong&gt;Sin contrato comercial&lt;/strong&gt; — al ser gratuito, no hay SLA contractual que cubra una caída.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  El protocolo ACME y por qué la suspensión rompe automatizaciones
&lt;/h2&gt;

&lt;p&gt;ACME (&lt;strong&gt;Automatic Certificate Management Environment&lt;/strong&gt;), estandarizado en el RFC 8555, es el protocolo que permite a un servidor demostrar el control sobre un dominio y obtener un certificado sin intervención humana. Un flujo típico de renovación se ve así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sequenceDiagram
    participant S as Servidor
    participant A as ACME
    participant D as Dominio
    S-&amp;gt;&amp;gt;A: solicita newOrder
    A--&amp;gt;&amp;gt;S: devuelve challenge HTTP-01
    S-&amp;gt;&amp;gt;D: publica el reto en su web
    A-&amp;gt;&amp;gt;D: verifica el reto
    A--&amp;gt;&amp;gt;S: validacion OK
    S-&amp;gt;&amp;gt;A: envia CSR
    A--&amp;gt;&amp;gt;S: emite certificado
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cuando el endpoint ACME está caído, ese flujo falla en el primer paso. Los clientes reaccionan distinto: &lt;strong&gt;Certbot&lt;/strong&gt; reintenta con backoff exponencial; &lt;strong&gt;acme.sh&lt;/strong&gt; registra el error y vuelve en el próximo cron; &lt;strong&gt;Caddy&lt;/strong&gt; y &lt;strong&gt;Traefik&lt;/strong&gt; mantienen el certificado actual hasta que sea posible renovar. La buena noticia es que, salvo que tu certificado venza dentro de las próximas horas, no notarás nada inmediato.&lt;/p&gt;

&lt;p&gt;Un ejemplo práctico de cómo podés probar manualmente si Let's Encrypt está respondiendo (Linux/macOS):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ver el estado del directorio ACME&lt;/span&gt;
curl &lt;span class="nt"&gt;-i&lt;/span&gt; https://acme-v02.api.letsencrypt.org/directory

&lt;span class="c"&gt;# Forzar renovación con Certbot (modo dry-run)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot renew &lt;span class="nt"&gt;--dry-run&lt;/span&gt;

&lt;span class="c"&gt;# Listar certificados con su fecha de expiración&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot certificates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En Windows, con OpenSSL instalado vía Chocolatey o WSL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# PowerShell con Invoke-WebRequest&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Invoke-WebRequest&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Uri&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://acme-v02.api.letsencrypt.org/directory&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-UseBasicParsing&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# WSL / Git Bash funciona igual que Linux&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;curl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://acme-v02.api.letsencrypt.org/directory&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si la primera llamada devuelve algo distinto de un JSON con los endpoints o falla con timeout, el problema sigue en pie. El comando &lt;code&gt;certbot certificates&lt;/code&gt; te muestra cuáles están próximos a vencer y te ayuda a priorizar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Datos y cifras: la escala del problema
&lt;/h2&gt;

&lt;p&gt;Las cifras hacen evidente por qué este incidente es relevante:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Let's Encrypt emite, en promedio, &lt;strong&gt;más de 5 millones de certificados nuevos por día&lt;/strong&gt; entre emisiones y renovaciones.- Más de &lt;strong&gt;500 millones de sitios activos&lt;/strong&gt; usan certificados de Let's Encrypt, según las estadísticas oficiales de la organización.- La validez de cada certificado es de &lt;strong&gt;90 días&lt;/strong&gt;; muchos sistemas renuevan a los 60 días, dejando un margen de 30 días de buffer.- En 2025, Let's Encrypt comenzó a ofrecer certificados de &lt;strong&gt;6 días de duración&lt;/strong&gt; en piloto, lo que aumenta aún más la dependencia de su disponibilidad continua.- La organización opera con un equipo técnico relativamente pequeño y una infraestructura concentrada en dos centros de datos de alta seguridad.
Más de 500 millones de sitios dependen de la CA gratuita más popular del mundo.
## Impacto en desarrolladores y empresas en LATAM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para América Latina, donde una proporción altísima del hosting independiente, los proyectos de software libre y las pymes tecnológicas dependen de Let's Encrypt, el efecto puede sentirse rápido. Algunos escenarios concretos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pipelines CI/CD&lt;/strong&gt; que provisionan ambientes efímeros (preview deployments en Vercel-like, Render, Fly.io o Railway) pueden fallar al obtener certificados nuevos.- &lt;strong&gt;Kubernetes con cert-manager&lt;/strong&gt; seguirá intentando renovar; los pods con certificados vencidos pueden bloquear ingress controllers y romper el tráfico interno.- &lt;strong&gt;Servidores hogareños o self-hosted&lt;/strong&gt; que ejecutan Certbot semanalmente verán errores en los logs hasta que el servicio vuelva.- &lt;strong&gt;SaaS que emite subdominios para clientes&lt;/strong&gt; bajo modelo wildcard y depende del DNS-01 challenge no podrá registrar nuevos clientes hasta que se restablezca el servicio.- &lt;strong&gt;Hosting compartido&lt;/strong&gt; de proveedores regionales que usan Let's Encrypt como backend para certificados gratuitos del cliente pierde su capacidad de provisionar nuevos sitios HTTPS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Cómo verificar si estás afectado y mitigar el impacto
&lt;/h2&gt;

&lt;p&gt;Mientras Let's Encrypt comunica más detalles, hay tres cosas concretas que podés hacer hoy mismo:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Auditar tus certificados actuales
&lt;/h3&gt;

&lt;p&gt;El comando &lt;code&gt;openssl s_client -connect tudominio.com:443 -servername tudominio.com 2&amp;gt;/dev/null | openssl x509 -noout -dates&lt;/code&gt; te muestra la fecha de expiración. Si tenés más de 7 días de margen, podés esperar a que se restablezca el servicio sin intervenir.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Considerar autoridades alternativas
&lt;/h3&gt;

&lt;p&gt;Si tu certificado vence en horas, la opción más rápida es cambiar a otra CA con soporte ACME. Las alternativas comunes son &lt;strong&gt;ZeroSSL&lt;/strong&gt;, &lt;strong&gt;Buypass Go SSL&lt;/strong&gt; y &lt;strong&gt;Google Trust Services&lt;/strong&gt;. Casi todos los clientes ACME modernos permiten cambiar el endpoint con un parámetro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Certbot con ZeroSSL (requiere registrar cuenta primero)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot certonly &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--server&lt;/span&gt; https://acme.zerossl.com/v2/DV90 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--eab-kid&lt;/span&gt; TU_KID &lt;span class="nt"&gt;--eab-hmac-key&lt;/span&gt; TU_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; ejemplo.com

&lt;span class="c"&gt;# acme.sh con Buypass&lt;/span&gt;
acme.sh &lt;span class="nt"&gt;--issue&lt;/span&gt; &lt;span class="nt"&gt;--server&lt;/span&gt; https://api.buypass.com/acme/directory &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; ejemplo.com &lt;span class="nt"&gt;-w&lt;/span&gt; /var/www

&lt;span class="c"&gt;# Caddy: cambiar la directiva en Caddyfile&lt;/span&gt;
&lt;span class="c"&gt;# tls user@dominio.com {&lt;/span&gt;
&lt;span class="c"&gt;#   ca https://acme.zerossl.com/v2/DV90&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Suscribirse al feed de estado
&lt;/h3&gt;

&lt;p&gt;El status page de Let's Encrypt soporta RSS, email, Slack y Microsoft Teams. Para SREs en LATAM, agregar el feed RSS al canal de #ops es la forma más confiable de enterarse en tiempo real sin depender del horario de oficina norteamericano.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; antes de cambiar de CA en producción, probá el flujo completo en staging. Algunas CAs alternativas requieren External Account Binding (EAB), un paso extra de registro que Let's Encrypt no exige.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Antecedentes: cuando las CAs fallan
&lt;/h2&gt;

&lt;p&gt;Este no es el primer incidente que afecta a una autoridad certificadora masiva. En 2020, Let's Encrypt tuvo que &lt;strong&gt;revocar 3 millones de certificados&lt;/strong&gt; por un bug en la verificación CAA (Certificate Authority Authorization) que afectaba a un subset de emisiones. La revocación se ejecutó en horas, y aunque la mayoría de los sitios renovaron sin problemas, hubo cientos de incidentes operacionales reportados en foros y redes.&lt;/p&gt;

&lt;p&gt;En 2011, la CA neerlandesa &lt;strong&gt;DigiNotar&lt;/strong&gt; fue comprometida por un atacante que emitió certificados fraudulentos para Google, Mozilla y agencias gubernamentales iraníes. La empresa terminó en bancarrota y los browsers la removieron por completo de sus root stores. Es el peor escenario posible para una CA: pérdida total de confianza.&lt;/p&gt;

&lt;p&gt;El precedente importa porque muestra que una CA puede operar correctamente durante años y caer en horas. La práctica de &lt;strong&gt;certificate pinning&lt;/strong&gt; ha ido en retroceso justamente porque vincular tu sitio a una CA específica te deja sin escape en escenarios como el actual.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📌 Nota:&lt;/strong&gt; el ecosistema TLS está diseñado para tolerar fallos de CAs individuales, pero solo si los operadores tienen un plan B preconfigurado. La mayoría no lo tiene.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;Por ahora, el siguiente paso pertenece a Let's Encrypt. El protocolo de incidentes públicos típicamente sigue cuatro fases: &lt;em&gt;investigating&lt;/em&gt; → &lt;em&gt;identified&lt;/em&gt; → &lt;em&gt;monitoring&lt;/em&gt; → &lt;em&gt;resolved&lt;/em&gt;. Una vez que la organización publique el post-mortem (suelen hacerlo dentro de las 72 horas en su foro de la comunidad), sabremos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La causa raíz exacta del incidente.- Si hubo certificados emitidos incorrectamente que requieran revocación masiva.- El timeline completo desde la detección hasta la mitigación.- Qué cambios operacionales se introducirán para evitar recurrencia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para los equipos de ingeniería, el aprendizaje recurrente es el mismo: &lt;strong&gt;la disponibilidad de tu sitio depende de servicios externos que tarde o temprano fallan&lt;/strong&gt;. Tener un plan B documentado, certificados con margen de renovación amplio y monitoreo proactivo de fechas de expiración convierte un incidente como este en una nota a pie de página del log diario, no en una página de operaciones llena de tickets P1.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Mi sitio se va a caer si tengo certificados de Let's Encrypt?
&lt;/h3&gt;

&lt;p&gt;No de forma inmediata. Los certificados ya emitidos son válidos hasta su fecha de expiración. El problema solo aparece si la renovación está programada durante el período de suspensión y el servicio no se restablece a tiempo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo sé cuándo expira mi certificado?
&lt;/h3&gt;

&lt;p&gt;Podés correr &lt;code&gt;openssl s_client -connect tudominio.com:443 -servername tudominio.com 2&amp;gt;/dev/null | openssl x509 -noout -dates&lt;/code&gt; en cualquier máquina con OpenSSL, o consultar &lt;code&gt;crt.sh&lt;/code&gt; con tu dominio para ver toda la cadena emitida y sus fechas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Tengo que cambiar de autoridad certificadora ya?
&lt;/h3&gt;

&lt;p&gt;Solo si tenés vencimientos en menos de 24-48 horas. Para la mayoría de los casos, esperar a que Let's Encrypt restablezca el servicio es la opción más simple. Si manejás infraestructura crítica, vale la pena tener una CA secundaria preconfigurada como backup.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa con los certificados wildcard?
&lt;/h3&gt;

&lt;p&gt;Los wildcard usan el desafío DNS-01, que también pasa por la API ACME suspendida. Si dependés de wildcards para multi-tenancy, la suspensión te afecta exactamente igual que a los certificados regulares.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Hay diferencia entre el endpoint v2 y staging?
&lt;/h3&gt;

&lt;p&gt;El staging existe para que los clientes prueben el flujo sin consumir la cuota de producción. Ambos están reportados como afectados, lo que sugiere que el problema no es de capacidad sino algo más profundo de la infraestructura compartida entre los dos ambientes.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánto suele durar un incidente así?
&lt;/h3&gt;

&lt;p&gt;Históricamente, los incidentes de emisión en Let's Encrypt han durado entre 2 y 8 horas. El de marzo de 2020 con la revocación CAA tardó 24 horas en resolverse del todo. La duración exacta depende de la complejidad del problema y de si requiere despliegue de código nuevo en producción.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://letsencrypt.status.io/pages/incident/55957a99e800baa4470002da/69fe2d6698ca07050eb4b1b3" rel="noopener noreferrer"&gt;Let's Encrypt Status — Stopping Issuance for Potential Incident&lt;/a&gt; — aviso oficial del incidente del 8 de mayo de 2026.- &lt;a href="https://letsencrypt.org/stats/" rel="noopener noreferrer"&gt;Let's Encrypt Statistics&lt;/a&gt; — cifras públicas actualizadas de emisión y adopción.- &lt;a href="https://datatracker.ietf.org/doc/html/rfc8555" rel="noopener noreferrer"&gt;RFC 8555 — Automatic Certificate Management Environment (ACME)&lt;/a&gt; — especificación oficial del protocolo.- &lt;a href="https://github.com/letsencrypt/boulder" rel="noopener noreferrer"&gt;letsencrypt/boulder en GitHub&lt;/a&gt; — código fuente del software CA usado por Let's Encrypt.- &lt;a href="https://crt.sh/" rel="noopener noreferrer"&gt;crt.sh&lt;/a&gt; — buscador público de certificados emitidos en Certificate Transparency logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Google, Microsoft y xAI aceptan pruebas federales de IA en EE.UU.</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Fri, 08 May 2026 16:09:04 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/google-microsoft-y-xai-aceptan-pruebas-federales-de-ia-en-eeuu-528o</link>
      <guid>https://forem.com/lu1tr0n/google-microsoft-y-xai-aceptan-pruebas-federales-de-ia-en-eeuu-528o</guid>
      <description>&lt;p&gt;El 8 de mayo de 2026, tres de las compañías más influyentes en inteligencia artificial — Google, Microsoft y xAI — aceptaron formalmente someter sus modelos de frontera a &lt;strong&gt;pruebas federales IA&lt;/strong&gt; coordinadas por el gobierno de Estados Unidos. El acuerdo, anunciado a través del U.S. AI Safety Institute (USAISI) dependiente del NIST, marca el primer marco voluntario tripartito entre rivales directos del sector y un regulador federal estadounidense desde la promulgación del Executive Order 14110 de octubre de 2023.&lt;/p&gt;

&lt;p&gt;El pacto llega en un momento clave: la industria atraviesa una fase de despliegue acelerado de agentes autónomos, copilots de codificación y modelos multimodales con capacidades que superan benchmarks que se consideraban «techo» hace solo 18 meses. Para los reguladores, el riesgo ya no es teórico; para las compañías, el escrutinio público tampoco. Las pruebas federales IA acordadas combinan red-teaming, análisis de capacidades peligrosas, evaluación de sesgos y revisión de procesos internos de seguridad antes de lanzar versiones nuevas al mercado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué pasó: el acuerdo del 8 de mayo
&lt;/h2&gt;

&lt;p&gt;Según el reporte publicado por Euronews, los tres gigantes firmaron un memorándum de entendimiento con el USAISI que les obliga a entregar acceso temprano a sus modelos antes de su lanzamiento público. El alcance es amplio: cubre los modelos de frontera de cada empresa — los más grandes y capaces que están en producción o próximos a salir — y se extiende a versiones derivadas que reutilicen las capacidades base.&lt;/p&gt;

&lt;p&gt;En la práctica, esto significa que Gemini de Google, los modelos GPT que Microsoft despliega vía Azure OpenAI Service, y Grok de xAI deberán pasar por evaluaciones federales antes de su disponibilidad general. El acuerdo también incluye reportes posteriores al lanzamiento — conocidos como &lt;em&gt;post-deployment monitoring&lt;/em&gt; — cuando se detecten capacidades emergentes no previstas en las pruebas iniciales.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; Este es un acuerdo voluntario, no una ley. Eso significa que su fuerza viene de la reputación y la presión pública más que de sanciones legales. Si una empresa rompe el pacto, no hay multa automática, pero sí un costo político considerable.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Notablemente, OpenAI y Anthropic ya habían firmado un acuerdo similar con el USAISI en 2024, por lo que la incorporación de Google, Microsoft y xAI completa un grupo de cinco grandes laboratorios sometidos al mismo régimen de pruebas federales IA. Meta, por ahora, quedó fuera de este pacto particular.&lt;br&gt;
Las pruebas federales se realizan en entornos aislados con acceso supervisado al modelo.&lt;/p&gt;
&lt;h2&gt;
  
  
  Contexto e historia: del Executive Order al pacto de 2026
&lt;/h2&gt;

&lt;p&gt;Para entender por qué este acuerdo importa hay que remontarse a octubre de 2023, cuando la Casa Blanca firmó el Executive Order 14110 sobre desarrollo seguro de inteligencia artificial. Ese decreto, derogado parcialmente en enero de 2025 por la nueva administración, sentó las bases del marco actual: obligó a las empresas a reportar entrenamientos de modelos por encima de cierto umbral de cómputo (10^26 FLOPs) y creó el AI Safety Institute como brazo técnico del NIST.&lt;/p&gt;

&lt;p&gt;Aunque el decreto fue debilitado, el USAISI sobrevivió y mantuvo sus convenios con la industria. La administración actual reorientó el enfoque desde «safety» hacia «competitividad nacional», pero conservó la infraestructura técnica de evaluación. El resultado: un instituto que sigue funcionando con un mandato modificado, más enfocado en riesgos catastróficos — armas químicas, biológicas, radiológicas y nucleares (CBRN), ciberseguridad ofensiva, manipulación masiva — que en sesgo o equidad.&lt;/p&gt;

&lt;p&gt;El acuerdo del 8 de mayo refleja esa reorientación. Las pruebas federales IA pactadas se concentran en lo que los técnicos llaman «capacidades dual-use»: habilidades del modelo que tienen aplicaciones legítimas pero que también podrían facilitar ataques. Por ejemplo, un modelo que escribe código de manera excelente puede ayudar a un desarrollador o redactar un exploit; uno que entiende química puede ayudar a un investigador o asistir en la síntesis de armas.&lt;/p&gt;
&lt;h3&gt;
  
  
  Por qué xAI sorprendió
&lt;/h3&gt;

&lt;p&gt;De los tres firmantes, xAI fue el más inesperado. Elon Musk había sido públicamente crítico de la regulación federal y prefería mecanismos de mercado. Sin embargo, xAI ha enfrentado escrutinio creciente por incidentes con Grok — especialmente alrededor de moderación de contenido y respuestas en temas políticamente sensibles — y la firma del pacto puede leerse como un movimiento de legitimación para acceder a contratos federales que requieren evaluaciones de seguridad documentadas.&lt;/p&gt;
&lt;h2&gt;
  
  
  Datos y cifras del acuerdo
&lt;/h2&gt;

&lt;p&gt;Los detalles concretos publicados sobre las pruebas federales IA incluyen varios números que dimensionan el alcance del compromiso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;3 empresas firmantes:&lt;/strong&gt; Google, Microsoft y xAI — sumadas a OpenAI y Anthropic que ya estaban dentro, son 5 grandes laboratorios.- &lt;strong&gt;~90 días:&lt;/strong&gt; ventana mínima de acceso al modelo antes del lanzamiento público, según los términos comunes de este tipo de acuerdos USAISI.- &lt;strong&gt;13.5%:&lt;/strong&gt; crecimiento proyectado del gasto en TI para 2026 según Gartner, en gran parte impulsado por inversión en IA — un mercado donde las pruebas federales IA pueden marcar diferencia competitiva.- &lt;strong&gt;$48B:&lt;/strong&gt; capital de venture invertido en deep tech en 2026, sector que incluye laboratorios de IA y que ahora tendrá mayor visibilidad regulatoria.- &lt;strong&gt;~75%:&lt;/strong&gt; objetivo declarado por Meta para tener código escrito por IA hacia finales de 2026, cifra que ilustra cuán profundamente está integrada la IA en flujos productivos — y por qué importa auditarla.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Si trabajás en una startup que usa modelos de Google, Microsoft o xAI vía API, este acuerdo te beneficia indirectamente: los modelos llegarán con menos sorpresas en producción porque ya pasaron por red-teaming federal antes del rollout público.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Impacto y análisis: lo que cambia para la industria
&lt;/h2&gt;

&lt;p&gt;El efecto inmediato del acuerdo es procedimental: agrega una capa de revisión previa al lanzamiento. Pero el impacto más interesante es indirecto y se siente en varios frentes.&lt;/p&gt;
&lt;h3&gt;
  
  
  Para los desarrolladores
&lt;/h3&gt;

&lt;p&gt;Las pruebas federales IA elevan el listón de lo que se considera «modelo listo para producción». Si un modelo nuevo de Gemini o GPT pasa por revisión del USAISI antes de salir, los desarrolladores que lo integren en aplicaciones tendrán más confianza en que ciertas capacidades peligrosas están contenidas. Esto reduce la carga de filtros adicionales en la capa de aplicación — aunque no la elimina.&lt;/p&gt;

&lt;p&gt;El código de moderación típico en aplicaciones que usan LLMs sigue luciendo así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Patr&amp;amp;oacute;n com&amp;amp;uacute;n de validaci&amp;amp;oacute;n previa al modelo&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;safeGenerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;flagged&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contentClassifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;flagged&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Prompt rechazado por pol&amp;amp;iacute;tica&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;audit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;contentClassifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;audit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;severity&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con modelos federalmente evaluados, los umbrales de detección pueden afinarse mejor porque el comportamiento del modelo subyacente es más predecible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Para los inversionistas y founders
&lt;/h3&gt;

&lt;p&gt;El acuerdo institucionaliza una señal que ya estaba en el mercado: los modelos auditados se están convirtiendo en activos diferenciados. Para una startup que vende a clientes regulados — salud, finanzas, gobierno — usar un modelo que pasó por pruebas federales IA es una ventaja comercial concreta. La cláusula «evaluado por el USAISI» empieza a funcionar como una insignia, análoga al SOC 2 Type II en SaaS empresarial.&lt;br&gt;
Las evaluaciones cubren red-teaming, capacidades CBRN y resiliencia adversarial.&lt;/p&gt;
&lt;h3&gt;
  
  
  Para la geopolítica de la IA
&lt;/h3&gt;

&lt;p&gt;El acuerdo también envía una señal hacia el exterior. La Unión Europea ha avanzado con el AI Act, y China operó durante años con su propio marco de revisión algorítmica. Estados Unidos, sin una ley federal de IA, había operado por ejecutiva y por convenios voluntarios. Este pacto consolida la línea estadounidense de «regulación por convenio»: menos prescriptiva que la europea, más flexible, pero con la ventaja de que todos los actores grandes están adentro.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
  A["Modelo entrenado"] --&amp;gt; B["Acceso al USAISI"]
  B --&amp;gt; C["Red-teaming federal"]
  C --&amp;gt; D["Reporte de hallazgos"]
  D --&amp;gt; E{"&amp;amp;iquest;Riesgos cr&amp;amp;iacute;ticos?"}
  E -- "S&amp;amp;iacute;" --&amp;gt; F["Mitigaci&amp;amp;oacute;n previa al lanzamiento"]
  E -- "No" --&amp;gt; G["Lanzamiento p&amp;amp;uacute;blico"]
  F --&amp;gt; G
  G --&amp;gt; H["Monitoreo post-deployment"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Qué sigue: la hoja de ruta del AI Safety Institute
&lt;/h2&gt;

&lt;p&gt;El USAISI tiene varios proyectos abiertos para los próximos meses. Entre los más relevantes para la industria figuran:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Benchmarks públicos de capacidades CBRN:&lt;/strong&gt; el instituto trabaja en suites de pruebas reproducibles que cualquier laboratorio pueda aplicar, no solo los firmantes del acuerdo.- &lt;strong&gt;Marco de evaluación de agentes autónomos:&lt;/strong&gt; con la explosión de agentes que ejecutan acciones — pagos, envío de mensajes, despliegue de código — se necesitan pruebas específicas para sistemas con capacidad de actuar, no solo de generar texto.- &lt;strong&gt;Coordinación internacional:&lt;/strong&gt; el USAISI mantiene diálogo con el AI Safety Institute británico, el japonés y el de Singapur. Una versión futura del pacto podría incluir reconocimiento mutuo de evaluaciones, lo que reduciría la carga regulatoria de los laboratorios globales.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; Aunque el acuerdo se anuncia como un avance, persisten críticas. Investigadores académicos sostienen que las pruebas federales IA dependen de información que las propias empresas suministran y que los plazos de evaluación suelen ser insuficientes para detectar capacidades emergentes sutiles. La transparencia de los reportes finales también es limitada.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para los lectores de @programacion que siguen la evolución de la IA desde el lado técnico, este pacto importa por una razón concreta: marca el momento en que la auditoría externa de modelos pasó de ser un ejercicio académico aislado a una práctica institucional con cinco de los principales laboratorios alineados. Es un cambio de fondo, aunque su efectividad real solo se podrá juzgar por los próximos lanzamientos y cómo respondan los modelos en el mundo real.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué es exactamente el U.S. AI Safety Institute?
&lt;/h3&gt;

&lt;p&gt;Es una unidad técnica del National Institute of Standards and Technology (NIST) creada en 2023 para evaluar modelos de IA de frontera y desarrollar estándares de medición. No tiene poder sancionador directo, pero sus reportes influyen en política federal y en decisiones de compra del gobierno.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿El acuerdo obliga a Google, Microsoft y xAI a publicar los resultados de las pruebas?
&lt;/h3&gt;

&lt;p&gt;No. Los términos estándar de este tipo de pactos contemplan reportes confidenciales al gobierno y un resúmen público de alto nivel. Los detalles técnicos — vectores de ataque específicos, prompts de red-teaming — se mantienen reservados para evitar que sirvan de guía a actores maliciosos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué Meta no firmó?
&lt;/h3&gt;

&lt;p&gt;Meta no aparece entre los firmantes de este acuerdo particular. La compañía ha mantenido una postura distinta sobre regulación y publica abiertamente sus modelos Llama, lo que cambia el cálculo de qué significa «evaluación previa al lanzamiento» cuando los pesos se distribuyen libremente. No se descarta una incorporación posterior.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Esto reemplaza al AI Act europeo?
&lt;/h3&gt;

&lt;p&gt;No. El AI Act es ley vinculante en la Unión Europea con sanciones económicas. El acuerdo del USAISI es voluntario y aplica solo en EE.UU. Las empresas que operan globalmente deben cumplir ambos marcos, que no son equivalentes en alcance ni mecanismos de enforcement.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo afecta esto a desarrolladores fuera de Estados Unidos?
&lt;/h3&gt;

&lt;p&gt;Indirectamente, de forma positiva: si un modelo se evaluó antes de su lanzamiento, los problemas de seguridad detectados se mitigan antes de llegar a producción global. Los desarrolladores en LATAM, por ejemplo, reciben modelos más «curados». Pero las políticas de uso de cada API siguen siendo responsabilidad del desarrollador local.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuándo veremos el primer modelo lanzado bajo este régimen?
&lt;/h3&gt;

&lt;p&gt;Los próximos lanzamientos mayores de Gemini, los modelos GPT distribuidos por Azure y las versiones siguientes de Grok deberían ser los primeros en pasar por el proceso completo. Es razonable esperar la primera referencia pública al USAISI en notas de lanzamiento durante el segundo semestre de 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.euronews.com/next/2026/05/08/tech-giants-agree-to-us-government-ai-testing" rel="noopener noreferrer"&gt;Euronews — Tech giants agree to US government AI testing&lt;/a&gt; — reporte original del acuerdo del 8 de mayo de 2026.- &lt;a href="https://www.universityofcalifornia.edu/news/11-things-ai-experts-are-watching-2026" rel="noopener noreferrer"&gt;University of California — 11 things AI experts are watching for in 2026&lt;/a&gt; — contexto sobre prioridades regulatorias y técnicas del año.- &lt;a href="https://a16z.com/notes-on-ai-apps-in-2026/" rel="noopener noreferrer"&gt;Andreessen Horowitz — Notes on AI Apps in 2026&lt;/a&gt; — análisis del estado de la industria de aplicaciones de IA.- &lt;a href="https://explodingtopics.com/blog/ai-statistics" rel="noopener noreferrer"&gt;Exploding Topics — 45+ Artificial Intelligence Statistics (Jan 2026)&lt;/a&gt; — estadísticas actualizadas del sector que dimensionan el alcance del acuerdo.- &lt;a href="https://www.technologyreview.com/2026/01/12/1130018/ai-companions-chatbots-relationships-2026-breakthrough-technology/" rel="noopener noreferrer"&gt;MIT Technology Review — AI Companions: 10 Breakthrough Technologies 2026&lt;/a&gt; — análisis editorial del contexto de despliegue de modelos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>WebTransport en 2026: el reemplazo de WebSocket sobre HTTP/3</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Fri, 08 May 2026 16:05:25 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/webtransport-en-2026-el-reemplazo-de-websocket-sobre-http3-3fi2</link>
      <guid>https://forem.com/lu1tr0n/webtransport-en-2026-el-reemplazo-de-websocket-sobre-http3-3fi2</guid>
      <description>&lt;p&gt;Si llevás años usando WebSocket para todo lo que necesite tiempo real en el navegador (chat, notificaciones, juegos, dashboards en vivo), 2026 es el año en que conviene mirar a su reemplazo natural. &lt;strong&gt;WebTransport&lt;/strong&gt; es una API de la web moderna construida directamente sobre HTTP/3 y QUIC que ofrece todo lo que WebSocket hace bien y resuelve casi todo lo que hace mal: head-of-line blocking, multiplexación pobre, latencia inicial alta y la imposibilidad de enviar mensajes no confiables.&lt;/p&gt;

&lt;p&gt;En esta guía explicamos qué es WebTransport, cómo funciona por dentro, cuándo elegirlo sobre WebSocket o WebRTC, qué soporte tiene en navegadores y servidores en mayo de 2026, y qué patrones de código necesitás para empezar a usarlo desde un cliente JavaScript y un servidor en Node.js, Go o Rust. La idea es que termines con criterio para decidir si vale la pena migrar tu próxima app real-time o esperar un poco más.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es WebTransport
&lt;/h2&gt;

&lt;p&gt;WebTransport es una API JavaScript expuesta en el navegador que permite establecer conexiones cliente-servidor bidireccionales de baja latencia. Está estandarizada por el W3C como API web y por el IETF como protocolo de transporte. La diferencia clave con WebSocket es que &lt;strong&gt;WebTransport no corre sobre TCP+TLS, sino sobre QUIC&lt;/strong&gt;, el protocolo de transporte que también sustenta a HTTP/3.&lt;/p&gt;

&lt;p&gt;Esto suena a un detalle de bajo nivel, pero tiene consecuencias enormes para cualquier aplicación en tiempo real. WebSocket, al ser una capa sobre TCP, hereda problemas como el &lt;em&gt;head-of-line blocking&lt;/em&gt;, donde un solo paquete perdido detiene todos los mensajes posteriores aunque viajen por flujos lógicos distintos. QUIC resuelve eso permitiendo múltiples streams independientes dentro de una misma conexión, y WebTransport expone esos streams al desarrollador web sin que tenga que tocar nada de QUIC directamente.&lt;/p&gt;

&lt;p&gt;Otra diferencia fundamental: WebTransport ofrece dos modos de transporte coexistiendo en una misma conexión:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Streams confiables&lt;/strong&gt;: similares a TCP, garantizan orden y entrega. Útiles para chat, comandos de aplicación, sincronización de estado.- &lt;strong&gt;Datagramas no confiables&lt;/strong&gt;: similares a UDP, no garantizan entrega ni orden, pero llegan con la mínima latencia posible. Ideales para telemetría, audio en vivo, posiciones de juego, cursores colaborativos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;WebSocket no tiene la opción de datagramas no confiables. Si usabas WebSocket para enviar la posición del mouse 60 veces por segundo en un juego multijugador, cada paquete perdido bloqueaba a los siguientes hasta que TCP retransmitiera. Con WebTransport simplemente lo mandás como datagrama y seguís adelante; los datos viejos se descartan solos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona WebTransport
&lt;/h2&gt;

&lt;p&gt;Para entender por qué WebTransport es más rápido, hay que pensar en capas. Una conexión WebSocket tradicional pasa por:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un handshake TCP de tres paquetes.- Un handshake TLS de uno o dos RTTs adicionales.- Un handshake HTTP de upgrade que cambia el protocolo a WebSocket.- Recién ahí podés enviar mensajes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una conexión WebTransport sobre HTTP/3 reemplaza todo eso por un único handshake QUIC que &lt;strong&gt;combina transporte, cifrado y reanudación&lt;/strong&gt; en muy pocos paquetes. En reconexiones puede llegar a 0-RTT, donde el primer paquete del cliente ya transporta datos útiles. Para el desarrollador la API se siente parecida a WebSocket, pero la latencia inicial cae drásticamente, sobre todo en redes móviles inestables.&lt;br&gt;
Pila de protocolos que sustenta a WebTransport en el navegador.&lt;br&gt;
Una vez establecida la sesión, el cliente puede abrir múltiples streams bidireccionales o unidireccionales y enviar datagramas en paralelo. El servidor responde por el mismo canal QUIC. Si la red se degrada, QUIC migra la conexión sin tirarla, algo que TCP simplemente no puede hacer porque está atado a la cuádrupla IP origen, IP destino, puerto origen, puerto destino. QUIC identifica conexiones por un Connection ID lógico, así que el cliente puede pasar de WiFi a 4G y la sesión sobrevive.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dot"&gt;&lt;code&gt;&lt;span class="k"&gt;graph&lt;/span&gt; &lt;span class="nv"&gt;TB&lt;/span&gt;
  &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Navegador"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"WebTransport API"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;B&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"HTTP/3"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;C&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"QUIC + TLS 1.3"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;D&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;E&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"UDP"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;E&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;F&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"IP"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El servidor debe soportar HTTP/3 explícitamente y aceptar el método CONNECT con el protocolo WebTransport. La negociación pasa por ALPN, así que el navegador y el servidor se ponen de acuerdo en una sola pasada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ejemplos prácticos en el navegador
&lt;/h2&gt;

&lt;p&gt;La API en el cliente es sencilla. Conectarse a un servidor WebTransport requiere HTTPS con HTTP/3 y un certificado válido o un hash de certificado autofirmado autorizado mediante &lt;code&gt;serverCertificateHashes&lt;/code&gt;. Acá un ejemplo mínimo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebTransport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com:4433/echo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Enviar un datagrama no confiable&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;datagrams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getWriter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextEncoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ping&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// Abrir un stream bidireccional confiable&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createBidirectionalStream&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;streamWriter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;writable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getWriter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;streamWriter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextEncoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hola servidor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;streamWriter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La promesa &lt;code&gt;transport.ready&lt;/code&gt; se resuelve cuando la sesión QUIC ya está establecida y el handshake de WebTransport terminó. A partir de ahí tenés tres canales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;transport.datagrams&lt;/code&gt;: para datagramas individuales, no confiables.- &lt;code&gt;transport.createBidirectionalStream()&lt;/code&gt;: streams full-duplex confiables.- &lt;code&gt;transport.createUnidirectionalStream()&lt;/code&gt;: streams en un solo sentido, útiles cuando solo el cliente o solo el servidor produce datos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para leer datos entrantes, la API usa Readable y Writable Streams nativos del navegador, lo que permite encadenar transformaciones con &lt;code&gt;pipeThrough&lt;/code&gt; sin código extra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;datagrams&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getReader&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;done&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;done&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;datagrama:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TextDecoder&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el lado servidor podés usar &lt;code&gt;@fails-components/webtransport&lt;/code&gt; en Node.js, &lt;code&gt;quic-go&lt;/code&gt; en Go, o &lt;code&gt;wtransport&lt;/code&gt; en Rust. Las tres son implementaciones del draft IETF y se mantienen activas. Cloudflare Workers también expone WebTransport en su runtime desde 2025, y Deno tiene soporte experimental directo en su runtime sin librerías externas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Para desarrollo local sin certificado válido, Chrome acepta &lt;code&gt;--origin-to-force-quic-on=localhost:4433&lt;/code&gt; y &lt;code&gt;--ignore-certificate-errors-spki-list&lt;/code&gt;. Es la forma más rápida de probar un servidor WebTransport en tu máquina sin pelear con CA locales.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Casos de uso reales
&lt;/h2&gt;

&lt;p&gt;WebTransport brilla en escenarios donde WebSocket sufría:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Juegos en el navegador&lt;/strong&gt;: posiciones de jugadores, eventos de input y voz se envían como datagramas no confiables; el chat o cambios persistentes del mundo van como streams confiables. Empresas como Hathora y Colyseus ya tienen adaptadores listos.- &lt;strong&gt;Streaming de video low-latency&lt;/strong&gt;: experimentos públicos de Twitch, YouTube y Meta usan WebTransport para distribuir segmentos de video con menos buffering que HLS o DASH sobre TCP. El protocolo Media over QUIC (MoQ) está construido sobre WebTransport.- &lt;strong&gt;Telemetría IoT en el navegador&lt;/strong&gt;: dashboards que reciben miles de métricas por segundo se benefician de no tener head-of-line blocking, especialmente cuando la red móvil del operador pierde paquetes.- &lt;strong&gt;Edición colaborativa&lt;/strong&gt;: aunque CRDTs tradicionales viven sobre WebSocket, WebTransport mejora la sincronización en redes inestables y permite enviar la posición del cursor por datagrama mientras los cambios reales viajan por stream confiable.- &lt;strong&gt;Aplicaciones de trading&lt;/strong&gt;: cada milisegundo cuenta y los datagramas permiten descartar precios viejos sin bloquear el resto de la información.
WebTransport habilita juegos, video low-latency y telemetría sin compromisos.
## Ventajas y desventajas&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ventajas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sin head-of-line blocking&lt;/strong&gt;: cada stream avanza independientemente del resto.- &lt;strong&gt;Datagramas no confiables nativos&lt;/strong&gt;: por fin un equivalente a UDP en el navegador sin tener que recurrir a WebRTC y su complejidad de signaling y NAT traversal.- &lt;strong&gt;Conexión 0-RTT en reconexiones&lt;/strong&gt;: latencia inicial mínima cuando el cliente ya conectó antes.- &lt;strong&gt;Migración de conexión&lt;/strong&gt;: si cambiás de WiFi a 4G la sesión sobrevive sin reabrir handshake.- &lt;strong&gt;Mejor multiplexación&lt;/strong&gt;: una sola conexión QUIC sirve para muchos streams paralelos sin penalidad.- &lt;strong&gt;Cifrado obligatorio&lt;/strong&gt;: TLS 1.3 va integrado en QUIC, no podés desactivarlo aunque quieras.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desventajas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soporte de navegador desigual&lt;/strong&gt;: Chromium implementa la mayor parte, Firefox tiene soporte parcial, Safari va un paso atrás.- &lt;strong&gt;Requiere HTTPS y HTTP/3 en el servidor&lt;/strong&gt;: no podés probar en localhost sin certificado salvo con flags específicos del navegador.- &lt;strong&gt;Ecosistema joven&lt;/strong&gt;: bibliotecas todavía cambian de API entre versiones menores y la documentación a veces va atrás del código.- &lt;strong&gt;Más complejo que WebSocket&lt;/strong&gt;: ahora tenés que decidir cuándo usar streams vs datagramas, y manejar la lógica de cada caso.- &lt;strong&gt;UDP bloqueado en redes corporativas&lt;/strong&gt;: muchos firewalls de empresa filtran UDP en puerto 443, así que la conexión cae a HTTP/2 o falla directamente.- &lt;strong&gt;Debugging menos maduro&lt;/strong&gt;: las DevTools recién agregan soporte completo y los proxies tradicionales de inspección no lo entienden.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  WebTransport vs WebSocket vs WebRTC
&lt;/h2&gt;

&lt;p&gt;Una confusión común es cuándo usar cada uno. Acá un resumen práctico para 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket&lt;/strong&gt; sigue siendo la opción más sencilla y compatible. Si tu app no necesita datagramas y manda mensajes pequeños sobre redes estables, no tiene sentido cambiar a WebTransport.- &lt;strong&gt;WebRTC&lt;/strong&gt; es para comunicación peer-to-peer (videollamadas, juegos P2P). Es complejo, tiene su propio stack de NAT traversal, ICE y STUN/TURN, y no se justifica para arquitecturas cliente-servidor tradicionales.- &lt;strong&gt;WebTransport&lt;/strong&gt; ocupa el espacio cliente-servidor donde WebSocket queda corto: necesitás múltiples streams paralelos, datagramas no confiables, latencia mínima en reconexiones, o todo a la vez en la misma sesión.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; La regla simple: si tu app sufría con WebSocket en redes móviles o en escenarios con muchos canales lógicos paralelos, probá WebTransport. Si nunca tuviste un problema, no rompas lo que funciona.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Estado del soporte en navegadores
&lt;/h2&gt;

&lt;p&gt;A mayo de 2026 el panorama es razonablemente saludable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chrome y Edge&lt;/strong&gt;: soporte estable desde la versión 97 (2022), con la API completa y datagramas funcionando bien.- &lt;strong&gt;Firefox&lt;/strong&gt;: soporte estable desde Firefox 114, con algunas funciones avanzadas aún detrás de flags &lt;code&gt;about:config&lt;/code&gt;.- &lt;strong&gt;Safari&lt;/strong&gt;: soporte experimental, llega gradualmente con WebKit y todavía no se considera production-ready.- &lt;strong&gt;Node.js&lt;/strong&gt;: vía bibliotecas externas, no en el core.- &lt;strong&gt;Deno y Bun&lt;/strong&gt;: Deno tiene soporte experimental nativo desde 2024; Bun lo tiene en roadmap.- &lt;strong&gt;CDN y edge runtimes&lt;/strong&gt;: Cloudflare Workers expone WebTransport en producción; Fastly tiene un beta cerrado; Akamai todavía no ofrece.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para producción, WebTransport ya es viable cuando tu audiencia mayoritariamente usa Chromium. En entornos mixtos conviene aplicar feature detection con &lt;code&gt;'WebTransport' in globalThis&lt;/code&gt; y caer a WebSocket como fallback. Algunas librerías como &lt;code&gt;libp2p&lt;/code&gt; o &lt;code&gt;partykit&lt;/code&gt; ya lo hacen automáticamente.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿WebTransport reemplaza a WebSocket?
&lt;/h3&gt;

&lt;p&gt;No de forma inmediata. WebSocket seguirá funcionando muchos años por compatibilidad y simplicidad. WebTransport es la opción moderna para casos donde WebSocket queda corto (datagramas, multiplexación, redes móviles inestables), pero para apps simples WebSocket sigue siendo válido y recomendable.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito un servidor especial para usar WebTransport?
&lt;/h3&gt;

&lt;p&gt;Sí. El servidor debe soportar HTTP/3 (QUIC) y la extensión WebTransport. Bibliotecas como &lt;code&gt;quic-go&lt;/code&gt; en Go, &lt;code&gt;wtransport&lt;/code&gt; en Rust o &lt;code&gt;@fails-components/webtransport&lt;/code&gt; en Node ya lo implementan con APIs estables. Cloudflare Workers y Deno también exponen WebTransport server-side sin librerías externas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Funciona detrás de proxies corporativos?
&lt;/h3&gt;

&lt;p&gt;QUIC corre sobre UDP en el puerto 443. Algunos firewalls corporativos bloquean UDP saliente, lo que rompe WebTransport. En esos casos los navegadores caen a HTTP/2 sobre TCP donde sea posible, o directamente fallan. Si tu producto vende a empresas reguladas, mantené un fallback a WebSocket sí o sí.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿WebTransport es siempre más rápido que WebSocket?
&lt;/h3&gt;

&lt;p&gt;No siempre. En conexiones perfectas y mensajes pequeños la diferencia es mínima y a veces favorece a WebSocket por menor overhead. La ganancia se ve en redes con pérdida de paquetes, dispositivos móviles que cambian de red, o aplicaciones con muchos streams paralelos donde TCP genera head-of-line blocking.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar WebTransport con CDN?
&lt;/h3&gt;

&lt;p&gt;Cloudflare, Fastly y otros CDN ya soportan HTTP/3, pero el soporte de WebTransport como tal todavía es desigual. Cloudflare Workers fue el primero entre los grandes proveedores en exponerlo en producción, y suma soporte servidor-a-servidor en 2026 con la nueva ola de productos para agentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo se debugea una conexión WebTransport?
&lt;/h3&gt;

&lt;p&gt;Chrome DevTools tiene una pestaña Network que muestra streams y datagramas individuales con timing detallado. También podés capturar paquetes con Wireshark, que entiende QUIC desde versiones recientes si exportás &lt;code&gt;SSLKEYLOGFILE&lt;/code&gt; desde el navegador para descifrar el tráfico TLS 1.3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/WebTransport_API" rel="noopener noreferrer"&gt;MDN: WebTransport API&lt;/a&gt; — documentación completa de la API en el navegador con ejemplos.- &lt;a href="https://www.w3.org/TR/webtransport/" rel="noopener noreferrer"&gt;W3C: WebTransport&lt;/a&gt; — especificación oficial de la API web.- &lt;a href="https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3" rel="noopener noreferrer"&gt;IETF: WebTransport over HTTP/3&lt;/a&gt; — draft del protocolo de transporte.- &lt;a href="https://web.dev/articles/webtransport" rel="noopener noreferrer"&gt;web.dev: Experimenting with WebTransport&lt;/a&gt; — guía práctica de Google con ejemplos cliente y servidor.- &lt;a href="https://caniuse.com/webtransport" rel="noopener noreferrer"&gt;Can I use: WebTransport&lt;/a&gt; — tabla actualizada de soporte por navegador.- &lt;a href="https://github.com/w3c/webtransport" rel="noopener noreferrer"&gt;GitHub: w3c/webtransport&lt;/a&gt; — repositorio oficial del estándar y discusiones abiertas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Anthropic ficha el data center de SpaceX para expandir Claude</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Fri, 08 May 2026 14:17:09 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/anthropic-ficha-el-data-center-de-spacex-para-expandir-claude-1bj8</link>
      <guid>https://forem.com/lu1tr0n/anthropic-ficha-el-data-center-de-spacex-para-expandir-claude-1bj8</guid>
      <description>&lt;p&gt;La carrera por la capacidad de cómputo en inteligencia artificial sumó este 8 de mayo un capítulo inesperado: &lt;strong&gt;Anthropic&lt;/strong&gt;, la empresa creadora de Claude, está accediendo a infraestructura de data center asociada a &lt;strong&gt;SpaceX&lt;/strong&gt; para expandir la capacidad de servir su modelo a empresas, desarrolladores y agentes autónomos. La noticia, difundida por medios financieros como TradingView, confirma una tendencia que venía marcándose desde hace meses: los laboratorios de IA punteros ya no compiten solo por talento o por datos, compiten por &lt;em&gt;watts, GPUs y suelo industrial&lt;/em&gt;. Y para conseguirlos, están firmando alianzas con jugadores que hace cinco años nadie habría imaginado en el tablero. La alianza Anthropic SpaceX no es un acuerdo de marketing: es una respuesta directa al cuello de botella físico que está limitando el despliegue de modelos como Claude Opus, Claude Sonnet y Claude Haiku, hoy presentes en flujos productivos de bancos, startups, gobiernos y herramientas de programación en todo el mundo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué pasó: Anthropic accede al data center de SpaceX
&lt;/h2&gt;

&lt;p&gt;Según los reportes publicados durante la primera semana de mayo de 2026, Anthropic firmó un acuerdo con SpaceX para hacer uso de capacidad en uno de los centros de datos del operador espacial en territorio estadounidense. El movimiento se suma a la red de proveedores de cómputo que la compañía ya utiliza, que incluye relaciones públicas con Amazon Web Services y Google Cloud, además de hardware especializado de Trainium e Inferentia.&lt;/p&gt;

&lt;p&gt;La compañía liderada por Dario Amodei no ha publicado el detalle financiero del trato, pero analistas del sector estiman que se trata de un acuerdo plurianual orientado a aliviar la presión de inferencia sobre el modelo Claude, que en 2026 maneja un volumen de tokens diarios sin precedentes. La adopción masiva de la API por parte de plataformas como Cursor, Windsurf, Vercel, Replit y un creciente número de agentes autónomos basados en MCP ha multiplicado la demanda de capacidad.&lt;/p&gt;

&lt;p&gt;El acuerdo Anthropic SpaceX responde al cuello de botella global de capacidad para servir modelos como Claude.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto: la carrera global por la infraestructura de IA
&lt;/h2&gt;

&lt;p&gt;Para entender por qué este acuerdo importa, hay que mirar el tablero completo. Desde 2023, los laboratorios de IA empezaron a darse cuenta de que el factor limitante no iba a ser la algoritmia, sino la capacidad física: hectáreas de tierra, gigavatios de electricidad estable, líneas de alta tensión y, sobre todo, GPUs Nvidia. La demanda creció más rápido que la oferta. Microsoft anunció su proyecto Stargate con OpenAI con un compromiso de inversión que en algunos reportes superó los 100 mil millones de dólares. Google reaccionó duplicando la producción de TPUs en sus instalaciones propias. Meta construyó Hyperion en Luisiana. Y los hyperscalers &lt;em&gt;compraron literalmente reactores nucleares&lt;/em&gt; para asegurarse el suministro eléctrico.&lt;/p&gt;

&lt;h3&gt;
  
  
  Por qué entra SpaceX en este negocio
&lt;/h3&gt;

&lt;p&gt;SpaceX, hasta ahora vista como una empresa de cohetes y satélites, ha estado discretamente construyendo activos compatibles con la operación de data centers: terrenos amplios en Texas y Florida cerca de Starbase y Cape Canaveral, contratos de energía a gran escala, una red Starlink propia que reduce dependencia de proveedores tradicionales de fibra, y experiencia gestionando sistemas de cómputo críticos para misiones espaciales. La compañía empezó a explorar formalmente el negocio de cómputo de IA durante 2025, en parte gracias a las sinergias con xAI, el laboratorio de Elon Musk dueño de Grok.&lt;/p&gt;

&lt;p&gt;El movimiento de Anthropic, sin embargo, es más interesante por lo que dice del mercado. Anthropic compite directamente con xAI en varios benchmarks. Que decida confiar parte de su capacidad de servir Claude a infraestructura conectada al ecosistema Musk envía un mensaje pragmático: la guerra por GPUs trasciende las afinidades corporativas. Hoy, quien tiene capacidad lista &lt;em&gt;vende&lt;/em&gt;, sin importar la rivalidad de productos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; En 2026 ya no hay un mercado de infraestructura para IA: hay un &lt;em&gt;mercado de favores con contrato&lt;/em&gt;, donde quien firma primero asegura GPUs por años. El acuerdo Anthropic SpaceX se entiende mejor desde esa óptica.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Datos y cifras del ecosistema de cómputo IA
&lt;/h2&gt;

&lt;p&gt;Algunos números ayudan a dimensionar la presión que enfrenta Anthropic. Claude superó los 19 millones de usuarios activos mensuales en su aplicación durante 2025, según métricas de adopción reportadas en la prensa especializada. La API ha sido adoptada por más del 60% de las nuevas startups del último batch de Y Combinator. La función de &lt;em&gt;computer use&lt;/em&gt; y los agentes basados en MCP están impulsando flujos donde un solo usuario consume 10 a 50 veces más tokens que un usuario tradicional de chat.&lt;/p&gt;

&lt;p&gt;En paralelo, el costo del cómputo cayó solo de forma marginal. Una GPU H200 sigue costando entre 30 y 40 mil dólares, una B200 más del doble, y el plazo de entrega de Nvidia se mide en trimestres, no en semanas. La energía es el segundo cuello de botella: un data center moderno de IA consume entre 100 y 500 megavatios, suficiente para abastecer ciudades enteras. Por eso quien tenga acceso temprano a kilovatios firmes, está vendiendo oro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué SpaceX entra al juego de la IA
&lt;/h2&gt;

&lt;p&gt;SpaceX trae al ecosistema cuatro activos no triviales. Primero, terrenos industriales con permisos ya tramitados para uso intensivo de energía, herencia de su operación de cohetería. Segundo, capacidad de generar y consumir grandes cantidades de electricidad sin depender de la red pública en algunos casos. Tercero, Starlink: la red satelital permite que sus data centers tengan opciones de respaldo de conectividad únicas, lo que reduce el riesgo operacional para clientes que sirven cargas críticas. Cuarto, ingeniería de sistemas de altísimo rendimiento, con experiencia en operar hardware en condiciones extremas.&lt;/p&gt;

&lt;p&gt;SpaceX combina experiencia energética, terreno industrial y conectividad satelital para entrar al negocio de cómputo de IA.&lt;/p&gt;

&lt;h2&gt;
  
  
  Impacto y análisis: qué significa para Claude
&lt;/h2&gt;

&lt;p&gt;Para los usuarios finales y para los desarrolladores, el acuerdo Anthropic SpaceX se traduce en cuatro implicaciones concretas. La primera es &lt;strong&gt;menor latencia&lt;/strong&gt; en momentos de alto tráfico, porque Anthropic puede balancear carga entre más data centers regionales. La segunda es &lt;strong&gt;mayor disponibilidad&lt;/strong&gt;: las caídas y rate limits que afectaron a la API durante 2025 deberían volverse menos frecuentes. La tercera es &lt;strong&gt;tiers de servicio nuevos&lt;/strong&gt;: con más capacidad, Anthropic puede ofrecer batch jobs más generosos, ventanas de contexto efectivamente más usables y agentes con sesiones largas sin estrangular el throughput. Y la cuarta es &lt;strong&gt;presión a la baja en precios&lt;/strong&gt; a mediano plazo, aunque el corto plazo seguirá dominado por el costo del hardware.&lt;/p&gt;

&lt;p&gt;El siguiente diagrama resume cómo se conectan los actores del acuerdo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dot"&gt;&lt;code&gt;&lt;span class="k"&gt;graph&lt;/span&gt; &lt;span class="nv"&gt;LR&lt;/span&gt;
  &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Anthropic&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"SpaceX Data Center"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;B&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"GPUs + energia"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;C&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Claude&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;D&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;E&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Usuarios y agentes"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nv"&gt;D&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;F&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"API empresarial"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para los desarrolladores que construyen sobre la API de Claude, el cambio será silencioso pero importante. Un endpoint más confiable significa poder ofrecer SLAs más agresivos a clientes empresariales. Para quienes operan agentes basados en computer use o herramientas, significa poder dejar correr loops más largos sin chocar contra rate limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implicaciones para desarrolladores en LATAM
&lt;/h2&gt;

&lt;p&gt;El acuerdo Anthropic SpaceX no incluye, hasta donde se sabe, infraestructura específica en Latinoamérica. La región sigue dependiendo de regiones de AWS y GCP en Estados Unidos para servir Claude, lo que se traduce en latencias de entre 80 y 180 milisegundos para usuarios en México, Brasil, Argentina o El Salvador. Más capacidad agregada en Norteamérica, sin embargo, sí beneficia indirectamente a la región: menos congestión en horas pico, menos errores 529 y mejor disponibilidad para los workflows automatizados que muchas startups latinoamericanas ya usan en producción.&lt;/p&gt;

&lt;p&gt;El siguiente snippet muestra cómo verificar el estado de la API y configurar reintentos elegantes en Python, una práctica que se vuelve menos crítica conforme la capacidad mejora, pero que sigue siendo recomendable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Anthropic&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_with_retry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_retries&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;max_tokens&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;role&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;max_retries&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;raise&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;attempt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Si tu producto sirve usuarios en LATAM, configurá un proxy de cache y un sistema de reintentos exponenciales como el de arriba. Aún cuando Anthropic expanda capacidad, la latencia transcontinental seguirá siendo tu enemigo principal.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;El acuerdo abre tres preguntas que el sector responderá en los próximos meses. La primera: ¿se sumarán otros laboratorios al modelo de comprar capacidad a operadores no tradicionales como SpaceX, o será un caso aislado? La segunda: ¿qué tan profundo es el compromiso de SpaceX con el negocio de cómputo, y veremos a Starlink ofrecer servicios de inferencia distribuida? La tercera, más estratégica: si la infraestructura crítica para servir IA termina concentrada en pocas manos, ¿qué presiones regulatorias enfrentará el sector? El Departamento de Justicia de Estados Unidos y la Comisión Europea ya están revisando los acuerdos entre Microsoft y OpenAI; un patrón similar con Anthropic y SpaceX podría reabrir el debate antimonopolio que rondó al sector tecnológico durante toda la década pasada.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿El acuerdo Anthropic SpaceX significa que Claude se entrenará en hardware de SpaceX?
&lt;/h3&gt;

&lt;p&gt;Los reportes apuntan a uso de infraestructura para servir el modelo, es decir, inferencia, más que entrenamiento. El entrenamiento de los modelos fundacionales de Anthropic sigue corriendo principalmente en clústers de Trainium y GPUs en regiones de AWS y Google Cloud.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Mejorará la latencia para usuarios en Latinoamérica?
&lt;/h3&gt;

&lt;p&gt;Indirectamente. La capacidad agregada está en Norteamérica, pero al reducir la congestión global, los usuarios latinoamericanos verán menos errores y mejor consistencia en horas pico. La latencia base seguirá determinada por la distancia geográfica.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa con la rivalidad entre Anthropic y xAI, también vinculada a Musk?
&lt;/h3&gt;

&lt;p&gt;El acuerdo es contractual y operativo, no estratégico. SpaceX y xAI son empresas distintas con accionistas comunes, pero la operación de un data center se rige por contratos comerciales. Anthropic no comparte modelos ni propiedad intelectual con SpaceX por usar su infraestructura.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuánto cuesta el acuerdo?
&lt;/h3&gt;

&lt;p&gt;Las cifras no son públicas. Acuerdos comparables en el sector, como los firmados por OpenAI con Oracle o por Meta con CoreWeave, oscilan entre miles de millones de dólares anuales. Es razonable suponer que este acuerdo está en el mismo orden de magnitud.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo afecta esto a desarrolladores que ya usan la API de Claude?
&lt;/h3&gt;

&lt;p&gt;De forma positiva: más capacidad significa menos rate limits, menor probabilidad de errores 529 y mejor estabilidad para flujos de agentes. Conviene mantener buenas prácticas de reintentos exponenciales y caches, pero el ambiente operativo debería ser progresivamente más confiable.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Es probable que veamos más alianzas de este tipo?
&lt;/h3&gt;

&lt;p&gt;Sí. La oferta de cómputo para IA está restringida y todos los laboratorios punteros buscan cualquier fuente con permisos, energía y GPUs disponibles. Es esperable ver acuerdos con operadores de telecomunicaciones, energéticas y empresas industriales reconvertidas a data centers durante el resto de 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://news.google.com/rss/articles/CBMiugFBV" rel="noopener noreferrer"&gt;TradingView vía Google News&lt;/a&gt; — Cobertura del acuerdo Anthropic-SpaceX para expansión de capacidad de Claude.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.anthropic.com" rel="noopener noreferrer"&gt;Anthropic&lt;/a&gt; — Sitio oficial de la empresa creadora de Claude, con documentación de modelos y API.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/Anthropic" rel="noopener noreferrer"&gt;Wikipedia: Anthropic&lt;/a&gt; — Resumen histórico de la compañía, sus inversores y su estructura corporativa.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/SpaceX" rel="noopener noreferrer"&gt;Wikipedia: SpaceX&lt;/a&gt; — Antecedentes de SpaceX, sus operaciones e infraestructura industrial.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>ClojureScript 1.12.145: async/await nativo con el hint ^:async</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Fri, 08 May 2026 08:18:39 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/clojurescript-112145-asyncawait-nativo-con-el-hint-async-1k1g</link>
      <guid>https://forem.com/lu1tr0n/clojurescript-112145-asyncawait-nativo-con-el-hint-async-1k1g</guid>
      <description>&lt;p&gt;ClojureScript dio un paso importante en su evolución como lenguaje compilable a JavaScript: la versión 1.12.145, publicada el 7 de mayo de 2026, incorpora soporte nativo para funciones async/await mediante un simple hint de metadata. Para los desarrolladores que escriben &lt;strong&gt;clojurescript async&lt;/strong&gt; y necesitan interactuar con APIs modernas del navegador o librerías basadas en promesas, este cambio elimina la necesidad de envolver código en macros o sumar dependencias externas.&lt;/p&gt;

&lt;p&gt;El anuncio, hecho por el equipo oficial de ClojureScript en su sitio, marca el primer ajuste relevante después de la migración del compilador a ECMAScript 2016 como target. Lo curioso del cambio no es la complejidad técnica, sino lo silencioso de su llegada: una característica que dominó la lista de mejoras más pedidas en la última Clojure Survey termina implementándose con apenas un caracter de notación.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué pasó: ClojureScript 1.12.145 estrena el hint ^:async
&lt;/h2&gt;

&lt;p&gt;El equipo de ClojureScript, mantenido por la comunidad alrededor de Cognitect y respaldado por Rich Hickey, liberó la versión 1.12.145 con un cambio puntual pero de alto impacto: la posibilidad de marcar funciones con metadata &lt;code&gt;^:async&lt;/code&gt; para que el compilador emita una función asíncrona nativa de JavaScript en lugar de la implementación tradicional basada en core.async o macros como las que ofrece la librería &lt;code&gt;promesa&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;El uso es directo. Cuando una función se anota con &lt;code&gt;^:async&lt;/code&gt;, el compilador detecta llamadas a &lt;code&gt;(await ...)&lt;/code&gt; dentro del cuerpo y las traduce a la sintaxis nativa &lt;code&gt;await&lt;/code&gt; de JavaScript. La función resultante es indistinguible de una &lt;code&gt;async function&lt;/code&gt; escrita a mano en JS, lo que significa que se puede pasar a librerías que esperan promesas, encadenar con &lt;code&gt;.then()&lt;/code&gt; o invocar desde código JavaScript externo sin envolturas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;refer-global&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;:only&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="no"&gt;:async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Promise/resolve&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Promise/resolve&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;inc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;))))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El soporte se extiende a los tests con &lt;code&gt;clojure.test&lt;/code&gt;: marcando un &lt;code&gt;deftest&lt;/code&gt; con &lt;code&gt;^:async&lt;/code&gt;, el harness de pruebas espera correctamente la resolución de promesas antes de evaluar las aserciones. Esto resuelve uno de los puntos más frustrantes del testing en ClojureScript, donde los tests asincrónicos requerían setup adicional o macros como &lt;code&gt;async&lt;/code&gt; de cljs.test.&lt;br&gt;
El compilador transforma ^:async en async function nativa de JavaScript.&lt;/p&gt;
&lt;h2&gt;
  
  
  Contexto e historia: ClojureScript y la deuda con JavaScript moderno
&lt;/h2&gt;

&lt;p&gt;ClojureScript nació en 2011 como una variante del lenguaje Clojure que compila a JavaScript. Durante más de una década, el equipo se mantuvo conservador con el target del compilador, generando código compatible con navegadores antiguos para garantizar la portabilidad. La consecuencia: features modernas de JavaScript como &lt;code&gt;async/await&lt;/code&gt;, &lt;code&gt;Symbol&lt;/code&gt;, generadores nativos o &lt;code&gt;BigInt&lt;/code&gt; no estaban disponibles directamente desde el lenguaje.&lt;/p&gt;

&lt;p&gt;Quienes querían usar promesas en ClojureScript tenían tres caminos. El primero, core.async, ofrecía channels y go blocks pero introducía un modelo mental distinto al de la comunidad JavaScript. El segundo, librerías como &lt;code&gt;promesa&lt;/code&gt; de Funcool, daban macros como &lt;code&gt;p/let&lt;/code&gt; que simulaban await pero requerían adoptar una dependencia externa. El tercero, el más sucio, era escribir &lt;code&gt;.then&lt;/code&gt; manual con callbacks anidados.&lt;/p&gt;

&lt;p&gt;El salto a ECMAScript 2016 como target del compilador, que ocurrió en una versión anterior, abrió la puerta a aprovechar features modernas. El equipo dejó claro que la elección sería selectiva: no todo lo nuevo de JavaScript se incorporaría por defecto, solo aquello que aportara valor real a la interop. Las funciones async cumplen ese criterio porque son hoy el estándar de facto para trabajar con APIs del navegador, fetch, IndexedDB, Web Workers y la mayoría de librerías npm.&lt;/p&gt;
&lt;h2&gt;
  
  
  Datos y cifras: el hint ^:async en la práctica
&lt;/h2&gt;

&lt;p&gt;La implementación es minimalista. El hint &lt;code&gt;^:async&lt;/code&gt; es metadata estándar de Clojure que se aplica a la función. Cuando el compilador procesa la definición, verifica esta metadata y genera código JavaScript con la palabra reservada &lt;code&gt;async&lt;/code&gt; en la declaración. Las llamadas a &lt;code&gt;(await expr)&lt;/code&gt; dentro del cuerpo se traducen a la expresión &lt;code&gt;await expr&lt;/code&gt; de JavaScript, respetando el ámbito léxico.&lt;/p&gt;

&lt;p&gt;Tres detalles técnicos que vale destacar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Closures internas no heredan&lt;/strong&gt; — Una función anónima creada dentro del cuerpo de una función async no es automáticamente async. El ejemplo del anuncio lo deja claro: &lt;code&gt;(fn [] 20)&lt;/code&gt; dentro de &lt;code&gt;foo&lt;/code&gt; sigue siendo síncrona y no admite &lt;code&gt;await&lt;/code&gt;.- &lt;strong&gt;Compatible con apply&lt;/strong&gt; — El test del anuncio muestra que se puede invocar la función async con &lt;code&gt;apply&lt;/code&gt; y la promesa resultante funciona igual: &lt;code&gt;(await (apply foo [10]))&lt;/code&gt; devuelve el mismo valor que la llamada directa.- &lt;strong&gt;Manejo de errores con try/catch&lt;/strong&gt; — Los rechazos de promesas se propagan como excepciones dentro del bloque async, capturables con &lt;code&gt;(catch :default _ ...)&lt;/code&gt; de manera idéntica a un try/catch sincrónico, lo que mantiene consistencia con el resto del lenguaje.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Si vienes de core.async, no hace falta migrar todo. Las funciones async y los go blocks pueden convivir en el mismo proyecto. Usá ^:async para interop con APIs basadas en promesas y core.async para flujos de datos internos con backpressure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sobre el contribuidor: el cambio fue aportado por Michiel Borkent, una figura conocida en la comunidad Clojure. Borkent es el creador de Babashka, nbb y squint, herramientas que ya ofrecían interop con async/await fuera del compilador oficial. Que la implementación canónica venga de su mano da continuidad técnica entre los proyectos del ecosistema y reduce la fragmentación.&lt;/p&gt;
&lt;h2&gt;
  
  
  Impacto y análisis: por qué importa para LATAM
&lt;/h2&gt;

&lt;p&gt;Para los equipos que usan ClojureScript en producción —en LATAM se concentran en startups financieras de Argentina y Brasil, agencias de Chile y Colombia, y proyectos de gobierno digital en México y Uruguay— el impacto es práctico y medible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Menos código boilerplate&lt;/strong&gt; — Reemplazar &lt;code&gt;p/let&lt;/code&gt; de promesa o canales de core.async por &lt;code&gt;^:async&lt;/code&gt; y &lt;code&gt;await&lt;/code&gt; reduce líneas y simplifica el flujo de control.- &lt;strong&gt;Menor superficie de dependencias&lt;/strong&gt; — Cada librería externa es deuda técnica futura. Tener async/await nativo significa una dependencia menos en el bundle final, lo que también reduce tamaño descargado para usuarios con conexiones lentas, un factor relevante en mercados con redes móviles dominantes.- &lt;strong&gt;Mejor onboarding&lt;/strong&gt; — Los desarrolladores nuevos que llegan desde JavaScript o TypeScript reconocen &lt;code&gt;async/await&lt;/code&gt; al instante. La curva de aprendizaje del paradigma asíncrono se aplana y facilita justificar la adopción del lenguaje en equipos mixtos.- &lt;strong&gt;Tests más simples&lt;/strong&gt; — La integración con &lt;code&gt;deftest&lt;/code&gt; evita el lío de envolver aserciones en callbacks. Un test async se lee como un test síncrono, lo que mejora la mantenibilidad a largo plazo.
Flujo simplificado de una función ^:async interactuando con una API.
Vale poner el cambio en perspectiva. ClojureScript no es un lenguaje masivo. Las estadísticas de descargas en Clojars y Maven Central sugieren que el ecosistema entero suma cerca de 50.000 desarrolladores activos en el mundo, una fracción del millonario universo de JavaScript. Pero los proyectos que lo usan tienden a ser de alta calidad técnica: Nubank construyó su core bancario en Clojure y usa ClojureScript en su frontend, Cognitect (hoy parte de Nubank) lo creó, y CircleCI tuvo gran parte de su pipeline en él durante años.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El impacto, entonces, es de palanca: una mejora pequeña en una herramienta usada por equipos con alto leverage técnico se traduce en miles de horas ahorradas globalmente. Y el patrón de adopción del feature seguirá la misma curva que vimos con TypeScript estricto o ESM en Node: lento al principio, dominante en cuestión de meses una vez que las herramientas tooling se actualizan.&lt;/p&gt;
&lt;h2&gt;
  
  
  Cómo migrar tu código existente
&lt;/h2&gt;

&lt;p&gt;Si ya tenés un proyecto ClojureScript en producción, los pasos para empezar a usar el feature son directos.&lt;/p&gt;
&lt;h3&gt;
  
  
  Instalación: actualizar la dependencia
&lt;/h3&gt;

&lt;p&gt;En tu archivo &lt;code&gt;deps.edn&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:deps&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;org.clojure/clojurescript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:mvn/version&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"1.12.145"&lt;/span&gt;&lt;span class="p"&gt;}}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para Leiningen en &lt;code&gt;project.clj&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;defproject&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mi-proyecto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="no"&gt;:dependencies&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;org.clojure/clojurescript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"1.12.145"&lt;/span&gt;&lt;span class="p"&gt;]])&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para shadow-cljs en &lt;code&gt;shadow-cljs.edn&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:dependencies&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="n"&gt;thheller/shadow-cljs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"2.27.0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;org.clojure/clojurescript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"1.12.145"&lt;/span&gt;&lt;span class="p"&gt;]]}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Primer ejemplo: fetch a una API REST
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;refer-global&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;:only&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="no"&gt;:async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cargar-usuario&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"/api/users/"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;.json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;))]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;.-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="no"&gt;:nombre&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;.-nombre&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="no"&gt;:email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;.-email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)}))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El equivalente con la librería &lt;code&gt;promesa&lt;/code&gt; requería más código y una dependencia adicional:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight clojure"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;'&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;promesa.core&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;:as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;defn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cargar-usuario&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;p/let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;"/api/users/"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;.json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="no"&gt;:id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;.-id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="no"&gt;:nombre&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;.-nombre&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="no"&gt;:email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;.-email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)}))&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; Toda función que use ^:async retorna una Promise, incluso cuando el cuerpo no espera nada. Quien la consume debe estar preparado para manejarla como promesa. Esto puede romper código existente que asumía retorno sincrónico — revisá los call sites antes de migrar masivamente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Diagrama: cómo se compila una función async
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
    A["Codigo CLJS con metadata async"] --&amp;gt; B["Compilador ClojureScript 1.12.145"]
    B --&amp;gt; C["Detecta hint async"]
    C --&amp;gt; D["Detecta llamadas await"]
    D --&amp;gt; E["Emite async function de JS"]
    E --&amp;gt; F["JavaScript ejecutable en navegador"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;El equipo de ClojureScript no ha publicado un roadmap detallado, pero el patrón establecido sugiere que vendrán más enhancements de interop con JavaScript moderno. Los candidatos naturales son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generadores nativos&lt;/strong&gt; — Soporte para &lt;code&gt;function*&lt;/code&gt; y &lt;code&gt;yield&lt;/code&gt; de JavaScript, útil para iteradores lazy en interop con librerías que los usan.- &lt;strong&gt;Top-level await&lt;/strong&gt; — Permitir &lt;code&gt;(await ...)&lt;/code&gt; en el toplevel de un namespace para flujos de inicialización con módulos ESM.- &lt;strong&gt;Symbol y WeakRef&lt;/strong&gt; — Mayor cobertura de las primitivas modernas de JavaScript que hoy requieren acceso vía interop directa.- &lt;strong&gt;Mejor source maps para async&lt;/strong&gt; — Las funciones async tradicionalmente complican el debugging; mejorar los mapeos sería un siguiente paso natural para mantener la productividad.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📌 Nota:&lt;/strong&gt; La Clojure Survey 2026 cierra a fines de año. Si querés influir en las prioridades del próximo ciclo, participá. Las features más pedidas se priorizan en el roadmap del año siguiente, como pasó con async/await este año.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para la comunidad hispana, este cambio reduce la fricción para evaluar ClojureScript en proyectos nuevos. Antes, justificar la curva de aprendizaje era difícil cuando había que sumar core.async o promesa al estack mental. Ahora, un desarrollador con experiencia en JavaScript puede leer código ClojureScript async y reconocer la semántica al instante, lo que hace al lenguaje más accesible para equipos sin background previo en Lisp.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Qué versión de Node.js o navegador necesito?
&lt;/h3&gt;

&lt;p&gt;El target ECMAScript 2016 cubre todos los navegadores modernos (Chrome 55+, Firefox 52+, Safari 10.1+, Edge 15+) y Node.js 7.6 o superior. Si tu base de usuarios incluye Internet Explorer 11, necesitarás transpilar el output con Babel o cambiar el target del compilador a una versión anterior de ES.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo seguir usando core.async junto con ^:async?
&lt;/h3&gt;

&lt;p&gt;Sí. Ambos modelos coexisten sin conflicto. core.async sigue siendo la mejor opción para channels con backpressure, sistemas de colas internas y coordinación de procesos largos. Las funciones async/await son ideales para interop con APIs basadas en promesas y operaciones puntuales como fetch o lectura de archivos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Funciona con shadow-cljs y Figwheel?
&lt;/h3&gt;

&lt;p&gt;Sí, el feature está implementado a nivel del compilador de ClojureScript, así que cualquier herramienta de build que use el compilador oficial lo soporta automáticamente. shadow-cljs 2.27 y Figwheel Main son compatibles. Verificá que la versión transitiva de ClojureScript en tu lockfile sea 1.12.145 o superior antes de probar.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿El hint ^:async funciona con multimethods o protocolos?
&lt;/h3&gt;

&lt;p&gt;Solo aplica a funciones declaradas con &lt;code&gt;defn&lt;/code&gt; o &lt;code&gt;fn&lt;/code&gt;. Para multimethods, debés marcar cada implementación específica como async. Para protocolos, el método debe ser declarado async en cada extensión, ya que el compilador genera funciones individuales por implementación de protocolo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo manejo errores en una función ^:async?
&lt;/h3&gt;

&lt;p&gt;Usá &lt;code&gt;try&lt;/code&gt;/&lt;code&gt;catch&lt;/code&gt; dentro del cuerpo de la función. Los rechazos de promesas se transforman en excepciones dentro del scope async. La forma &lt;code&gt;(catch :default e ...)&lt;/code&gt; captura cualquier error, mientras que tipos específicos como &lt;code&gt;(catch js/Error e ...)&lt;/code&gt; filtran por instancia y permiten manejo selectivo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Hay impacto en el tamaño del bundle?
&lt;/h3&gt;

&lt;p&gt;Marginal. Una función async genera código JavaScript ligeramente más largo que la versión equivalente con &lt;code&gt;.then&lt;/code&gt;, pero el ahorro de eliminar dependencias como &lt;code&gt;promesa&lt;/code&gt; (que pesa unos 8KB minificado y gzipped) compensa con creces el incremento. En proyectos medianos, esperá una reducción neta de 3 a 7KB en el bundle final.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://clojurescript.org/news/2026-05-07-release" rel="noopener noreferrer"&gt;ClojureScript 1.12.145 Release Notes&lt;/a&gt; — Anuncio oficial del equipo de ClojureScript con el detalle del hint ^:async.- &lt;a href="https://github.com/clojure/clojurescript" rel="noopener noreferrer"&gt;Repositorio oficial de ClojureScript en GitHub&lt;/a&gt; — Código fuente del compilador, changelog completo y issue tracker público.- &lt;a href="https://clojurescript.org/reference/quick-start" rel="noopener noreferrer"&gt;Guía Quick Start de ClojureScript&lt;/a&gt; — Documentación oficial para empezar a usar el lenguaje desde cero.- &lt;a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/async_function" rel="noopener noreferrer"&gt;MDN: async function en JavaScript&lt;/a&gt; — Referencia técnica de la palabra reservada async en ECMAScript.- &lt;a href="https://clojure.org/about/clojurescript" rel="noopener noreferrer"&gt;Sobre ClojureScript en clojure.org&lt;/a&gt; — Filosofía de diseño y relación con el lenguaje Clojure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Taskflow Agent de GitHub Security Lab: el framework MCP que descubrió 80+ vulnerabilidades reales con LLMs y YAML declarativo</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Fri, 08 May 2026 02:17:48 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/taskflow-agent-de-github-security-lab-el-framework-mcp-que-descubrio-80-vulnerabilidades-reales-3bin</link>
      <guid>https://forem.com/lu1tr0n/taskflow-agent-de-github-security-lab-el-framework-mcp-que-descubrio-80-vulnerabilidades-reales-3bin</guid>
      <description>&lt;p&gt;El &lt;strong&gt;14 de enero de 2026&lt;/strong&gt;, GitHub Security Lab publicó en su blog el lanzamiento del &lt;strong&gt;&lt;a href="https://github.com/GitHubSecurityLab/seclab-taskflow-agent" rel="noopener noreferrer"&gt;Taskflow Agent&lt;/a&gt;&lt;/strong&gt;, un framework open source bajo licencia MIT para realizar &lt;strong&gt;investigación de seguridad asistida por modelos de lenguaje grandes&lt;/strong&gt;. Cuatro meses después, los autores publicaron una &lt;a href="https://github.blog/security/ai-supported-vulnerability-triage-with-the-github-security-lab-taskflow-agent/" rel="noopener noreferrer"&gt;actualización detallada el 20 de enero&lt;/a&gt; reportando que el framework, junto con varios taskflows especializados, ya había llevado al equipo a &lt;strong&gt;descubrir aproximadamente 30 vulnerabilidades reales&lt;/strong&gt; triando alertas de CodeQL en proyectos open source. La cifra acumulada al momento del análisis posterior cruzaba los &lt;strong&gt;80 issues de seguridad reportados&lt;/strong&gt;, con cerca de &lt;strong&gt;20 divulgados públicamente&lt;/strong&gt;, tras una revisión humana cuidadosa de cada hallazgo. La versión más reciente al día de hoy es &lt;strong&gt;v0.3.1&lt;/strong&gt; (publicada el 7 de abril de 2026), y el proyecto está en desarrollo activo.&lt;/p&gt;

&lt;p&gt;La pieza es relevante por una razón concreta. Mientras varias empresas de seguridad están empujando agentes IA propietarios para auditoría de código —cerrados, opacos y con licencias enterprise—, el equipo de GitHub Security Lab tomó la posición opuesta. &lt;strong&gt;Kevin Backhouse&lt;/strong&gt;, que lidera la iniciativa con &lt;strong&gt;Peter Stöckli&lt;/strong&gt; y &lt;strong&gt;Man Yue Mo&lt;/strong&gt; como contribuidores principales, lo dijo sin rodeos en el &lt;a href="https://github.blog/security/community-powered-security-with-ai-an-open-source-framework-for-security-research/" rel="noopener noreferrer"&gt;post de anuncio&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Many of the agentic security tools that are currently popping up are closed-source black boxes, which is the antithesis of what we stand for."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El proyecto continúa la línea editorial de seguridad de este blog —los posts recientes sobre Apache HTTP Server 2.4.67, pnpm 11 y la doble ola TeamPCP/Trivy— con una pieza que cubre un ángulo distinto: &lt;strong&gt;cómo se está construyendo la próxima generación de herramientas de auditoría asistida por IA, en abierto, con código que cualquier equipo puede correr en su propio CI&lt;/strong&gt;. Vamos a desarmar el proyecto: qué hace exactamente, qué arquitectura usa, qué resultados ya produjo, cómo se instala y se corre, y dónde están las limitaciones que el propio equipo señala.&lt;/p&gt;

&lt;h2&gt;
  
  
  La premisa: encodear conocimiento de seguridad como YAML
&lt;/h2&gt;

&lt;p&gt;La idea estructural detrás del framework es &lt;strong&gt;convertir el conocimiento de un investigador de seguridad en un archivo YAML que un agente pueda ejecutar&lt;/strong&gt;. Esa abstracción se llama &lt;strong&gt;taskflow&lt;/strong&gt;: una secuencia ordenada de tareas, donde cada tarea tiene un agente con instrucciones específicas, accede a un conjunto definido de herramientas, y produce un output que la siguiente tarea consume. La construcción es declarativa: el investigador describe &lt;strong&gt;qué&lt;/strong&gt; hacer, no cómo. El framework se encarga del orquestado, validación de schemas, manejo de errores y reintentos.&lt;/p&gt;

&lt;p&gt;La diferencia con el enfoque "single big prompt" —el patrón más común cuando se prototipa con LLMs— es que &lt;strong&gt;un taskflow descompone el problema en pasos pequeños y verificables&lt;/strong&gt;. Un agente de threat modelling produce una lista de componentes y entry points; otro propone tipos de vulnerabilidades plausibles para cada componente; un tercero audita rigurosamente cada propuesta exigiendo evidencia concreta —file paths, line numbers, snippets de código relevante—. Esa estructura tiene dos consecuencias prácticas. Primero, &lt;strong&gt;reduce alucinaciones&lt;/strong&gt;: cada agente está encerrado en un alcance pequeño donde es harder confundirse. Segundo, &lt;strong&gt;el output es auditable&lt;/strong&gt;: el investigador humano puede revisar cada paso intermedio en lugar de pedirle al modelo que justifique una conclusión final retroactivamente.&lt;/p&gt;

&lt;p&gt;La cita de Man Yue Mo y Peter Stöckli en el post de actualización resume bien la apuesta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Large language models (LLMs) excel at matching the fuzzy patterns that traditional tools struggle with."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Los SAST tradicionales son excelentes para patrones estructurales —tainted data flow, missing null checks, control flow inseguro—. Los LLMs son excelentes para patrones semánticos —"esta función parece manejar autenticación pero no valida que el &lt;code&gt;user_id&lt;/code&gt; provenga de una sesión legítima"—. El framework es la pieza que conecta esa capacidad semántica con la rigurosidad operativa que un workflow de seguridad real exige.&lt;/p&gt;

&lt;h2&gt;
  
  
  Arquitectura técnica: qué corre por debajo
&lt;/h2&gt;

&lt;p&gt;El &lt;a href="https://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/main/README.md" rel="noopener noreferrer"&gt;README del repositorio&lt;/a&gt; deja explícito el stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lenguaje&lt;/strong&gt;: Python ≥ 3.10&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SDK base&lt;/strong&gt;: &lt;a href="https://openai.github.io/openai-agents-python/" rel="noopener noreferrer"&gt;OpenAI Agents SDK&lt;/a&gt;, la librería oficial de OpenAI para construir agentes con tool calling y handoffs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validación de grammar&lt;/strong&gt;: Pydantic v2, para que cada YAML cumpla un schema estricto antes de ejecutarse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Templating&lt;/strong&gt;: Jinja2, para interpolar variables y reusar fragmentos entre tareas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI&lt;/strong&gt;: Typer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build system&lt;/strong&gt;: Hatch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP-enabled&lt;/strong&gt;: el agente puede consumir y exponer herramientas vía Model Context Protocol, lo que lo hace interoperable con otros agentes del ecosistema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La elección del OpenAI Agents SDK como base merece nota: &lt;strong&gt;no es una limitación a usar GPT exclusivamente&lt;/strong&gt;. La capa de modelos es configurable mediante archivos &lt;code&gt;model_config&lt;/code&gt; que permiten especificar diferentes APIs y endpoints. El framework soporta tanto la API "Chat Completions" tradicional como la API "Responses" más nueva. Modelos como &lt;strong&gt;gpt-4.1&lt;/strong&gt; y &lt;strong&gt;gpt-5.1&lt;/strong&gt; están listados en los configs por default, pero el sistema acepta configuraciones para Claude, Gemini u otros proveedores compatibles con el protocolo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo se ve un taskflow
&lt;/h2&gt;

&lt;p&gt;La estructura de un archivo taskflow es un YAML con un header obligatorio que declara la versión y el filetype, seguido de una lista de tareas. Una versión simplificada, basada en el formato del repositorio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1.0"&lt;/span&gt;
&lt;span class="na"&gt;filetype&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;taskflow&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;audit-codeql-alert&lt;/span&gt;

&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;REPO_URL&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{REPO_URL}}"&lt;/span&gt;
  &lt;span class="na"&gt;ALERT_ID&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{{ALERT_ID}}"&lt;/span&gt;

&lt;span class="na"&gt;tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gather_info&lt;/span&gt;
    &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;codeql_alert_collector&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;Fetch CodeQL alert {{ALERT_ID}} from {{REPO_URL}}.&lt;/span&gt;
      &lt;span class="s"&gt;List the source, sink, and intermediate steps in the data flow.&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;github_codeql&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;github_repo_reader&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;max_steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-5.1&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;triage&lt;/span&gt;
    &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;false_positive_auditor&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;Given the alert details from the previous task, determine&lt;/span&gt;
      &lt;span class="s"&gt;if this is a true vulnerability or a false positive.&lt;/span&gt;
      &lt;span class="s"&gt;Cite specific code paths and line numbers as evidence.&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;github_repo_reader&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;github_codesearch&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;max_steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;25&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-5.1&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;report&lt;/span&gt;
    &lt;span class="na"&gt;agent&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;report_writer&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;If the auditor confirms the vulnerability, generate a&lt;/span&gt;
      &lt;span class="s"&gt;formal advisory in GHSL format with reproduction steps,&lt;/span&gt;
      &lt;span class="s"&gt;affected versions, and recommended remediation.&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;github_advisory_writer&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;max_steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
    &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-4.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El framework toma este archivo, valida que cumpla el schema con Pydantic, ejecuta cada tarea en orden, pasa el output de una a la siguiente, y maneja recovery si algo falla. La &lt;strong&gt;separación clara entre prompt, herramientas y modelo&lt;/strong&gt; permite que el mismo taskflow corra contra distintos modelos para comparar costos y precisión, o que el equipo experimente con prompts sin tocar la lógica de orquestación.&lt;/p&gt;

&lt;p&gt;Los archivos de &lt;strong&gt;personality&lt;/strong&gt; son una abstracción relacionada: definen comportamiento general de un agente —tono, idioma, restricciones, instrucciones de seguridad— que se reusa entre múltiples taskflows. Las &lt;strong&gt;toolboxes&lt;/strong&gt; describen colecciones de herramientas que un agente puede invocar. Y los &lt;strong&gt;model_configs&lt;/strong&gt; centralizan la configuración de modelos.&lt;/p&gt;

&lt;h2&gt;
  
  
  El proceso de auditoría en tres etapas
&lt;/h2&gt;

&lt;p&gt;El &lt;a href="https://github.blog/security/ai-supported-vulnerability-triage-with-the-github-security-lab-taskflow-agent/" rel="noopener noreferrer"&gt;post de actualización del 20 de enero&lt;/a&gt; documenta el flujo concreto que el equipo usa para triar alertas de CodeQL. Las tres etapas son:&lt;/p&gt;

&lt;h3&gt;
  
  
  Etapa 1: recolección de información
&lt;/h3&gt;

&lt;p&gt;Un agente especializado &lt;strong&gt;lee la alerta de CodeQL en detalle&lt;/strong&gt; —el path de datos taint, los nodos source y sink, los pasos intermedios— y captura el contexto del código fuente. Para una alerta de SQL injection, por ejemplo, recoge la función que recibe input de usuario, los métodos llamados intermedios, y el call site final donde el SQL se ejecuta. La salida de esta etapa es un documento estructurado que la siguiente tarea consume sin tener que volver a leer el repositorio entero.&lt;/p&gt;

&lt;h3&gt;
  
  
  Etapa 2: triage contra criterios de falso positivo
&lt;/h3&gt;

&lt;p&gt;El segundo agente &lt;strong&gt;toma la información recolectada y pasa una checklist de criterios&lt;/strong&gt; que típicamente convierten alertas estáticas en falsos positivos: ¿el flujo está protegido por checks de autorización antes del sink? ¿hay un sanitizador en algún punto intermedio? ¿la entrada está restringida a un contexto privilegiado donde el ataque no es realista? El agente requiere &lt;strong&gt;evidencia concreta&lt;/strong&gt; —no acepta "parece estar protegido"; necesita un nombre de función, un número de línea, un fragmento de código que demuestre la protección—. Si encuentra protección, descarta la alerta como falso positivo. Si no, escala a la siguiente etapa.&lt;/p&gt;

&lt;h3&gt;
  
  
  Etapa 3: generación de reporte
&lt;/h3&gt;

&lt;p&gt;El tercer agente &lt;strong&gt;redacta una advisory en formato GHSL&lt;/strong&gt; —el formato interno de GitHub Security Lab para reportar vulnerabilidades— con repro steps, líneas afectadas, severidad estimada y remediación recomendada. La salida es lo suficientemente completa para que un humano la revise rápido y la transforme en un advisory público o en un report privado al maintainer del proyecto.&lt;/p&gt;

&lt;p&gt;Crucialmente, &lt;strong&gt;el output siempre pasa por revisión humana antes de cualquier disclosure&lt;/strong&gt;. El equipo es explícito en este punto: el framework es una herramienta para acelerar el trabajo del investigador, no para reemplazarlo. Reportar una vulnerabilidad alucinada al maintainer de un proyecto open source destruye la confianza, y eso es exactamente lo que el equipo quiere evitar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resultados concretos: 80+ vulns reportadas, ~20 públicas
&lt;/h2&gt;

&lt;p&gt;Los números reportados al cierre del análisis del 20 de enero son los siguientes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;~30 vulnerabilidades reales descubiertas vía triage automatizado&lt;/strong&gt; desde agosto de 2025&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;80+ issues de seguridad reportados en total&lt;/strong&gt; considerando los taskflows de auditoría web especializados&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~20 disclosures públicos&lt;/strong&gt; ya procesados a través del programa GHSL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Categorías más frecuentes&lt;/strong&gt;: Auth Bypasses, IDORs (Insecure Direct Object References), Token Leaks, XSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un ejemplo público concreto que el blog menciona es &lt;strong&gt;GHSL-2025-110_openlibrary&lt;/strong&gt;, una vulnerabilidad de &lt;strong&gt;cross-site scripting explotable mediante URLs &lt;code&gt;javascript:&lt;/code&gt;&lt;/strong&gt; en el proyecto Open Library. El framework la encontró siguiendo un taskflow especializado en patrones de XSS reflejado a través de redirects.&lt;/p&gt;

&lt;p&gt;La proporción de hallazgos por categoría no es accidental. Las &lt;strong&gt;Auth Bypasses&lt;/strong&gt; y los &lt;strong&gt;IDOR&lt;/strong&gt; son particularmente difíciles para SAST tradicional porque dependen de &lt;strong&gt;lógica de negocio&lt;/strong&gt; —"este endpoint debería verificar que el &lt;code&gt;user_id&lt;/code&gt; del path coincida con la sesión activa, pero no lo hace"— en lugar de patrones sintácticos. Los LLMs leen la intención de un endpoint mejor que un analizador estático, y el framework convierte esa lectura en un workflow operativo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo instalar y correr el framework
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pre-requisitos
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Opción 1: Python local&lt;/span&gt;
python &lt;span class="nt"&gt;--version&lt;/span&gt;  &lt;span class="c"&gt;# debe ser &amp;gt;= 3.10&lt;/span&gt;

&lt;span class="c"&gt;# Opción 2: Docker (más portable)&lt;/span&gt;
docker &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Variables de entorno necesarias
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;AI_API_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GH_TOKEN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El &lt;code&gt;AI_API_TOKEN&lt;/code&gt; es el token que da acceso a &lt;strong&gt;GitHub Models&lt;/strong&gt; —el catálogo de modelos hosteados que GitHub provee gratis dentro de límites generosos para usuarios con licencia Copilot—. El &lt;code&gt;GH_TOKEN&lt;/code&gt; es opcional pero útil para herramientas que consultan la API de GitHub directamente (leer alertas de CodeQL, abrir advisories, listar repos).&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalación desde fuente
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/GitHubSecurityLab/seclab-taskflow-agent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;seclab-taskflow-agent

&lt;span class="c"&gt;# Instalar dependencias con hatch (build system del proyecto)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;hatch
hatch shell

&lt;span class="c"&gt;# Verificar que funciona&lt;/span&gt;
hatch run main &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Ejecutar un taskflow
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Listar taskflows disponibles del repo de ejemplos&lt;/span&gt;
git clone https://github.com/GitHubSecurityLab/seclab-taskflows.git
&lt;span class="nb"&gt;ls &lt;/span&gt;seclab-taskflows/

&lt;span class="c"&gt;# Ejecutar un taskflow específico&lt;/span&gt;
hatch run main &lt;span class="nt"&gt;-t&lt;/span&gt; audit-codeql-alert &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nv"&gt;REPO_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://github.com/some/project &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-g&lt;/span&gt; &lt;span class="nv"&gt;ALERT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;12345

&lt;span class="c"&gt;# O via Docker&lt;/span&gt;
./docker/run.sh &lt;span class="nt"&gt;-t&lt;/span&gt; audit-codeql-alert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Modos de operación
&lt;/h3&gt;

&lt;p&gt;El framework soporta tres modos principales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Standalone con personality&lt;/strong&gt;: invoca un agente con un prompt directo desde CLI, útil para experimentación rápida&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taskflow execution&lt;/strong&gt;: el modo principal, ejecuta un YAML con orquestación multi-agente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent handoff&lt;/strong&gt;: un agente puede delegar control a otro durante la ejecución, útil para flujos de triage donde una tarea inicial decide qué especialista invocar después&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El framework tiene &lt;strong&gt;session recovery&lt;/strong&gt;: si un taskflow falla a mitad de camino, el estado de las tareas completadas se guarda y la ejecución se puede retomar desde el último checkpoint sin re-ejecutar todo desde cero. Para taskflows largos —algunos del repo iteran sobre cientos de archivos— esto es operativamente esencial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo se usa con los &lt;strong&gt;taskflows de ejemplo&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;El &lt;a href="https://github.com/GitHubSecurityLab/seclab-taskflows" rel="noopener noreferrer"&gt;repositorio paralelo &lt;code&gt;seclab-taskflows&lt;/code&gt;&lt;/a&gt; contiene flujos de trabajo concretos que el equipo de GitHub Security Lab usa internamente. Algunos ejemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Triage de alertas CodeQL&lt;/strong&gt;: el flujo descrito en las tres etapas más arriba.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Variant analysis&lt;/strong&gt;: dado un CVE conocido, buscar variantes del mismo bug en otros proyectos open source que compartan dependencias o patrones similares.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditoría de seguridad web&lt;/strong&gt;: especializado en encontrar XSS, IDOR, Auth Bypass en aplicaciones web, con conocimiento de patrones específicos de frameworks comunes (Django, Express, Spring, Flask).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Análisis de advisories&lt;/strong&gt;: dado un advisory público reciente, generar reglas CodeQL para detectar el mismo patrón en otros proyectos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cualquier equipo puede clonar este repo, modificar los taskflows para su contexto específico, y agregar los suyos propios. La intención del equipo es que &lt;strong&gt;el repositorio sea un commons de patrones de auditoría&lt;/strong&gt; que la comunidad de seguridad pueda enriquecer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitaciones que el equipo reconoce explícitamente
&lt;/h2&gt;

&lt;p&gt;El blog post no esconde los problemas reales del enfoque:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Costo de tool calls&lt;/strong&gt;. Un taskflow de auditoría profundo puede invocar herramientas decenas o cientos de veces, lo cual consume cuota de modelo significativa. El equipo cita: &lt;em&gt;"Running the taskflows can result in many tool calls, which can easily consume a large amount of quota."&lt;/em&gt; Para investigación interna esto es manejable; para una pequeña empresa que quiera adoptarlo en CI puede ser una sorpresa de costos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Revisión humana obligatoria antes del disclosure&lt;/strong&gt;. Como se mencionó arriba, el equipo nunca reporta directamente lo que el agente produce. Esto &lt;strong&gt;no es opcional&lt;/strong&gt;: alucinaciones siguen ocurriendo y reportar vulns falsos a maintainers de proyectos open source es socialmente costoso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sin validación dinámica&lt;/strong&gt;. El framework analiza código estáticamente; no ejecuta el código en un sandbox, no construye PoCs ejecutables, no confirma que la vulnerabilidad sea explotable más allá del análisis del path de datos. Para muchos casos eso es suficiente; para vulns de race condition o explotabilidad dependiente de timing, no lo es.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dependencia de licencia Copilot&lt;/strong&gt;. Aunque el framework es MIT, el modelo subyacente (vía GitHub Models) requiere una licencia Copilot activa para acceso completo. Esto reduce la barrera para usuarios de Copilot pero no elimina el costo total para proyectos puramente comunitarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparación con herramientas existentes
&lt;/h2&gt;

&lt;p&gt;Herramienta&lt;br&gt;
Tipo&lt;br&gt;
License&lt;br&gt;
Modelo&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semgrep&lt;/strong&gt;&lt;br&gt;
SAST con reglas&lt;br&gt;
Permisivo&lt;br&gt;
Sin LLM&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CodeQL&lt;/strong&gt;&lt;br&gt;
Análisis de queries&lt;br&gt;
Free para OSS&lt;br&gt;
Sin LLM&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Snyk Code DeepCode&lt;/strong&gt;&lt;br&gt;
SAST + ML&lt;br&gt;
Comercial&lt;br&gt;
Propietario&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aikido / GitGuardian&lt;/strong&gt;&lt;br&gt;
DevSecOps&lt;br&gt;
Comercial&lt;br&gt;
Mezcla&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Endor Labs&lt;/strong&gt;&lt;br&gt;
Comercial&lt;br&gt;
Comercial&lt;br&gt;
Propietario&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Taskflow Agent&lt;/strong&gt;&lt;br&gt;
Multi-agente LLM&lt;br&gt;
MIT&lt;br&gt;
Configurable&lt;/p&gt;

&lt;p&gt;El diferenciador es la combinación de &lt;strong&gt;open source + multi-agente + customizable + agnóstico al proveedor de modelo&lt;/strong&gt;. No reemplaza a SAST tradicional, complementa: el patrón típico es usar CodeQL para cobertura masiva (millones de archivos) y Taskflow Agent para triar las alertas que CodeQL produce.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casos de uso donde tiene sentido evaluar el framework hoy
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Equipos de seguridad interna en empresas medianas a grandes&lt;/strong&gt;. Donde el equipo ya tiene CodeQL corriendo y se ahoga en alertas, Taskflow Agent puede recortar el ratio de falsos positivos significativamente y liberar tiempo de los analistas para análisis profundo manual.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Investigadores académicos o bug bounty hunters&lt;/strong&gt;. La capacidad de codificar conocimiento de auditoría en YAMLs reusables permite multiplicar el alcance de un solo investigador. Un patrón que detecta IDOR en endpoints REST puede correrse en miles de proyectos en GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maintainers de proyectos open source críticos&lt;/strong&gt;. Para proyectos que tienen muchos contributors y workflows de PR pesados, integrar un taskflow de auditoría como parte del CI puede atrapar regresiones de seguridad antes del merge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Equipos construyendo sus propios agentes de seguridad&lt;/strong&gt;. El framework es una buena base sobre la cual construir productos custom: el patrón YAML-driven, multi-agente, con MCP, es replicable y el código es abierto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lección de fondo
&lt;/h2&gt;

&lt;p&gt;Hay un punto de gobernanza importante en este lanzamiento que vale la pena retener. &lt;strong&gt;GitHub Security Lab eligió liberar la pieza más valiosa de su trabajo —la abstracción de taskflow para razonamiento de seguridad— como código abierto&lt;/strong&gt;, en un momento donde la mayoría de competidores cerrarían el código y lo monetizarían. La frase de Backhouse —"closed-source black boxes are the antithesis of what we stand for"— es ideológica, pero tiene una dimensión práctica concreta: &lt;strong&gt;la seguridad open source de la próxima década no la van a resolver vendors propietarios sino redes de investigadores compartiendo herramientas en abierto&lt;/strong&gt;. El framework es la apuesta por ese modelo.&lt;/p&gt;

&lt;p&gt;La otra lección es de método. &lt;strong&gt;Descomponer un agente "que audita código" en un workflow de tareas verificables es estructuralmente mejor que perseguir un single mega-prompt&lt;/strong&gt;. El campo de prompting está descubriendo, doloroso paso por doloroso paso, lo que la ingeniería de software ya sabe desde hace cincuenta años: la composición disciplinada de pasos pequeños y testables produce sistemas más confiables que monolitos brillantes. Los taskflows son una pequeña pero efectiva traducción de ese principio al espacio de los agentes IA.&lt;/p&gt;

&lt;p&gt;Y para devs que evalúan integrar IA en su pipeline de seguridad: &lt;strong&gt;clonar el repo, leer un par de taskflows y ejecutar uno contra un proyecto propio es una hora de inversión&lt;/strong&gt; que da un mejor sentido del estado del arte que diez horas leyendo papers o blogs de vendors. La pieza mejor que existe hoy está abierta. Vale la pena tocarla.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fuentes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Security Lab Taskflow Agent — repositorio principal: &lt;a href="https://github.com/GitHubSecurityLab/seclab-taskflow-agent" rel="noopener noreferrer"&gt;https://github.com/GitHubSecurityLab/seclab-taskflow-agent&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;README oficial: &lt;a href="https://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/main/README.md" rel="noopener noreferrer"&gt;https://github.com/GitHubSecurityLab/seclab-taskflow-agent/blob/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Repositorio paralelo de taskflows de ejemplo: &lt;a href="https://github.com/GitHubSecurityLab/seclab-taskflows" rel="noopener noreferrer"&gt;https://github.com/GitHubSecurityLab/seclab-taskflows&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Community-powered security with AI: an open source framework for security research&lt;/em&gt; (Kevin Backhouse, 14 ene 2026): &lt;a href="https://github.blog/security/community-powered-security-with-ai-an-open-source-framework-for-security-research/" rel="noopener noreferrer"&gt;https://github.blog/security/community-powered-security-with-ai-an-open-source-framework-for-security-research/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;AI-supported vulnerability triage with the GitHub Security Lab Taskflow Agent&lt;/em&gt; (Man Yue Mo &amp;amp; Peter Stöckli, 20 ene 2026): &lt;a href="https://github.blog/security/ai-supported-vulnerability-triage-with-the-github-security-lab-taskflow-agent/" rel="noopener noreferrer"&gt;https://github.blog/security/ai-supported-vulnerability-triage-with-the-github-security-lab-taskflow-agent/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;How to scan for vulnerabilities with GitHub Security Lab's open source AI-powered framework&lt;/em&gt;: &lt;a href="https://github.blog/security/how-to-scan-for-vulnerabilities-with-github-security-labs-open-source-ai-powered-framework/" rel="noopener noreferrer"&gt;https://github.blog/security/how-to-scan-for-vulnerabilities-with-github-security-labs-open-source-ai-powered-framework/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Blog — Security tag (todas las publicaciones del Lab): &lt;a href="https://github.blog/tag/github-security-lab/" rel="noopener noreferrer"&gt;https://github.blog/tag/github-security-lab/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI Agents SDK (dependencia upstream): &lt;a href="https://openai.github.io/openai-agents-python/" rel="noopener noreferrer"&gt;https://openai.github.io/openai-agents-python/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wikipedia — GitHub: &lt;a href="https://en.wikipedia.org/wiki/GitHub" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/GitHub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wikipedia — CodeQL: &lt;a href="https://en.wikipedia.org/wiki/CodeQL" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/CodeQL&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wikipedia — Static program analysis: &lt;a href="https://en.wikipedia.org/wiki/Static_program_analysis" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Static_program_analysis&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wikipedia — Cross-site scripting: &lt;a href="https://en.wikipedia.org/wiki/Cross-site_scripting" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Cross-site_scripting&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>ShinyHunters tumba Canvas: 275M usuarios y 9.000 escuelas afectadas</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Fri, 08 May 2026 02:16:40 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/shinyhunters-tumba-canvas-275m-usuarios-y-9000-escuelas-afectadas-2pdf</link>
      <guid>https://forem.com/lu1tr0n/shinyhunters-tumba-canvas-275m-usuarios-y-9000-escuelas-afectadas-2pdf</guid>
      <description>&lt;p&gt;El 7 de mayo de 2026, millones de estudiantes y profesores en todo el mundo se encontraron con un mensaje inesperado al intentar entrar a sus aulas virtuales: Canvas, la plataforma de aprendizaje propiedad de Instructure, estaba caída. Pero no era un fallo técnico cualquiera. &lt;strong&gt;El ataque de ShinyHunters Canvas&lt;/strong&gt; es, según el propio grupo, una de las brechas educativas más grandes de la historia: 275 millones de personas y 9.000 escuelas en la lista de víctimas.&lt;/p&gt;

&lt;p&gt;El mensaje que vieron los usuarios no venía de Instructure. Venía directamente de los atacantes, exigiendo un rescate y poniendo fecha límite: &lt;strong&gt;12 de mayo de 2026&lt;/strong&gt;. Si las instituciones afectadas no negocian para entonces, todos los datos —nombres, correos, números de identificación estudiantil y mensajes privados— se filtrarán públicamente. En esta nota repasamos qué pasó, quiénes son ShinyHunters, qué significa para LATAM y cómo las instituciones educativas pueden prepararse ante un ecosistema en el que los LMS se están volviendo blanco prioritario.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué pasó con Canvas e Instructure
&lt;/h2&gt;

&lt;p&gt;Instructure, la empresa detrás de Canvas LMS, confirmó la semana pasada que sufrió una brecha de seguridad que expuso información sensible de estudiantes: nombres completos, direcciones de correo electrónico, números de ID estudiantil y mensajes intercambiados dentro de la plataforma. La compañía, según su comunicado oficial, &lt;em&gt;desplegó parches para reforzar la seguridad del sistema&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;El problema es que ShinyHunters dice haber regresado. Según el mensaje que apareció publicado en Canvas el jueves, la respuesta de Instructure no fue suficiente:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ShinyHunters ha vulnerado Instructure (otra vez). En lugar de contactarnos para resolverlo, nos ignoraron e hicieron unos "parches de seguridad". Si alguna de las escuelas en la lista afectada quiere prevenir la publicación de sus datos, debe consultar con una firma de asesoría cibernética y contactarnos privadamente vía TOX para negociar. Tienen hasta el final del día del 12 de mayo de 2026 antes de que todo sea filtrado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tras el incidente, Instructure colocó &lt;strong&gt;Canvas, Canvas Beta y Canvas Test en modo mantenimiento&lt;/strong&gt; según su página de status. La empresa anunció que esperaba estar operativa pronto, pero al cierre de esta nota la plataforma seguía intermitente para varias instituciones.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quiénes son ShinyHunters: el ecosistema del ransomware moderno
&lt;/h2&gt;

&lt;p&gt;ShinyHunters no es un grupo nuevo. Su historial de ataques de alto perfil incluye nombres que cualquier persona en tecnología reconoce de inmediato: &lt;strong&gt;Ticketmaster, AT&amp;amp;T, Rockstar Games, ADT y Vercel&lt;/strong&gt;, entre otros. Operan bajo un modelo híbrido que combina extorsión con venta directa de datos en foros del bajo mundo digital.&lt;/p&gt;

&lt;p&gt;El patrón es consistente: identifican un servicio con muchísimos datos personales, encuentran una vía de entrada (suele ser credenciales filtradas, APIs mal configuradas o bibliotecas de terceros con vulnerabilidades), exfiltran silenciosamente, contactan a la víctima y, si no hay respuesta, suben los datos a su sitio de filtraciones.&lt;br&gt;
ShinyHunters acumula víctimas de alto perfil desde 2020.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; ShinyHunters no es una APT estatal ni un colectivo ideológico. Es un grupo motivado financieramente. Eso significa que las decisiones técnicas se toman buscando ROI: atacan donde el costo es bajo y el dato vale mucho. Los LMS educativos cumplen ese perfil al pie de la letra.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  El flujo típico de un ataque ShinyHunters
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
 A["Reconocimiento: APIs, leaks, repos"] --&amp;gt; B["Acceso inicial: credenciales o vuln"]
 B --&amp;gt; C["Exfiltración silenciosa"]
 C --&amp;gt; D["Contacto a la víctima"]
 D --&amp;gt; E{"Hay respuesta?"}
 E -- No --&amp;gt; F["Filtración pública"]
 E -- Si --&amp;gt; G["Negociación privada"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Datos y cifras del ataque
&lt;/h2&gt;

&lt;p&gt;Las cifras que comparten ShinyHunters y reportes como Bleeping Computer pintan una escala difícil de digerir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;275 millones&lt;/strong&gt; de personas afectadas según los atacantes (estudiantes, profesores y personal administrativo).- &lt;strong&gt;9.000 escuelas&lt;/strong&gt; en la lista de víctimas, desde colegios K-12 hasta universidades de alto nivel.- &lt;strong&gt;Tipos de datos comprometidos:&lt;/strong&gt; nombres, correos electrónicos, números de identificación estudiantil y mensajes internos de la plataforma.- &lt;strong&gt;Fecha límite:&lt;/strong&gt; 12 de mayo de 2026, alrededor de cinco días después del anuncio público.- &lt;strong&gt;Estado del servicio:&lt;/strong&gt; Canvas, Canvas Beta y Canvas Test en modo mantenimiento al momento de publicación.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para dimensionar el número: 275 millones es más que la población combinada de México, Argentina, Colombia y Perú. Si la cifra es real —y queda pendiente la verificación independiente— estaríamos ante una de las filtraciones más grandes del sector educativo en la historia, comparable a brechas como la de Equifax (2017) o Yahoo (2013) en términos de volumen de identidades expuestas.&lt;/p&gt;
&lt;h2&gt;
  
  
  Impacto y análisis: por qué los LMS son el nuevo blanco
&lt;/h2&gt;

&lt;p&gt;El sector educativo ha venido escalando como blanco preferido del cibercrimen por tres razones estructurales que no se ven en otros sectores con tanta claridad.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Concentración de datos sensibles de menores de edad
&lt;/h3&gt;

&lt;p&gt;Los LMS guardan información de millones de estudiantes, muchos de ellos menores. La regulación es laxa en muchos países, y los datos de menores tienen un valor especial en el mercado negro porque se usan para abrir cuentas fraudulentas que tardan años en detectarse —el menor descubre el fraude cuando intenta su primera tarjeta de crédito a los 18.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Presupuestos de ciberseguridad limitados
&lt;/h3&gt;

&lt;p&gt;Las universidades y colegios suelen invertir mucho menos en seguridad que las fintech o las grandes tecnológicas. Esto crea una asimetría: alto valor del dato, baja defensa. Es exactamente el tipo de objetivo que un grupo motivado financieramente prioriza.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Tecnología legada y dependencias en cadena
&lt;/h3&gt;

&lt;p&gt;Los LMS frecuentemente integran decenas de plugins, herramientas SCORM, sistemas de calificaciones y APIs de terceros. Cada integración es una superficie de ataque adicional. ShinyHunters históricamente ha explotado este tipo de dependencias —bibliotecas, APIs internas, snippets compartidos en repositorios públicos.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; El ataque a Canvas no es solo un problema de Instructure. Es una señal de que los LMS, por años percibidos como software corporativo aburrido, ahora son infraestructura crítica con perfil de blanco de alto valor.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Implicaciones para LATAM
&lt;/h3&gt;

&lt;p&gt;Canvas tiene presencia importante en Latinoamérica: lo usan instituciones como el Tec de Monterrey, varias universidades en Chile, Argentina y Colombia, y centros K-12 privados en toda la región. Si su institución usa Canvas, los pasos inmediatos son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Verificar comunicación oficial&lt;/strong&gt; de Instructure y de la institución educativa antes de tomar acciones drásticas.- &lt;strong&gt;Cambiar contraseñas&lt;/strong&gt; de la cuenta Canvas y, si se reutilizaron, en otros servicios.- &lt;strong&gt;Activar autenticación de dos factores (2FA)&lt;/strong&gt; donde se ofrezca; muchos LMS lo tienen pero desactivado por defecto.- &lt;strong&gt;Vigilar correos sospechosos:&lt;/strong&gt; los datos filtrados se usan para campañas de phishing dirigidas con información que parece legítima ("hola María, tu profesor de Cálculo II...").- &lt;strong&gt;Para administradores TI:&lt;/strong&gt; revisar logs de acceso de los últimos 90 días, rotar tokens de integración, auditar plugins.
Millones de estudiantes en LATAM dependen de Canvas para sus clases.
## Qué hacer si tu institución usa Canvas: checklist técnico&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para los equipos de TI de instituciones educativas, este es un buen momento para una auditoría rápida. Un script base en Bash para revisar accesos sospechosos en logs de Canvas exportados:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Buscar accesos desde IPs no usuales en los logs de Canvas&lt;/span&gt;
&lt;span class="c"&gt;# Asume export en formato JSON Lines&lt;/span&gt;

jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'. | select(.event_type == "login") | "\(.timestamp) \(.user_id) \(.ip)"'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  canvas_logs.jsonl &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $3}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-50&lt;/span&gt;

&lt;span class="c"&gt;# Detectar exfiltración masiva de archivos&lt;/span&gt;
jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'. | select(.event_type == "file_download") | .user_id'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  canvas_logs.jsonl &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'$1 &amp;gt; 100 {print}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y un snippet de PowerShell para Windows que revisa correos institucionales por dominios spoofed de Instructure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Buscar correos sospechosos que se hagan pasar por Instructure&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-MailboxSearch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Identity&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Phishing-Canvas-2026"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-SearchQuery&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'from:*instructure* OR from:*canvas* AND received&amp;gt;05/05/2026'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-StatusMailRecipients&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;admin&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt;&lt;span class="nx"&gt;institucion.edu&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Qué sigue
&lt;/h2&gt;

&lt;p&gt;Hay tres escenarios posibles en los próximos días.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escenario A: Instructure paga o negocia.&lt;/strong&gt; ShinyHunters retira el dump y no se publica. Los datos siguen en sus manos —y posiblemente en las de quien quiera comprarlos en el futuro. La empresa probablemente nunca confirme públicamente el pago.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escenario B: Instructure no negocia y los datos se filtran el 12 de mayo.&lt;/strong&gt; Esto desencadenaría una avalancha de demandas colectivas, especialmente bajo legislaciones como FERPA en EE.UU., GDPR en Europa y la LFPDPPP en México. El precio de la acción de Instructure (NYSE: INST) se vería golpeado fuerte.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Escenario C: Verificación parcial.&lt;/strong&gt; Investigadores independientes (como troyhunt.com / Have I Been Pwned) confirman que la lista de 9.000 escuelas y 275 millones de usuarios está inflada. Esto ya pasó con otros leaks de ShinyHunters donde el grupo exageró el tamaño del dump para presionar.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Sea cual sea el escenario, asuma que sus datos pueden estar comprometidos y actúe en consecuencia. La gestión defensiva siempre es más barata que la reactiva.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Mi cuenta de Canvas está comprometida?
&lt;/h3&gt;

&lt;p&gt;Si su institución aparece en la lista publicada por ShinyHunters, asuma que sí. Cambie la contraseña, active 2FA y vigile su correo por intentos de phishing. Si su institución no aparece en la lista, monitoree comunicación oficial de Instructure los próximos días.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Quiénes son ShinyHunters?
&lt;/h3&gt;

&lt;p&gt;Es un grupo de cibercriminales motivado financieramente, activo desde 2020. Han atacado a Ticketmaster, AT&amp;amp;T, Rockstar Games, ADT y Vercel, entre otros. Operan bajo modelo de extorsión: exfiltran datos, demandan rescate y, si no pagan, los publican.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué datos exactamente fueron expuestos?
&lt;/h3&gt;

&lt;p&gt;Según Instructure: nombres de estudiantes, correos electrónicos, números de identificación estudiantil y mensajes intercambiados dentro de Canvas. No se ha confirmado exposición de contraseñas, datos financieros o calificaciones, pero la investigación sigue en curso.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué pasa si los datos se filtran el 12 de mayo?
&lt;/h3&gt;

&lt;p&gt;Los datos quedarían disponibles públicamente, lo que aumenta exponencialmente el riesgo de phishing dirigido, robo de identidad y fraude. Especialmente preocupante para menores de edad, cuyos datos se usan para abrir cuentas fraudulentas detectables solo años después.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Existen alternativas a Canvas?
&lt;/h3&gt;

&lt;p&gt;Sí: Moodle (open source, autogestionable), Google Classroom (gratuito para educación), Blackboard, Schoology, D2L Brightspace. Migrar un LMS no es trivial y suele tomar meses, así que esta no es una decisión que se tome ante el primer incidente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo verifico si mi correo aparece en una filtración?
&lt;/h3&gt;

&lt;p&gt;Servicios como Have I Been Pwned (haveibeenpwned.com) suelen indexar las grandes filtraciones poco después de publicarse. Suscríbase con su correo institucional para recibir alertas automáticas en caso de aparecer en futuros dumps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.theverge.com/tech/926458/canvas-shinyhunters-breach" rel="noopener noreferrer"&gt;The Verge — Canvas is down as ShinyHunters threatens to leak schools' data&lt;/a&gt; — Nota original que reportó el incidente y el mensaje de los atacantes.- &lt;a href="https://en.wikipedia.org/wiki/ShinyHunters" rel="noopener noreferrer"&gt;Wikipedia — ShinyHunters&lt;/a&gt; — Historial completo del grupo y sus ataques de alto perfil desde 2020.- &lt;a href="https://www.instructure.com/canvas" rel="noopener noreferrer"&gt;Instructure — Canvas LMS&lt;/a&gt; — Sitio oficial de la plataforma con documentación, status y comunicaciones de seguridad.- &lt;a href="https://news.ycombinator.com/" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt; — Discusión técnica de la comunidad sobre la brecha y mitigaciones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>security</category>
      <category>cybersecurity</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>DuckLake 1.0: el formato de data lake que mueve el catálogo de archivos a SQL y promete 926 más velocidad que Iceberg</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Thu, 07 May 2026 22:19:02 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/ducklake-10-el-formato-de-data-lake-que-mueve-el-catalogo-de-archivos-a-sql-y-promete-926x-mas-28h2</link>
      <guid>https://forem.com/lu1tr0n/ducklake-10-el-formato-de-data-lake-que-mueve-el-catalogo-de-archivos-a-sql-y-promete-926x-mas-28h2</guid>
      <description>&lt;p&gt;El &lt;strong&gt;13 de abril de 2026&lt;/strong&gt;, DuckDB Labs liberó la versión &lt;strong&gt;1.0 de &lt;a href="https://ducklake.select/" rel="noopener noreferrer"&gt;DuckLake&lt;/a&gt;&lt;/strong&gt;, un formato de data lake con &lt;strong&gt;backward-compatibility garantizada&lt;/strong&gt; que rompe con la convención de los últimos cinco años en lakehouses: en lugar de almacenar el catálogo de metadatos como una pila de archivos JSON dispersos en object storage —el patrón que usan &lt;strong&gt;Apache Iceberg&lt;/strong&gt;, &lt;strong&gt;Delta Lake&lt;/strong&gt; y &lt;strong&gt;Apache Hudi&lt;/strong&gt;—, DuckLake &lt;strong&gt;lo guarda en una base de datos relacional&lt;/strong&gt;. La consecuencia técnica es directa, y los benchmarks reportados por el propio equipo son contundentes: &lt;strong&gt;926× más rápido en consultas y 105× más rápido en ingesta&lt;/strong&gt; frente a Iceberg en cargas de trabajo con muchas escrituras pequeñas, según declaraciones de &lt;strong&gt;Pedro Holanda&lt;/strong&gt;, ingeniero principal de DuckDB Labs, recogidas por &lt;a href="https://www.theregister.com/software/2026/04/16/duckdb-uses_rdbms_to_tackle_lakehouse_small_changes_issue/5222357" rel="noopener noreferrer"&gt;The Register&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.infoq.com/news/2026/05/ducklake-sql-catalog/" rel="noopener noreferrer"&gt;InfoQ cubrió el lanzamiento el 2 de mayo&lt;/a&gt;, firmado por Renato Losio. El &lt;a href="https://ducklake.select/2026/04/13/ducklake-10/" rel="noopener noreferrer"&gt;anuncio oficial en ducklake.select&lt;/a&gt; lista las cinco features principales: &lt;strong&gt;data inlining&lt;/strong&gt;, &lt;strong&gt;sorted tables&lt;/strong&gt;, &lt;strong&gt;bucket partitioning&lt;/strong&gt;, soporte completo para tipos &lt;strong&gt;GEOMETRY&lt;/strong&gt; y &lt;strong&gt;VARIANT&lt;/strong&gt;, y &lt;strong&gt;deletion vectors compatibles con Iceberg v3&lt;/strong&gt;. El &lt;a href="https://github.com/duckdb/ducklake" rel="noopener noreferrer"&gt;repositorio público en GitHub&lt;/a&gt; ya está disponible bajo licencia open source y los clientes para &lt;strong&gt;Apache DataFusion&lt;/strong&gt;, &lt;strong&gt;Apache Spark&lt;/strong&gt;, &lt;strong&gt;Trino&lt;/strong&gt; y &lt;strong&gt;Pandas&lt;/strong&gt; son operativos al día del release. &lt;strong&gt;MotherDuck&lt;/strong&gt; ofrece una versión hosteada que gestiona la base de datos del catálogo y el storage subyacente.&lt;/p&gt;

&lt;p&gt;Este artículo explica, en términos accesibles para ingenieros de datos y devs que están evaluando lakehouses para 2026, qué es DuckLake exactamente, qué problema concreto resuelve, cómo se integra con el stack actual, y cuándo conviene preferirlo sobre Iceberg o Delta Lake. La cobertura es continuación natural de la línea editorial dev del blog —los posts recientes sobre Bun→Rust, pnpm 11 y Cloudflare Agents Week— en una pieza que toca el lado de &lt;strong&gt;datos&lt;/strong&gt; que estaba sub-cubierto.&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema que ataca: el "small file problem" en lakehouses
&lt;/h2&gt;

&lt;p&gt;Los lakehouses modernos —&lt;strong&gt;Iceberg&lt;/strong&gt; desde Netflix en 2017, &lt;strong&gt;Delta Lake&lt;/strong&gt; desde Databricks en 2019— resolvieron un problema real: dieron transacciones ACID sobre data lakes que antes eran simplemente "carpetas de archivos Parquet sin orden". Para hacerlo, agregaron una &lt;strong&gt;capa de metadata&lt;/strong&gt; que registra qué archivos componen una tabla en cada momento, qué snapshots existen, qué columnas hay, qué particiones aplican. Esa metadata —archivos JSON, Avro o manifiestos específicos del formato— se guarda &lt;strong&gt;junto a los datos&lt;/strong&gt; en object storage como S3, R2 o GCS.&lt;/p&gt;

&lt;p&gt;El problema aparece cuando el patrón de uso no es "ingesta batch grande cada hora". Si un workload incluye &lt;strong&gt;escrituras pequeñas frecuentes&lt;/strong&gt; —insertar una fila, actualizar diez registros, borrar una tupla— el resultado es que cada operación genera al menos un archivo Parquet nuevo (Parquet está optimizado para millones de filas, no para una sola) más uno o varios archivos de metadata para registrar el cambio. &lt;strong&gt;Hannes Mühleisen&lt;/strong&gt;, cofundador y CEO de DuckDB Labs, lo describió a The Register con esta cita:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"You make a small change to your table, adding a single row, and it affects data lake performance because... a new file has to be written... and then a bunch of metadata."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;El costo se acumula. Tras pocos miles de escrituras pequeñas un usuario termina con &lt;strong&gt;decenas de miles de archivos diminutos&lt;/strong&gt; y consultas que tienen que listar y leer todo ese ruido para responder a una pregunta simple. Las "compaction jobs" que se corren periódicamente para fusionar archivos pequeños en archivos grandes ayudan, pero introducen su propio mantenimiento operacional. Y los object stores cobran por requests: 100.000 archivos pequeños cuestan más que 1.000 archivos grandes con el mismo volumen total de datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  La solución de DuckLake: catálogo en SQL, datos en Parquet
&lt;/h2&gt;

&lt;p&gt;DuckLake invierte la división. &lt;strong&gt;Los datos se siguen guardando como Parquet en object storage&lt;/strong&gt; —compatibilidad total con el ecosistema existente—, pero &lt;strong&gt;el catálogo, los snapshots, los metadatos de schema y la lista de archivos se guardan en una base de datos relacional estándar&lt;/strong&gt;. Los backends soportados oficialmente al día del release 1.0 son tres: &lt;strong&gt;DuckDB&lt;/strong&gt; (sí, DuckDB puede ser su propio catálogo), &lt;strong&gt;PostgreSQL&lt;/strong&gt; y &lt;strong&gt;SQLite&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Esto resuelve el problema de los archivos pequeños de raíz. Cuando llega una escritura de 10 filas, DuckLake &lt;strong&gt;no escribe un Parquet nuevo&lt;/strong&gt;. Acumula esa escritura &lt;strong&gt;dentro de la base de datos del catálogo&lt;/strong&gt; —que está optimizada precisamente para muchas operaciones pequeñas con ACID y transacciones reales—, y solo cuando la acumulación cruza un threshold (default: 10 filas, configurable) descarga las filas a Parquet en object storage. La feature se llama &lt;strong&gt;data inlining&lt;/strong&gt; y es una de las cinco piezas de la 1.0.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Crear una tabla DuckLake usando PostgreSQL como catálogo&lt;/span&gt;
&lt;span class="n"&gt;ATTACH&lt;/span&gt; &lt;span class="s1"&gt;'postgres://user:pwd@host/dbname'&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="k"&gt;catalog&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;TYPE&lt;/span&gt; &lt;span class="n"&gt;POSTGRES&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="k"&gt;catalog&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="n"&gt;VARIANT&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Inserts pequeños quedan inlineados en el catálogo&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;'user-42'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'{"action": "click"}'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="s1"&gt;'user-17'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'{"action": "view"}'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Cuando la acumulación supera el threshold, descarga a Parquet&lt;/span&gt;
&lt;span class="c1"&gt;-- Sin que el usuario tenga que pensarlo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La diferencia operativa para el usuario es &lt;strong&gt;ninguna&lt;/strong&gt;: el SQL es estándar, los datos viven en S3/R2/GCS como siempre, las consultas se responden con Parquet cuando los datos ya están descargados o desde el catálogo cuando todavía no. La diferencia de performance, en cargas de trabajo con muchas escrituras pequeñas, es del orden de los &lt;strong&gt;dos órdenes de magnitud&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Las cinco features de la 1.0 en detalle
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Data inlining
&lt;/h3&gt;

&lt;p&gt;El threshold por defecto es &lt;strong&gt;10 filas&lt;/strong&gt;. Por debajo de eso, las filas viven en la tabla del catálogo. Por encima, se descargan a Parquet. El usuario puede configurar el threshold para subir o bajar la frontera según el patrón de carga: cargas con muchas escrituras pequeñas se benefician de un threshold alto (digamos 1.000), mientras que cargas con muy pocas escrituras pequeñas no necesitan inline en absoluto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sorted tables
&lt;/h3&gt;

&lt;p&gt;DuckLake permite declarar el orden lógico de las filas dentro de cada archivo Parquet, usando ya sea &lt;strong&gt;nombres de columnas&lt;/strong&gt; o &lt;strong&gt;expresiones SQL arbitrarias&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;sales&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;region&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sale_date&lt;/span&gt; &lt;span class="nb"&gt;DATE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="nb"&gt;DECIMAL&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;SORTED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;region&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sale_date&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El motor aprovecha el orden para hacer &lt;strong&gt;file pruning&lt;/strong&gt; y &lt;strong&gt;row-group pruning&lt;/strong&gt; en consultas filtradas. Para una consulta que filtre por &lt;code&gt;region = 'eu'&lt;/code&gt; y &lt;code&gt;sale_date &amp;gt; '2026-01-01'&lt;/code&gt;, el motor lee solo los archivos y row-groups que contienen esas combinaciones, sin escanear el resto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bucket partitioning
&lt;/h3&gt;

&lt;p&gt;Particionado &lt;strong&gt;basado en hash con &lt;code&gt;murmur3&lt;/code&gt;&lt;/strong&gt; —el mismo algoritmo que usa Iceberg, lo cual permite migración bidireccional sin reorganizar archivos—. Útil para columnas de &lt;strong&gt;alta cardinalidad&lt;/strong&gt; como &lt;code&gt;user_id&lt;/code&gt; o &lt;code&gt;session_id&lt;/code&gt; donde el particionado por valor (range) sería ineficiente porque hay millones de valores distintos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tipos GEOMETRY y VARIANT
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;GEOMETRY&lt;/strong&gt; brinda soporte completo para datos espaciales, sin necesidad de extensiones externas como PostGIS para queries geoespaciales básicas. &lt;strong&gt;VARIANT&lt;/strong&gt; es el tipo equivalente a JSON pero con &lt;strong&gt;encoding binario&lt;/strong&gt; y mejor performance. La diferencia importa cuando se almacenan campos semiestructurados —payloads de eventos, metadata flexible— a escala: VARIANT se serializa más rápido y se filtra más rápido que JSON parseado on-the-fly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deletion vectors compatibles con Iceberg v3
&lt;/h3&gt;

&lt;p&gt;DuckLake soporta &lt;strong&gt;deletion vectors&lt;/strong&gt; —el mecanismo donde, en vez de reescribir un archivo Parquet entero al borrar filas, se mantiene un bitmap separado que marca qué filas están eliminadas—. La implementación usa &lt;strong&gt;archivos Puffin&lt;/strong&gt; (formato binario para metadata extensible que Iceberg v3 también usa), lo que mantiene compatibilidad bidireccional con tablas Iceberg.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparativa contra Iceberg y Delta Lake
&lt;/h2&gt;

&lt;p&gt;Dimensión&lt;br&gt;
Iceberg / Delta&lt;br&gt;
DuckLake 1.0&lt;/p&gt;

&lt;p&gt;Catálogo de metadatos&lt;br&gt;
Archivos JSON / Avro en object storage&lt;br&gt;
RDBMS (DuckDB, Postgres, SQLite)&lt;/p&gt;

&lt;p&gt;Manejo de escrituras pequeñas&lt;br&gt;
Crea archivos por operación&lt;br&gt;
Data inlining hasta threshold&lt;/p&gt;

&lt;p&gt;Compaction jobs&lt;br&gt;
Operacionalmente requeridos&lt;br&gt;
Automáticos vía descarga periódica&lt;/p&gt;

&lt;p&gt;Backend de datos&lt;br&gt;
Parquet en S3/R2/GCS&lt;br&gt;
Parquet en S3/R2/GCS (igual)&lt;/p&gt;

&lt;p&gt;Soporte SQL multi-cliente&lt;br&gt;
Sí (Trino, Spark, etc.)&lt;br&gt;
Sí (DataFusion, Spark, Trino, Pandas)&lt;/p&gt;

&lt;p&gt;Time-travel&lt;br&gt;
Sí&lt;br&gt;
Sí, vía &lt;code&gt;ducklake_table_changes()&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Branching de datasets&lt;br&gt;
No nativo&lt;br&gt;
Planeado para v2.0&lt;/p&gt;

&lt;p&gt;Performance escrituras pequeñas&lt;br&gt;
Baseline&lt;br&gt;
~105× faster (Holanda)&lt;/p&gt;

&lt;p&gt;Performance consultas&lt;br&gt;
Baseline&lt;br&gt;
~926× faster (Holanda)&lt;/p&gt;

&lt;p&gt;Es importante calibrar los números. &lt;strong&gt;926× más rápido en consultas no es la diferencia que vas a ver en un benchmark cualquiera&lt;/strong&gt;; es el límite superior medido por el equipo en cargas con muchísimos archivos pequeños donde Iceberg sufre desproporcionadamente. En cargas batch tradicionales —ingesta horaria de millones de filas, sin updates intermedios— la diferencia se reduce a &lt;strong&gt;factores cercanos a la paridad&lt;/strong&gt;, y Iceberg sigue siendo competitivo. La pregunta operativa para un equipo no es "qué formato es más rápido en abstracto" sino "qué formato encaja mejor con mi patrón de uso real".&lt;/p&gt;
&lt;h2&gt;
  
  
  Cómo empezar: implementación paso a paso
&lt;/h2&gt;

&lt;p&gt;Para un equipo que quiere evaluar DuckLake hoy, el camino mínimo es directo.&lt;/p&gt;
&lt;h3&gt;
  
  
  Caso A: solo DuckDB local + filesystem
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instalar DuckDB 1.5.2+ que incluye la extensión DuckLake&lt;/span&gt;
curl https://install.duckdb.org | sh

&lt;span class="c"&gt;# Lanzar shell interactiva&lt;/span&gt;
duckdb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Crear un DuckLake con catálogo SQLite + datos en filesystem local&lt;/span&gt;
&lt;span class="n"&gt;ATTACH&lt;/span&gt; &lt;span class="s1"&gt;'ducklake:/tmp/my_catalog.sqlite'&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;lake&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATA_PATH&lt;/span&gt; &lt;span class="s1"&gt;'/tmp/data/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="n"&gt;lake&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;country&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Ana'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'SV'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Bob'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'US'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;customers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;-- Time-travel: ver cambios en la tabla&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;ducklake_table_changes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'customers'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Caso B: producción con catálogo PostgreSQL + datos en S3 / R2
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- Catalogo en Postgres, datos en R2 de Cloudflare&lt;/span&gt;
&lt;span class="n"&gt;ATTACH&lt;/span&gt; &lt;span class="s1"&gt;'ducklake:postgres://catalog_user:pwd@db.internal/lake_catalog'&lt;/span&gt;
  &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;lake&lt;/span&gt;
  &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATA_PATH&lt;/span&gt; &lt;span class="s1"&gt;'s3://my-bucket/lake/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;ENDPOINT&lt;/span&gt; &lt;span class="s1"&gt;'https://abc123.r2.cloudflarestorage.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;ACCESS_KEY_ID&lt;/span&gt; &lt;span class="s1"&gt;'XXX'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="n"&gt;SECRET&lt;/span&gt; &lt;span class="s1"&gt;'YYY'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;USE&lt;/span&gt; &lt;span class="n"&gt;lake&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="n"&gt;VARIANT&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;SORTED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ts&lt;/span&gt; &lt;span class="k"&gt;DESC&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;PARTITIONED&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;BUCKET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- Inserts pequeños se acumulan, descargas grandes se hacen automáticas&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="s1"&gt;'recent_events.parquet'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Caso C: lectura desde Apache Spark
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyspark.sql&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SparkSession&lt;/span&gt;

&lt;span class="n"&gt;spark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SparkSession&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;spark.jars.packages&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;io.ducklake:ducklake-spark:1.0.0&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;spark.sql.catalog.lake&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;io.ducklake.SparkCatalog&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;spark.sql.catalog.lake.uri&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;postgres://...&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOrCreate&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spark&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT region, SUM(amount) FROM lake.sales GROUP BY region&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Caso D: queries analíticas desde Pandas (ad-hoc)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;duckdb&lt;/span&gt;

&lt;span class="n"&gt;con&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;duckdb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ATTACH &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ducklake:postgres://...&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt; AS lake&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;df&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sql&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT * FROM lake.events WHERE ts &amp;gt; NOW() - INTERVAL 1 DAY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;df&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# df es un DataFrame estándar de Pandas
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Casos de uso donde DuckLake brilla
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cargas con muchas escrituras pequeñas&lt;/strong&gt;. Tablas de eventos donde cada producción de evento es una fila, sistemas de auditoría que registran cambios individuales, dashboards en tiempo real con upserts frecuentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Equipos que ya viven en SQL&lt;/strong&gt;. Si el equipo tiene Postgres en producción gestionado por DBAs experimentados, agregar DuckLake encima reusa esa expertise. No hay que aprender Iceberg manifests, snapshots o compaction strategies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data engineering en el rango "no necesito Spark pero quiero ACID y time-travel"&lt;/strong&gt;. Equipos pequeños o medianos que tienen menos de 10 TB de datos pueden manejar todo el lakehouse con DuckDB local + Postgres como catálogo + R2/S3 para Parquet, sin necesidad de un cluster Spark, sin necesidad de Snowflake.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-tenant SaaS con muchas tablas pequeñas&lt;/strong&gt;. Cada tenant del SaaS es una tabla; el catálogo Postgres mantiene el listado, y el aislamiento es trivial. La proliferación de archivos en Iceberg con miles de tablas pequeñas es un problema operativo conocido; DuckLake lo elimina.&lt;/p&gt;
&lt;h2&gt;
  
  
  Casos de uso donde no es lo apropiado
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Workloads de exclusivamente ingesta batch grande&lt;/strong&gt;. Si tu pipeline es "una vez por hora ingesto 100 GB, después solo lecturas", Iceberg y Delta están bien optimizados y no hay ventaja material en migrar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ecosistemas Databricks / Snowflake con compromiso enterprise existente&lt;/strong&gt;. Si la organización tiene contratos vigentes con Databricks o Snowflake, la integración nativa con Iceberg/Delta es probablemente más valiosa que la performance teórica de DuckLake.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Equipos sin DBA o expertise SQL operacional&lt;/strong&gt;. Aunque DuckLake usa Postgres/SQLite, gestionar un Postgres en producción con backups, replicación y monitoreo es una habilidad real. Si el equipo no la tiene, los servicios manejados como Databricks pueden ser más razonables.&lt;/p&gt;
&lt;h2&gt;
  
  
  Lo que rompe en la 1.0
&lt;/h2&gt;

&lt;p&gt;El &lt;a href="https://github.com/duckdb/ducklake" rel="noopener noreferrer"&gt;PR #697&lt;/a&gt; introdujo un breaking change que vale la pena conocer: &lt;strong&gt;adjuntar una versión más nueva de la extensión DuckLake ya no migra el catálogo automáticamente&lt;/strong&gt;. La migración ahora es &lt;strong&gt;explícita&lt;/strong&gt;, lo cual previene actualizaciones accidentales en producción pero exige un paso operativo adicional cuando se actualiza la extensión:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="n"&gt;DUCKLAKE&lt;/span&gt; &lt;span class="k"&gt;catalog&lt;/span&gt; &lt;span class="n"&gt;UPGRADE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esa es la única migración bloqueante respecto a 0.x. El resto del cambio es backward-compatible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap: hacia dónde va DuckLake
&lt;/h2&gt;

&lt;p&gt;El equipo publicó dos hitos próximos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DuckLake v1.1&lt;/strong&gt; — Variant inlining cross-catalog, soporte para multi-deletion vector Puffin files, mejoras en data inlining para más tipos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DuckLake v2.0&lt;/strong&gt; — &lt;strong&gt;Git-like branching para datasets&lt;/strong&gt; (la feature más esperada por equipos de ML que necesitan experimentar sobre snapshots), &lt;strong&gt;role-based access control&lt;/strong&gt; built-in en el catálogo, y mejoras en la primitiva de transacciones distribuidas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;El branching es particularmente interesante: permitirá crear una rama de un dataset, hacer cambios, validarlos contra otro pipeline, y mergear o descartar — el mismo modelo mental que devs ya tienen con Git, aplicado a millones de filas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Posicionamiento estratégico: "cheating with a better design"
&lt;/h2&gt;

&lt;p&gt;La frase que el equipo de DuckDB Labs usa para describir su enfoque es honesta. Mientras Iceberg y Delta Lake gastaron años construyendo sistemas distribuidos de metadata sobre object storage —resolviendo problemas duros de consistencia eventual, locks distribuidos y atomicidad sin servidor central—, DuckLake &lt;strong&gt;simplemente delega esos problemas a un RDBMS&lt;/strong&gt;, donde llevan resueltos cuarenta años.&lt;/p&gt;

&lt;p&gt;Es una decisión arquitectónica con tradeoffs reales: escalar verticalmente un Postgres es eventualmente un cuello de botella que un sistema basado en archivos no tiene. Pero para el 95% de los casos prácticos, donde una organización tiene menos de 1 PB de datos en un solo lakehouse y un Postgres bien configurado puede manejar millones de operaciones por segundo, la simplificación operacional es enorme.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lección de fondo
&lt;/h2&gt;

&lt;p&gt;Hay un patrón en la historia de la ingeniería de datos que vale la pena retener. Cada cinco o seis años aparece una propuesta que &lt;strong&gt;cuestiona una premisa que el campo daba por sentada&lt;/strong&gt;. Hadoop cuestionó "los datos tienen que estar en una base de datos". Spark cuestionó "MapReduce es el único modelo de cómputo distribuido". Iceberg y Delta cuestionaron "los lakehouses no pueden tener ACID". DuckLake cuestiona "el catálogo de un lakehouse tiene que vivir en archivos".&lt;/p&gt;

&lt;p&gt;La pregunta para quien evalúa estas tecnologías no es si la nueva propuesta es mejor en abstracto, sino si &lt;strong&gt;la premisa que cuestiona aplica a su caso real&lt;/strong&gt;. Para muchos equipos, los problemas que Iceberg resolvió con archivos JSON en S3 nunca fueron problemas que ellos tuvieran. Para esos equipos, DuckLake representa una simplificación legítima. Para equipos al límite del scaling de Iceberg con cientos de millones de archivos, la conversación es distinta y los tradeoffs cambian.&lt;/p&gt;

&lt;p&gt;Y para devs que están entrando al campo de data engineering en 2026: &lt;strong&gt;valdría más aprender DuckLake con un catálogo Postgres y datos en R2 que tratar de armar un cluster Spark + Iceberg + Hive Metastore desde cero&lt;/strong&gt;. Es más cercano al stack que un equipo de tres a diez personas necesita, y el ecosistema Postgres es enormemente más maduro que cualquier sistema distribuido específico de lakehouse.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fuentes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DuckLake — sitio oficial: &lt;a href="https://ducklake.select/" rel="noopener noreferrer"&gt;https://ducklake.select/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DuckLake — &lt;em&gt;DuckLake v1.0: The Lakehouse Format Built on SQL Reaches Production-Readiness&lt;/em&gt; (anuncio 13 abr 2026): &lt;a href="https://ducklake.select/2026/04/13/ducklake-10/" rel="noopener noreferrer"&gt;https://ducklake.select/2026/04/13/ducklake-10/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub — duckdb/ducklake (repositorio público): &lt;a href="https://github.com/duckdb/ducklake" rel="noopener noreferrer"&gt;https://github.com/duckdb/ducklake&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DuckDB — anuncio DuckDB 1.5.2 (release que acompaña DuckLake 1.0): &lt;a href="https://duckdb.org/2026/04/13/announcing-duckdb-152" rel="noopener noreferrer"&gt;https://duckdb.org/2026/04/13/announcing-duckdb-152&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;InfoQ — &lt;em&gt;DuckLake 1.0: Data Lake Format with SQL Catalog Metadata&lt;/em&gt; (Renato Losio, 2 may 2026): &lt;a href="https://www.infoq.com/news/2026/05/ducklake-sql-catalog/" rel="noopener noreferrer"&gt;https://www.infoq.com/news/2026/05/ducklake-sql-catalog/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The Register — &lt;em&gt;DuckDB uses RDBMS to tackle lakehouse 'small changes' issue&lt;/em&gt; (16 abr 2026): &lt;a href="https://www.theregister.com/software/2026/04/16/duckdb-uses_rdbms_to_tackle_lakehouse_small_changes_issue/5222357" rel="noopener noreferrer"&gt;https://www.theregister.com/software/2026/04/16/duckdb-uses_rdbms_to_tackle_lakehouse_small_changes_issue/5222357&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Definite — &lt;em&gt;DuckDB and DuckLake: Why We Bet the Company on the Duck Stack&lt;/em&gt;: &lt;a href="https://www.definite.app/blog/duckdb-ducklake-business-case" rel="noopener noreferrer"&gt;https://www.definite.app/blog/duckdb-ducklake-business-case&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MotherDuck — &lt;em&gt;DuckDB Ecosystem Newsletter (marzo 2026)&lt;/em&gt;: &lt;a href="https://motherduck.com/blog/duckdb-ecosystem-newsletter-march-2026/" rel="noopener noreferrer"&gt;https://motherduck.com/blog/duckdb-ecosystem-newsletter-march-2026/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wikipedia — DuckDB: &lt;a href="https://en.wikipedia.org/wiki/DuckDB" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/DuckDB&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wikipedia — Apache Iceberg: &lt;a href="https://en.wikipedia.org/wiki/Apache_Iceberg" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Apache_Iceberg&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wikipedia — Delta Lake: &lt;a href="https://en.wikipedia.org/wiki/Delta_Lake" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Delta_Lake&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wikipedia — Apache Parquet: &lt;a href="https://en.wikipedia.org/wiki/Apache_Parquet" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Apache_Parquet&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Wikipedia — Data lake: &lt;a href="https://en.wikipedia.org/wiki/Data_lake" rel="noopener noreferrer"&gt;https://en.wikipedia.org/wiki/Data_lake&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DuckDB — sitio oficial: &lt;a href="https://duckdb.org/" rel="noopener noreferrer"&gt;https://duckdb.org/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Colored Shadow Penumbra: sombras con color en Unreal Engine 5.7</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Thu, 07 May 2026 20:17:46 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/colored-shadow-penumbra-sombras-con-color-en-unreal-engine-57-56p1</link>
      <guid>https://forem.com/lu1tr0n/colored-shadow-penumbra-sombras-con-color-en-unreal-engine-57-56p1</guid>
      <description>&lt;p&gt;El &lt;strong&gt;colored shadow penumbra&lt;/strong&gt; es uno de esos efectos que pasan inadvertidos hasta que alguien los apaga: ver una escena sin él hace que las sombras parezcan, de repente, demasiado limpias, demasiado neutras, demasiado &lt;em&gt;3D&lt;/em&gt;. La técnica reproduce un fenómeno óptico real (la transición coloreada entre la zona iluminada y la sombra dura) y, hasta hace poco, implementarla en Unreal Engine 5 implicaba pelearse con post-procesos frágiles que rompían con Lumen o con ciclos día/noche. La nueva implementación que el artista técnico Romain Durand puso de moda en redes y que Chosker liberó este mes resuelve el problema editando directamente los shaders del motor, con un costo de rendimiento prácticamente cero.&lt;/p&gt;

&lt;p&gt;En este artículo desarmamos cómo funciona, copiamos línea por línea el código HLSL que se inyecta en los shaders de iluminación diferida, explicamos por qué necesita penumbras anchas para verse y discutimos cuándo conviene activarlo en producción. Si trabajás con UE5 desde LATAM, ya sea en un estudio indie o haciendo arch-viz, el &lt;strong&gt;colored shadow penumbra&lt;/strong&gt; es una de esas mejoras de pulido que separan un render técnicamente correcto de uno que se siente vivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es exactamente colored shadow penumbra
&lt;/h2&gt;

&lt;p&gt;La luz, cuando atraviesa el borde de un objeto, no proyecta una sombra binaria entre &lt;em&gt;iluminado&lt;/em&gt; y &lt;em&gt;oscuro&lt;/em&gt;. Hay una región de transición llamada &lt;strong&gt;penumbra&lt;/strong&gt;, donde la fuente de luz queda parcialmente ocluida y solo aporta una fracción de su intensidad. En esa franja, los rebotes indirectos (la luz que viene de paredes, suelos y el ambiente general) tienen relativamente más peso que la directa, y como la luz indirecta arrastra el color de las superficies que rebota, la penumbra termina teñida de los colores de la escena.&lt;/p&gt;

&lt;p&gt;El fenómeno se conoce también como &lt;strong&gt;shadow terminator coloring&lt;/strong&gt; en literatura de raytracing offline. Renderizadores no-real-time como Arnold, V-Ray o Cycles lo computan de forma natural porque trazan rayos secundarios. En tiempo real, Unreal Engine 5 simplifica el cálculo: usa un único término de sombra (&lt;code&gt;SurfaceShadow&lt;/code&gt;) que va de 0 (en sombra completa) a 1 (totalmente iluminado) y modula la luminancia diffuse por ese factor. Esa simplificación es rápida pero borra la información cromática de la transición.&lt;/p&gt;

&lt;p&gt;La técnica de Chosker reintroduce el efecto sin pagar el costo de un trazado real. La idea es ingeniosa: en la región donde &lt;code&gt;SurfaceShadow&lt;/code&gt; es intermedio (la penumbra), saturar artificialmente el color base de la superficie. Con un &lt;strong&gt;colored shadow penumbra&lt;/strong&gt; bien calibrado, una pared roja en sombra muestra rojos más vivos en su transición, una camisa azul deja un halo azulado al borde de su sombra y los materiales metálicos ganan profundidad sin lookdev adicional.&lt;br&gt;
El efecto se nota más en bordes suaves de luces grandes y materiales saturados.&lt;/p&gt;
&lt;h2&gt;
  
  
  Por qué editar el shader del motor (y no un post-process)
&lt;/h2&gt;

&lt;p&gt;Existen al menos tres caminos para introducir colored shadows en una escena de UE5: un &lt;em&gt;Material Function&lt;/em&gt; aplicado por objeto, un &lt;em&gt;Post Process Material&lt;/em&gt; global, o editar los shaders del engine directamente. Chosker descartó las primeras dos por una razón concreta: con Lumen activado o con ciclos día/noche, los valores que llegan al post-process ya están mezclados (luz directa, GI, especulares) y reconstruir cuál fragmento corresponde a sombra y cuál a iluminación se vuelve un ejercicio de adivinanza. Editar el shader de iluminación diferida resuelve el problema en su origen: ahí todavía existe la separación clara entre &lt;code&gt;DiffuseLuminance&lt;/code&gt; y &lt;code&gt;SurfaceShadow&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;La ventaja adicional es que funciona con todos los tipos de luz (direccionales, puntuales, focales, rectangulares) sin código extra y se ejecuta una sola vez por píxel, en el mismo pase donde ya se está mezclando la sombra. El costo en GPU es marginal: un &lt;code&gt;dot product&lt;/code&gt; y dos &lt;code&gt;lerp&lt;/code&gt;, instrucciones que cualquier hardware moderno absorbe sin pestañear.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;📌 Nota:&lt;/strong&gt; Editar los shaders del motor no requiere clonar el repositorio completo de Epic ni compilar Unreal desde código fuente. Basta con la versión Launcher: los shaders del engine son archivos &lt;code&gt;.usf&lt;/code&gt;/&lt;code&gt;.ush&lt;/code&gt; en la carpeta &lt;code&gt;Engine\Shaders\Private&lt;/code&gt; y se recompilan en frío con &lt;code&gt;Ctrl + Shift + .&lt;/code&gt; dentro del editor.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Implementación con Substrate (UE 5.7)
&lt;/h2&gt;

&lt;p&gt;Substrate es el nuevo sistema de materiales de Unreal Engine introducido como experimental en 5.2 y promovido a beta en 5.7. Si tu proyecto lo tiene activado (lo que es cada vez más común en producciones nuevas), el shader que necesitás editar es &lt;code&gt;Engine\Shaders\Private\Substrate\SubstrateDeferredLighting.ush&lt;/code&gt;. Alrededor de la línea 190 vas a encontrar la línea que calcula la luminancia especular:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hlsl"&gt;&lt;code&gt;&lt;span class="kt"&gt;float3&lt;/span&gt; &lt;span class="n"&gt;SpecularLuminance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BSDFEvaluate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IntegratedSpecularValue&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;LightData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SpecularScale&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inmediatamente después, agregás el bloque de &lt;strong&gt;colored shadow penumbra&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hlsl"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Colored shadow penumbra - Start&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="n"&gt;PenumbraSaturation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;float3&lt;/span&gt; &lt;span class="n"&gt;LuminanceFactors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;float3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;float3&lt;/span&gt; &lt;span class="n"&gt;PenumbraColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DiffuseLuminance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LuminanceFactors&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;PenumbraColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lerp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PenumbraColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;DiffuseLuminance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PenumbraSaturation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;DiffuseLuminance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lerp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DiffuseLuminance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PenumbraColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;BSDFShadowTerms&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SurfaceShadow&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Colored shadow penumbra - End&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El valor &lt;code&gt;PenumbraSaturation = 4.0f&lt;/code&gt; es un punto de partida agresivo, pensado para que el efecto se vea en capturas comparativas. En producción, valores entre &lt;code&gt;1.5&lt;/code&gt; y &lt;code&gt;2.5&lt;/code&gt; dan un resultado más natural. Con &lt;code&gt;1.0&lt;/code&gt; el efecto desaparece completamente (el lerp de saturación se cancela).&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementación clásica sin Substrate
&lt;/h2&gt;

&lt;p&gt;Si tu proyecto sigue usando el pipeline tradicional de iluminación diferida, el archivo objetivo es &lt;code&gt;Engine\Shaders\Private\DeferredLightPixelShaders.usf&lt;/code&gt;. Alrededor de la línea 397 buscás:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hlsl"&gt;&lt;code&gt;&lt;span class="n"&gt;OutColor&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;Radiance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y agregás justo después:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hlsl"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Colored shadow penumbra - Start&lt;/span&gt;
&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;float&lt;/span&gt; &lt;span class="n"&gt;PenumbraSaturation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;float3&lt;/span&gt; &lt;span class="n"&gt;LuminanceFactors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;float3&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;float3&lt;/span&gt; &lt;span class="n"&gt;PenumbraColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OutColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xyz&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;LuminanceFactors&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;PenumbraColor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lerp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PenumbraColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;OutColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xyz&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PenumbraSaturation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;OutColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xyz&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lerp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OutColor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;xyz&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PenumbraColor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;SurfaceShadow&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Colored shadow penumbra - End&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;La lógica es idéntica; solo cambian los nombres de las variables porque el flujo de Substrate usa una estructura distinta para encapsular el resultado de la BSDF.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona el código línea por línea
&lt;/h2&gt;

&lt;p&gt;Vale la pena desarmar las cinco líneas porque condensan tres conceptos importantes de teoría de color y composición:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vector de luminancia &lt;code&gt;(0.3, 0.59, 0.11)&lt;/code&gt;&lt;/strong&gt; — son los pesos perceptuales del estándar Rec. 601 para convertir RGB a una intensidad gris equivalente. El verde pesa más porque el ojo humano es más sensible a esa banda. Hacer un &lt;code&gt;dot&lt;/code&gt; entre el color y este vector colapsa cualquier color a su luminancia.- &lt;strong&gt;Saturación inversa&lt;/strong&gt; — el primer &lt;code&gt;lerp&lt;/code&gt; mueve el color desde su versión gris (&lt;code&gt;PenumbraColor&lt;/code&gt;) hacia el color original (&lt;code&gt;DiffuseLuminance&lt;/code&gt;) usando un factor mayor a 1. Cuando el factor pasa de 1, el lerp extrapola y produce una versión más saturada que la original. Es el mismo truco que usan los nodos de saturación de Photoshop o After Effects.- &lt;strong&gt;Mezcla por shadow term&lt;/strong&gt; — el segundo &lt;code&gt;lerp&lt;/code&gt; combina el color saturado con el color original usando &lt;code&gt;1.0 - SurfaceShadow&lt;/code&gt; como peso. En zonas totalmente iluminadas (&lt;code&gt;SurfaceShadow = 1&lt;/code&gt;) el peso es 0 y no pasa nada. En zonas totalmente en sombra (&lt;code&gt;SurfaceShadow = 0&lt;/code&gt;) el peso es 1 pero el color a mezclar ya es muy oscuro, así que tampoco se nota. Solo en la franja de transición se ve la versión saturada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Es elegante porque no necesita detectar dónde está la penumbra: la propia función &lt;code&gt;1.0 - SurfaceShadow&lt;/code&gt; tiene su pico justo en esa región (cerca de 0.5) y cae hacia los extremos. La saturación se modula sola.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visualización del flujo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph LR
  A["Luz directa"] --&amp;gt; B["BSDF + Shadow Term"]
  B --&amp;gt; C["DiffuseLuminance RGB"]
  C --&amp;gt; D["Luminancia gris (Rec. 601)"]
  D --&amp;gt; E["Saturación inversa (lerp &amp;gt; 1)"]
  E --&amp;gt; F["Mezcla por (1 - SurfaceShadow)"]
  F --&amp;gt; G["Color final con penumbra coloreada"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Ajustar PenumbraSaturation: el parámetro que importa
&lt;/h2&gt;

&lt;p&gt;El único hiperparámetro de la técnica es &lt;code&gt;PenumbraSaturation&lt;/code&gt;. Vale la pena dedicar tiempo a calibrarlo, porque el rango útil es estrecho:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;1.0&lt;/strong&gt; — desactiva el efecto. Útil como sentinela durante debugging.- &lt;strong&gt;1.2 a 1.8&lt;/strong&gt; — efecto sutil, perceptible solo en escenas con materiales saturados o luces grandes. Buen rango para arch-viz fotorrealista.- &lt;strong&gt;2.0 a 3.0&lt;/strong&gt; — sweet spot para juegos estilizados, escenas con paleta artística o cinemáticas. El efecto se ve sin gritar.- &lt;strong&gt;4.0 o más&lt;/strong&gt; — exagerado a propósito, ideal para capturas de marketing pero rompe el realismo.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Como el valor está hardcodeado en el shader, cada cambio implica recompilar shaders (varios minutos la primera vez, segundos después). Si vas a iterar mucho, conviene exponerlo como una &lt;em&gt;console variable&lt;/em&gt; usando &lt;code&gt;FAutoConsoleVariableRef&lt;/code&gt; en C++ o, más rápido todavía, parametrizarlo desde un material function global.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Limitaciones y casos donde no se ve
&lt;/h2&gt;

&lt;p&gt;El &lt;strong&gt;colored shadow penumbra&lt;/strong&gt; tiene tres limitaciones honestas que conviene comunicar al equipo de arte antes de venderlo como solución mágica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solo luces dinámicas&lt;/strong&gt; — la sombra &lt;em&gt;baked&lt;/em&gt; se calcula offline antes de que el shader corra, así que no hay penumbra que colorear. Si tu proyecto depende de iluminación pre-baked (común en mobile o VR de bajos requerimientos), esta técnica no aporta nada.- &lt;strong&gt;Necesita penumbras anchas&lt;/strong&gt; — luces puntuales pequeñas con shadow maps duros producen penumbras de pocos píxeles, donde el efecto pasa desapercibido. Funciona mejor con luces rectangulares grandes, sky lights con soft shadows o virtual shadow maps con kernel amplio.- &lt;strong&gt;No se ve en grises ni saturados&lt;/strong&gt; — un material totalmente gris no tiene color que saturar, y un material ya saturado al máximo tampoco gana. El efecto luce mejor en colores medios y materiales con reflectividad media.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Por qué importa para estudios indie en LATAM
&lt;/h2&gt;

&lt;p&gt;El argumento más fuerte para adoptar la técnica no es estético sino económico. Un estudio indie en LATAM compite contra producciones AAA con presupuestos de iluminación cien veces mayores: lookdev artists dedicados, lighters senior, herramientas propietarias para comp y grading. El &lt;strong&gt;colored shadow penumbra&lt;/strong&gt; es una de esas técnicas asimétricas que cierran parte de esa brecha sin contratar a nadie nuevo: cinco líneas de HLSL aplicadas una vez al engine fork del proyecto y todas las escenas heredan el mejor pulido visual.&lt;/p&gt;

&lt;p&gt;Es también una excusa perfecta para subir el nivel del equipo en programación de shaders. Modificar &lt;code&gt;SubstrateDeferredLighting.ush&lt;/code&gt; obliga a entender qué hace cada paso del pipeline diferido, qué información sobrevive entre el G-Buffer y el shading pass, y cómo Unreal estructura su evaluación de BSDFs. Es el tipo de conocimiento que en estudios grandes se aprende osmóticamente con el código fuente del engine, y que en LATAM se logra raras veces porque el acceso al source code de Epic sigue siendo un trámite que pocos completan.&lt;br&gt;
El efecto suma profundidad cromática sin afectar la performance en runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué sigue para colored shadows en tiempo real
&lt;/h2&gt;

&lt;p&gt;El siguiente paso natural es exponer &lt;code&gt;PenumbraSaturation&lt;/code&gt; a nivel de cada luz, no global del proyecto. La forma elegante sería agregar un campo &lt;code&gt;FloatProperty&lt;/code&gt; a &lt;code&gt;FLightData&lt;/code&gt;, llenarlo desde C++ y leerlo en el shader. Eso permitiría que un foco rojizo de una habitación cálida tenga saturación distinta a una luz fría de exterior, lo cual es más fiel a cómo se trabaja la luz en cinematografía.&lt;/p&gt;

&lt;p&gt;Otra dirección interesante es separar el factor para diffuse y para specular. La implementación actual modifica solo el componente diffuse (que es donde el efecto tiene sentido físico) pero hay artistas que quisieran un control independiente para empujar el look hacia algo más estilizado. Y a más largo plazo, integrar la técnica con Lumen para que la saturación respete la información de GI ya calculada parece la evolución natural: ahí mismo está el color real que aporta la radiosidad, sin necesidad de aproximarlo con un truco.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Funciona en proyectos comerciales sin pagar licencia adicional a Epic?
&lt;/h3&gt;

&lt;p&gt;Sí. Modificar los shaders del motor en la versión Launcher cae dentro del EULA estándar de Unreal Engine. No es lo mismo que distribuir un fork modificado del engine: solo estás cambiando archivos de shader que ya viven en tu proyecto. La licencia royalty del 5% sobre el millón de dólares se aplica por el uso del engine, no por las modificaciones.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Funciona con Lumen activado?
&lt;/h3&gt;

&lt;p&gt;Sí, y es justamente uno de los argumentos a favor de editar el shader directamente en lugar de un post-process. Lumen aporta la GI; el &lt;strong&gt;colored shadow penumbra&lt;/strong&gt; opera sobre la luz directa antes de que se sume al resultado final. No interfieren entre sí.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cuál es el costo en GPU?
&lt;/h3&gt;

&lt;p&gt;Despreciable en cualquier hardware compatible con UE5. Son 5 líneas de aritmética sin lecturas adicionales de texturas ni branching. En profilers como RenderDoc o el GPU Visualizer interno, el incremento del pase de iluminación es del orden del 0.1% o menos. La penalidad real viene una sola vez: la recompilación de shaders cuando el archivo cambia.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Por qué mi escena se ve igual después de aplicar el código?¿Cómo lo desactivo si causa problemas en producción?
&lt;/h3&gt;

&lt;p&gt;Comentás las cinco líneas con &lt;code&gt;/* */&lt;/code&gt; y guardás el archivo. Unreal recompila los shaders en el siguiente arranque y la escena vuelve al comportamiento original. Por eso conviene siempre dejar los marcadores &lt;code&gt;// Colored shadow penumbra - Start&lt;/code&gt; y &lt;code&gt;// Colored shadow penumbra - End&lt;/code&gt; en el código: facilitan localizar el bloque para revertirlo en cualquier momento.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo combinarlo con otros mods de shaders del engine?
&lt;/h3&gt;

&lt;p&gt;Sí, mientras los bloques no toquen las mismas variables. La regla práctica es mantener cada mod en su propio archivo o en una sección bien delimitada del archivo del engine, documentar el cambio en un README del proyecto y versionar las modificaciones del engine en el mismo repo del juego para que otros desarrolladores no las pierdan al actualizar Unreal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://chosker.github.io/blog/colored-shadow-penumbra" rel="noopener noreferrer"&gt;Chosker: Colored Shadow Penumbra&lt;/a&gt; — artículo original con capturas comparativas y el código fuente del shader.- &lt;a href="https://en.wikipedia.org/wiki/Umbra,_penumbra_and_antumbra" rel="noopener noreferrer"&gt;Wikipedia: Umbra, penumbra and antumbra&lt;/a&gt; — explicación física del fenómeno de la penumbra y la geometría de las sombras.- &lt;a href="https://www.unrealengine.com/en-US/unreal-engine-5" rel="noopener noreferrer"&gt;Unreal Engine 5&lt;/a&gt; — sitio oficial con documentación del pipeline de iluminación diferida y Substrate.- &lt;a href="https://github.com/EpicGames/UnrealEngine" rel="noopener noreferrer"&gt;EpicGames/UnrealEngine en GitHub&lt;/a&gt; — repositorio oficial del motor (requiere autorización de Epic) donde viven los shaders &lt;code&gt;.usf&lt;/code&gt; y &lt;code&gt;.ush&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>WebGPU: cómo programar la GPU desde el navegador en 2026</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Thu, 07 May 2026 16:04:51 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/webgpu-como-programar-la-gpu-desde-el-navegador-en-2026-57cn</link>
      <guid>https://forem.com/lu1tr0n/webgpu-como-programar-la-gpu-desde-el-navegador-en-2026-57cn</guid>
      <description>&lt;p&gt;Durante más de una década, &lt;strong&gt;WebGL&lt;/strong&gt; fue la única forma de pintar gráficos acelerados en un navegador. Funcionaba, pero arrastraba las limitaciones de OpenGL ES 2.0, una API diseñada en 2007 para teléfonos de la época. En 2026, ese capítulo se cerró: &lt;strong&gt;WebGPU&lt;/strong&gt; es ahora la API estándar para acceder a la GPU desde JavaScript, y abre la puerta a algo que WebGL nunca pudo ofrecer bien: &lt;em&gt;computación de propósito general&lt;/em&gt; en la GPU dentro del navegador.&lt;/p&gt;

&lt;p&gt;Si has oído hablar de Stable Diffusion corriendo en una pestaña sin instalar nada, de modelos de lenguaje pequeños ejecutándose localmente sin enviar datos a un servidor, o de juegos AAA portados directamente a la web, &lt;strong&gt;WebGPU&lt;/strong&gt; es la pieza que lo hace posible. También sirve para simulaciones físicas, visualizaciones científicas, edición de video en el navegador y aceleración de algoritmos que antes requerían WebAssembly con SIMD. Esta guía explica qué es, cómo funciona internamente, qué problemas resuelve respecto a WebGL y cómo escribir tu primer programa de cómputo en GPU desde el navegador. No necesitas saber Vulkan, DirectX ni Metal: WebGPU abstrae las tres APIs nativas detrás de una interfaz unificada y portable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es WebGPU
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;WebGPU&lt;/strong&gt; es una API web estandarizada por el World Wide Web Consortium (W3C) que permite a las aplicaciones web acceder a la GPU del dispositivo para tareas de gráficos y cómputo. La diseñaron Apple, Google, Mozilla, Microsoft e Intel a partir de 2017, alcanzó estabilidad en Chrome 113 en abril de 2023, llegó a Safari 17.4 durante 2024-2025 y entró en Firefox estable a principios de 2026 tras años en banderas experimentales.&lt;/p&gt;

&lt;p&gt;A diferencia de WebGL, que es esencialmente una capa delgada sobre OpenGL ES 2.0/3.0, WebGPU se diseñó pensando en las APIs gráficas modernas que ya existen en cada sistema operativo. Por dentro, el navegador traduce cada llamada de WebGPU al backend nativo apropiado: &lt;strong&gt;Vulkan&lt;/strong&gt; en Linux y Android, &lt;strong&gt;Metal&lt;/strong&gt; en macOS e iOS, y &lt;strong&gt;Direct3D 12&lt;/strong&gt; en Windows. Esa traducción es lo bastante delgada como para conseguir rendimiento cercano al nativo, y lo bastante segura como para ejecutar código no confiable dentro de una pestaña.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; WebGPU no es "WebGL 2.0". Es una API completamente nueva con un modelo mental distinto: no se programa la GPU como una máquina de estados global, sino como un sistema de comandos explícitos y recursos tipados.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  La diferencia con WebGL en una analogía
&lt;/h3&gt;

&lt;p&gt;WebGL es como conducir un auto automático de los noventa: cómodo, perdona errores, pero opaco. WebGPU es como conducir un Fórmula 1: tienes que pensar en cada cambio de marcha, pero a cambio obtienes velocidad, control y predictibilidad. WebGL tenía una &lt;em&gt;máquina de estados global&lt;/em&gt;: activar un shader, un buffer o una textura eran operaciones implícitas que la GPU procesaba en orden, y si dos partes del código modificaban el mismo estado podían pisarse mutuamente. WebGPU elimina ese problema: todo lo que la GPU necesita ejecutar viene empaquetado en un objeto inmutable llamado &lt;em&gt;pipeline&lt;/em&gt;, y los recursos se agrupan en &lt;em&gt;bind groups&lt;/em&gt; que se enlazan explícitamente. El resultado es código más predecible, paralelizable y fácil de optimizar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo funciona WebGPU paso a paso
&lt;/h2&gt;

&lt;p&gt;Para usar &lt;strong&gt;WebGPU&lt;/strong&gt; necesitas seguir cuatro pasos básicos: pedir un dispositivo, crear los recursos, escribir un shader y enviar comandos a la GPU. El flujo a alto nivel se ve así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dot"&gt;&lt;code&gt;&lt;span class="k"&gt;graph&lt;/span&gt; &lt;span class="nv"&gt;LR&lt;/span&gt;
    &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"JavaScript"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"GPUDevice"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="nv"&gt;B&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Buffers y Texturas"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="nv"&gt;C&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Shader WGSL"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="nv"&gt;D&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;E&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Pipeline"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="nv"&gt;E&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;F&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"Command Encoder"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
    &lt;span class="nv"&gt;F&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;G&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"GPU"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Pedir un GPUAdapter y un GPUDevice
&lt;/h3&gt;

&lt;p&gt;El punto de entrada es &lt;code&gt;navigator.gpu&lt;/code&gt;. Desde ahí pides un &lt;em&gt;adapter&lt;/em&gt; (la GPU física disponible en el equipo) y, a partir del adapter, un &lt;em&gt;device&lt;/em&gt; que es el canal lógico por el que envías comandos. El navegador puede entregar varios devices al mismo origen, lo que permite aislar contextos y limitar recursos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gpu&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WebGPU no está soportado en este navegador&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;adapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;gpu&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestAdapter&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;device&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestDevice&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Crear buffers y texturas
&lt;/h3&gt;

&lt;p&gt;Los &lt;em&gt;buffers&lt;/em&gt; son bloques de memoria en la GPU donde guardas datos: vértices, índices, parámetros uniformes o resultados de un cómputo. Cada buffer se crea con un tamaño fijo y un conjunto de banderas de uso (&lt;code&gt;VERTEX&lt;/code&gt;, &lt;code&gt;UNIFORM&lt;/code&gt;, &lt;code&gt;STORAGE&lt;/code&gt;, &lt;code&gt;COPY_SRC&lt;/code&gt;, &lt;code&gt;COPY_DST&lt;/code&gt;). Las texturas son similares pero con dimensiones 2D/3D y formatos como &lt;code&gt;rgba8unorm&lt;/code&gt; o &lt;code&gt;r32float&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Escribir un shader en WGSL
&lt;/h3&gt;

&lt;p&gt;WebGPU introduce su propio lenguaje de shaders: &lt;strong&gt;WGSL&lt;/strong&gt; (WebGPU Shading Language). Es similar a Rust en sintaxis y se compila por debajo a SPIR-V en Vulkan, MSL en Metal y HLSL en DirectX. WGSL fue diseñado para ser seguro: prohíbe punteros sin restricciones, exige tipos explícitos y rechaza accesos fuera de rango en tiempo de compilación.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@group(0) @binding(0) var data: array;

@compute @workgroup_size(64)
fn main(@builtin(global_invocation_id) id: vec3) {
  let i = id.x;
  if (i El pipeline de WebGPU empaqueta shader, recursos y configuración en un objeto inmutable.

## Ejemplo práctico: duplicar un array en la GPU

Veamos un ejemplo end-to-end que toma un array de números, lo sube a la GPU, lo multiplica por dos en paralelo y lo descarga de vuelta a JavaScript. Es el "hello world" del cómputo en GPU:

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;const adapter = await navigator.gpu.requestAdapter();&lt;br&gt;
const device = await adapter.requestDevice();&lt;/p&gt;

&lt;p&gt;const input = new Float32Array([1, 2, 3, 4, 5, 6, 7, 8]);&lt;/p&gt;

&lt;p&gt;const gpuBuffer = device.createBuffer({&lt;br&gt;
  size: input.byteLength,&lt;br&gt;
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,&lt;br&gt;
});&lt;br&gt;
device.queue.writeBuffer(gpuBuffer, 0, input);&lt;/p&gt;

&lt;p&gt;const module = device.createShaderModule({&lt;br&gt;
  code: `&lt;br&gt;
    &lt;a class="mentioned-user" href="https://dev.to/group"&gt;@group&lt;/a&gt;(0) @binding(0) var data: array;&lt;br&gt;
    @compute @workgroup_size(64)&lt;br&gt;
    fn main(&lt;a class="mentioned-user" href="https://dev.to/builtin"&gt;@builtin&lt;/a&gt;(global_invocation_id) id: vec3) {&lt;br&gt;
      let i = id.x;&lt;br&gt;
      if (i WebGPU permite cómputo general en la GPU, algo que WebGL nunca soportó nativamente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ventajas y desventajas de WebGPU
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Ventajas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cómputo general nativo&lt;/strong&gt; — los compute shaders abren la puerta a IA, simulaciones y procesamiento de datos en GPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mejor rendimiento&lt;/strong&gt; — overhead por llamada mucho más bajo que WebGL, lo que permite escenas con miles de objetos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Errores explícitos&lt;/strong&gt; — los recursos están tipados y validados, los shaders se compilan en una pasada y los errores aparecen donde corresponde.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portabilidad real&lt;/strong&gt; — el mismo código corre sobre Vulkan, Metal y DirectX 12 sin cambios.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WGSL seguro&lt;/strong&gt; — diseñado para ejecutar código no confiable sin abrir vectores de ataque a la GPU.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desventajas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Curva de aprendizaje&lt;/strong&gt; — más conceptos que WebGL: pipelines, bind groups, layouts explícitos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Más código boilerplate&lt;/strong&gt; — un "hola triángulo" en WebGPU son 100 líneas; en WebGL eran 30.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compatibilidad incompleta&lt;/strong&gt; — algunas GPUs antiguas o de smartphones de gama baja no lo soportan, aunque la cobertura ya supera el 85% en 2026.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentación dispersa&lt;/strong&gt; — al ser una API joven, los tutoriales aún están desactualizados o incompletos.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; si tu aplicación necesita soportar navegadores antiguos o iPhones previos a iOS 17, sigues necesitando un fallback a WebGL. La detección con &lt;code&gt;if (navigator.gpu)&lt;/code&gt; es obligatoria antes de cualquier llamada.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  WebGPU vs WebGL vs CUDA
&lt;/h2&gt;

&lt;p&gt;Para situar a &lt;strong&gt;WebGPU&lt;/strong&gt; respecto a sus alternativas: &lt;strong&gt;WebGL&lt;/strong&gt; sigue siendo el lowest common denominator y el único soporte universal a 2026; &lt;strong&gt;WebGPU&lt;/strong&gt; es la API moderna pensada para hardware de la última década; y &lt;strong&gt;CUDA&lt;/strong&gt; es la API propietaria de NVIDIA que solo corre en sus GPUs y solo fuera del navegador. WebGPU no compite con CUDA en términos de rendimiento absoluto en data centers, pero sí lo hace en accesibilidad: cualquier desarrollador con un navegador puede ejecutar cómputo en GPU sin instalar drivers ni compiladores nativos. Para machine learning ligero, gráficos en tiempo real y procesamiento de datos en aplicaciones web, WebGPU es ya la opción por defecto.&lt;/p&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿WebGPU reemplaza completamente a WebGL?
&lt;/h3&gt;

&lt;p&gt;No de inmediato. WebGL sigue funcionando y los navegadores lo mantendrán durante años por compatibilidad. Sin embargo, todo desarrollo nuevo de gráficos avanzados o cómputo en GPU debería empezar con WebGPU y dejar WebGL como fallback solo si necesitas soportar dispositivos antiguos.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Necesito una GPU dedicada para usar WebGPU?
&lt;/h3&gt;

&lt;p&gt;No. WebGPU funciona sobre GPUs integradas (Intel UHD, AMD Radeon Vega, Apple Silicon) y sobre GPUs discretas. Las integradas tendrán menos rendimiento, pero la API es exactamente la misma. Lo único que necesitas es un navegador reciente y un sistema operativo con soporte para Vulkan, Metal o DirectX 12.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Funciona en móviles?
&lt;/h3&gt;

&lt;p&gt;Sí. Chrome y Safari en Android e iOS modernos soportan WebGPU. La cobertura de iPhone llega hasta el modelo 11 (Apple A13) y en Android depende de que el fabricante mantenga drivers Vulkan actualizados, lo que ya es estándar en gama media-alta.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo es WGSL comparado con GLSL?
&lt;/h3&gt;

&lt;p&gt;WGSL es más estricto: tipos explícitos obligatorios, sin coerciones implícitas, sin punteros libres y con sintaxis más cercana a Rust que a C. La curva inicial es ligeramente mayor, pero los errores son más claros y el código resulta más portable entre plataformas.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Puedo usar WebGPU para entrenar modelos de IA?
&lt;/h3&gt;

&lt;p&gt;Para inferencia es ideal. Para entrenamiento serio sigue siendo más práctico usar CUDA o ROCm en un servidor: WebGPU no expone primitivas de bajo nivel como tensor cores y los modelos grandes no caben en VRAM de consumo. Para fine-tuning ligero o experimentos educativos, sí es viable.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Qué frameworks soportan WebGPU en 2026?
&lt;/h3&gt;

&lt;p&gt;Three.js, Babylon.js, Unity, Unreal Engine, transformers.js, WebLLM, ONNX Runtime Web, TensorFlow.js, deck.gl y PlayCanvas tienen soporte estable. La adopción siguió creciendo a lo largo de 2025 y 2026 conforme Safari y Firefox lo habilitaron por defecto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API" rel="noopener noreferrer"&gt;MDN Web Docs — WebGPU API&lt;/a&gt; — referencia oficial completa con guías y ejemplos.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.w3.org/TR/webgpu/" rel="noopener noreferrer"&gt;W3C — WebGPU Specification&lt;/a&gt; — especificación normativa de la API.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gpuweb.github.io/gpuweb/wgsl/" rel="noopener noreferrer"&gt;W3C — WGSL Specification&lt;/a&gt; — especificación del lenguaje de shaders WGSL.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/gpuweb/gpuweb" rel="noopener noreferrer"&gt;GitHub — gpuweb/gpuweb&lt;/a&gt; — repositorio oficial donde se discute la evolución del estándar.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/WebGPU" rel="noopener noreferrer"&gt;Wikipedia — WebGPU&lt;/a&gt; — historia, contexto y estado de soporte por navegador.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>MOOP Map 2025: el dataset de 20 años que cambió a 70.000 personas</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Thu, 07 May 2026 14:23:40 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/moop-map-2025-el-dataset-de-20-anos-que-cambio-a-70000-personas-2po1</link>
      <guid>https://forem.com/lu1tr0n/moop-map-2025-el-dataset-de-20-anos-que-cambio-a-70000-personas-2po1</guid>
      <description>&lt;p&gt;Cada agosto, 70.000 personas convergen en un lago seco del desierto de Nevada para levantar desde cero una ciudad temporal. Ocho días después, Black Rock City se desvanece. Pero queda algo: 150 voluntarios formados hombro con hombro recorriendo 1.540 hectáreas (3.800 acres) de polvo a paso humano, registrando cada tornillo, cada lentejuela, cada colilla. El resultado es uno de los proyectos de datos comunitarios más particulares del mundo: el Burning Man &lt;strong&gt;MOOP Map&lt;/strong&gt;. La edición 2025 acaba de publicarse y, como cada año desde 2006, cuenta una historia poco común para una comunidad de 70.000 personas: cómo un dataset puede modificar el comportamiento colectivo sin policías, sin multas, sin algoritmos de moderación. Solo con un mapa público pintado de verde, amarillo y rojo.&lt;/p&gt;

&lt;p&gt;Para los desarrolladores en LATAM acostumbrados a dashboards de observabilidad, mapas de cobertura de tests o métricas DORA, el MOOP Map es un caso de estudio inesperado: una infraestructura analógica de accountability comunitaria, sostenida durante dos décadas, con resultados medibles que mejoran año tras año. Vamos a revisar qué dicen los números de 2025, cómo llegamos hasta acá, y qué lecciones tiene este modelo para cualquier equipo que use datos para cambiar conductas.&lt;/p&gt;

&lt;h2&gt;
  
  
  El MOOP Map 2025 en cifras
&lt;/h2&gt;

&lt;p&gt;El 2025 MOOP Map fue publicado por el equipo de Restauración Ambiental de Burning Man tras varias semanas de barrido forense de la playa. El método es brutalmente analógico: 150 personas alineadas a la distancia de un brazo cada una, caminando lentamente sobre 3.800 acres (15,4 km²) de lecho seco, recogiendo y catalogando todo objeto humano que encuentren. Cada hallazgo se geolocaliza y se incorpora al mapa, que se publica con un código de color por severidad: verde (limpio), amarillo (limpieza moderada que ralentiza al equipo) y rojo (zonas tan contaminadas que detienen el avance).&lt;/p&gt;

&lt;p&gt;En palabras de Dominic "DA" Tinio, gerente de Restauración Ambiental de Burning Man, "en términos simples, mientras más MOOPier es un área, más trabajo y tiempo de campo toma limpiarla hasta que las cuadrillas dejan de encontrar restos". MOOP, por sus siglas en inglés, significa &lt;em&gt;Matter Out of Place&lt;/em&gt;: cualquier objeto humano que no debería estar en el desierto.&lt;/p&gt;

&lt;p&gt;Lo más llamativo del informe 2025 son los &lt;strong&gt;lag bolts&lt;/strong&gt; —tirafondos largos que anclan tiendas, instalaciones y arte al suelo— que dominaron el ranking de basura encontrada. A diferencia de las colillas o los purpurinas, los lag bolts no responden a un comportamiento específico de un grupo; son fallas distribuidas: prácticamente todos los campos perdieron algunos. Para los lectores con background en ingeniería, suena familiar: un bug sistémico que aparece con baja frecuencia en muchos servicios distintos, no un problema concentrado en un módulo.&lt;/p&gt;

&lt;p&gt;El balance general: Black Rock City 2025 pasó la inspección oficial sin sobresaltos. Pero la historia detrás de este "sin sobresaltos" es mucho más interesante.&lt;/p&gt;

&lt;p&gt;Severidad de cleanup por zona: verde, amarillo y rojo. Cada color implica horas de trabajo distintas.&lt;/p&gt;

&lt;h2&gt;
  
  
  20 años haciendo Leave No Trace data-driven
&lt;/h2&gt;

&lt;p&gt;El MOOP Map no nació por iniciativa estética: nació por necesidad legal. El terreno donde se realiza Burning Man pertenece al &lt;strong&gt;Bureau of Land Management (BLM)&lt;/strong&gt;, la agencia federal que administra tierras públicas en Estados Unidos. Para que el evento pueda regresar cada año, debe pasar una inspección post-evento estricta: &lt;strong&gt;no más de un pie cuadrado de basura por acre&lt;/strong&gt; (0,23 m²/ha). El BLM mide en 120 puntos repartidos por el sitio, y como máximo 12 de esos puntos pueden superar el umbral. Si 13 o más fallan, Black Rock City no vuelve.&lt;/p&gt;

&lt;p&gt;En la práctica, el evento aprueba con holgura casi todos los años. Pero "casi" deja espacio para sustos. En 2023, &lt;strong&gt;11 de los 120 puntos del BLM se pasaron del límite&lt;/strong&gt; —el resultado más cercano al fracaso en la historia reciente. Una unidad más por encima del umbral y la edición 2024 podría no haber sucedido. La comunidad lo asumió como un wake-up call: cuando un sistema que toleras como margen se aproxima a su techo, los costos de un fracaso son catastróficos. En lenguaje de SRE: estás quemando tu error budget más rápido de lo previsto y es hora de reevaluar todo el proceso.&lt;/p&gt;

&lt;p&gt;El MOOP Map mismo lleva dos décadas en operación. Su origen fue la necesidad de demostrarle al BLM que la comunidad tomaba en serio la limpieza, pero rápidamente evolucionó en una herramienta interna: un feedback loop público que cada campamento, cada proyecto artístico y cada participante recibe sobre el impacto que dejó su huella. "Desde 2006, en el largo arco del MOOP Map, la tendencia más llamativa es que la comunidad ha mejorado consistentemente en Leave No Trace, incluso cuando Black Rock City ha crecido dramáticamente en tamaño, complejidad y población", afirma DA. La medición empezó como obligación regulatoria y se convirtió en cultura.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; Este es uno de los efectos más potentes de las métricas públicas en cualquier organización: empiezan como cumplimiento y terminan como identidad. Cuando los datos son visibles y atribuibles, dejan de ser una imposición externa y se convierten en parte de cómo la gente se ve a sí misma.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Los números que revelan una mejora sostenida
&lt;/h2&gt;

&lt;p&gt;Los datos detrás del MOOP Map son los que vuelven al proyecto fascinante. Si normalizamos la basura por persona —MOOP per cápita— el pico histórico está en &lt;strong&gt;2010&lt;/strong&gt;. Desde entonces, pese a que la población anual del evento creció considerablemente, la cantidad de basura por persona ha tendido a bajar. La mejora absoluta es aún más impactante: con un evento más grande, más complejo, con instalaciones más ambiciosas y más arte, el residuo total se mantiene bajo el techo legal.&lt;/p&gt;

&lt;p&gt;Los principales tipos de basura encontrados en 2025 son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lag bolts (tirafondos)&lt;/strong&gt;: el #1 absoluto, distribuido entre prácticamente todos los campamentos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Madera y restos de construcción&lt;/strong&gt;: residuos de carpintería estructural cortada en sitio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tela, cuerdas y elásticos&lt;/strong&gt;: especialmente trozos pequeños cortados durante el desmontaje.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plásticos pequeños&lt;/strong&gt;: tapas, envoltorios, partes de utilería.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lentejuelas y micro-purpurina&lt;/strong&gt;: el horror eterno del MOOP, prácticamente imposible de recoger una vez disperso.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los cigarrillos y colillas, que históricamente fueron un problema importante en festivales similares, hoy aparecen en cantidades pequeñas. La señal cultural funcionó.&lt;/p&gt;

&lt;p&gt;Los datos también permiten al equipo de DA distinguir entre fallas sistémicas y fallas específicas. Si una zona tiene mucho MOOP concentrado, la responsabilidad cae sobre el campamento o instalación en ese lugar. Si la basura está distribuida (como los lag bolts en 2025), el problema es del proceso colectivo de desmontaje. Esa distinción es clave: permite atacar la causa raíz en lugar de solo culpar al actor visible.&lt;/p&gt;

&lt;p&gt;Para entender cómo se traduciría esto a código, una verificación BLM mínima podría modelarse así:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;moop_zones&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7:30-A&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;color&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;green&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items_found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;area_acres&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7:30-B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;color&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yellow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items_found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;area_acres&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;7:30-C&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;color&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;red&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items_found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;area_acres&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;BLM_THRESHOLD_SQFT_PER_ACRE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;SQFT_PER_ITEM_AVG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;  &lt;span class="c1"&gt;# estimacion gruesa
&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;passes_blm_inspection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zones&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_failures&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;failures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;zones&lt;/span&gt;
        &lt;span class="nf"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;items_found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;SQFT_PER_ITEM_AVG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;area_acres&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;BLM_THRESHOLD_SQFT_PER_ACRE&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;failures&lt;/span&gt;  &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="err"&gt;💡&lt;/span&gt; &lt;span class="n"&gt;Tip&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;Si&lt;/span&gt; &lt;span class="n"&gt;tu&lt;/span&gt; &lt;span class="n"&gt;equipo&lt;/span&gt; &lt;span class="n"&gt;opera&lt;/span&gt; &lt;span class="n"&gt;con&lt;/span&gt; &lt;span class="n"&gt;SLOs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;esta&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;analogía&lt;/span&gt; &lt;span class="n"&gt;exacta&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cada&lt;/span&gt; &lt;span class="n"&gt;zona&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;MOOP&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;SLI&lt;/span&gt; &lt;span class="n"&gt;individual&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;umbral&lt;/span&gt; &lt;span class="n"&gt;por&lt;/span&gt; &lt;span class="n"&gt;acre&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;SLO&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;límite&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt; &lt;span class="n"&gt;fallas&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt; &lt;span class="n"&gt;budget&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Burning&lt;/span&gt; &lt;span class="n"&gt;Man&lt;/span&gt; &lt;span class="n"&gt;lleva&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="n"&gt;años&lt;/span&gt; &lt;span class="n"&gt;haciendo&lt;/span&gt; &lt;span class="n"&gt;SRE&lt;/span&gt; &lt;span class="n"&gt;sin&lt;/span&gt; &lt;span class="n"&gt;llamarlo&lt;/span&gt; &lt;span class="n"&gt;así&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="c1"&gt;## De métrica de cumplimiento a herramienta de cultura
&lt;/span&gt;
&lt;span class="n"&gt;Lo&lt;/span&gt; &lt;span class="n"&gt;más&lt;/span&gt; &lt;span class="n"&gt;interesante&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;MOOP&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;son&lt;/span&gt; &lt;span class="n"&gt;los&lt;/span&gt; &lt;span class="n"&gt;números&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;lo&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;gente&lt;/span&gt; &lt;span class="n"&gt;hace&lt;/span&gt; &lt;span class="n"&gt;con&lt;/span&gt; &lt;span class="n"&gt;ellos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;El&lt;/span&gt; &lt;span class="n"&gt;reporte&lt;/span&gt; &lt;span class="n"&gt;oficial&lt;/span&gt; &lt;span class="n"&gt;detalla&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;campo&lt;/span&gt; &lt;span class="n"&gt;por&lt;/span&gt; &lt;span class="n"&gt;campo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;qué&lt;/span&gt; &lt;span class="n"&gt;se&lt;/span&gt; &lt;span class="n"&gt;encontró&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt; &lt;span class="n"&gt;su&lt;/span&gt; &lt;span class="n"&gt;footprint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Los&lt;/span&gt; &lt;span class="n"&gt;grupos&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt; &lt;span class="n"&gt;zonas&lt;/span&gt; &lt;span class="n"&gt;rojas&lt;/span&gt; &lt;span class="n"&gt;reciben&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;breakdown&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;su&lt;/span&gt; &lt;span class="n"&gt;contribución&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;basura&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;con&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;expectativa&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="n"&gt;mejoren&lt;/span&gt; &lt;span class="n"&gt;al&lt;/span&gt; &lt;span class="n"&gt;año&lt;/span&gt; &lt;span class="n"&gt;siguiente&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Los&lt;/span&gt; &lt;span class="n"&gt;infractores&lt;/span&gt; &lt;span class="n"&gt;reincidentes&lt;/span&gt; &lt;span class="n"&gt;son&lt;/span&gt; &lt;span class="n"&gt;flagueados&lt;/span&gt; &lt;span class="n"&gt;al&lt;/span&gt; &lt;span class="n"&gt;equipo&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="n"&gt;asigna&lt;/span&gt; &lt;span class="n"&gt;ubicaciones&lt;/span&gt; &lt;span class="n"&gt;futuras&lt;/span&gt; &lt;span class="err"&gt;—&lt;/span&gt;&lt;span class="n"&gt;si&lt;/span&gt; &lt;span class="n"&gt;dejaste&lt;/span&gt; &lt;span class="n"&gt;basura&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;te&lt;/span&gt; &lt;span class="n"&gt;toca&lt;/span&gt; &lt;span class="n"&gt;peor&lt;/span&gt; &lt;span class="n"&gt;lugar&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;año&lt;/span&gt; &lt;span class="n"&gt;siguiente&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;te&lt;/span&gt; &lt;span class="n"&gt;toca&lt;/span&gt; &lt;span class="n"&gt;lugar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Pero&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;fuerza&lt;/span&gt; &lt;span class="n"&gt;más&lt;/span&gt; &lt;span class="n"&gt;poderosa&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;institucional&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Es&lt;/span&gt; &lt;span class="n"&gt;social&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Cada&lt;/span&gt; &lt;span class="n"&gt;año&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;al&lt;/span&gt; &lt;span class="n"&gt;publicarse&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;mapa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;subreddit&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;Burning&lt;/span&gt; &lt;span class="n"&gt;Man&lt;/span&gt; &lt;span class="n"&gt;lanza&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MOOP Map shame thread&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;donde&lt;/span&gt; &lt;span class="n"&gt;los&lt;/span&gt; &lt;span class="n"&gt;participantes&lt;/span&gt; &lt;span class="n"&gt;señalan&lt;/span&gt; &lt;span class="n"&gt;públicamente&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;los&lt;/span&gt; &lt;span class="n"&gt;campamentos&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="n"&gt;dejaron&lt;/span&gt; &lt;span class="n"&gt;zonas&lt;/span&gt; &lt;span class="n"&gt;rojas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Es&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;mecanismo&lt;/span&gt; &lt;span class="n"&gt;informal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;orquestado&lt;/span&gt; &lt;span class="n"&gt;por&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;organización&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pero&lt;/span&gt; &lt;span class="n"&gt;brutalmente&lt;/span&gt; &lt;span class="n"&gt;efectivo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nadie&lt;/span&gt; &lt;span class="n"&gt;quiere&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="n"&gt;su&lt;/span&gt; &lt;span class="n"&gt;crew&lt;/span&gt; &lt;span class="n"&gt;aparezca&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;La&lt;/span&gt; &lt;span class="n"&gt;transparencia&lt;/span&gt; &lt;span class="n"&gt;genera&lt;/span&gt; &lt;span class="n"&gt;vergüenza&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;vergüenza&lt;/span&gt; &lt;span class="n"&gt;disciplina&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Para&lt;/span&gt; &lt;span class="n"&gt;cualquier&lt;/span&gt; &lt;span class="n"&gt;equipo&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;esto&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;profundamente&lt;/span&gt; &lt;span class="n"&gt;familiar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;Dashboards&lt;/span&gt; &lt;span class="n"&gt;públicos&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;uptime&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;tipo&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="n"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;Mapas&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;cobertura&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;tests&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;visibles&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt; &lt;span class="n"&gt;cada&lt;/span&gt; &lt;span class="n"&gt;PR&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;Rankings&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;contribución&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt; &lt;span class="n"&gt;GitHub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;Métricas&lt;/span&gt; &lt;span class="n"&gt;DORA&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;visibles&lt;/span&gt; &lt;span class="n"&gt;para&lt;/span&gt; &lt;span class="n"&gt;toda&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;organización&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;Heat&lt;/span&gt; &lt;span class="n"&gt;maps&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;errores&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;en&lt;/span&gt; &lt;span class="n"&gt;Datadog&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;Sentry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;atribuibles&lt;/span&gt; &lt;span class="n"&gt;por&lt;/span&gt; &lt;span class="n"&gt;servicio&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;Todos&lt;/span&gt; &lt;span class="n"&gt;operan&lt;/span&gt; &lt;span class="n"&gt;bajo&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;misma&lt;/span&gt; &lt;span class="n"&gt;lógica&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Cuando&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;dato&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt; &lt;span class="n"&gt;público&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;atribuible&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;comportamiento&lt;/span&gt; &lt;span class="n"&gt;cambia&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;El&lt;/span&gt; &lt;span class="n"&gt;MOOP&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt; &lt;span class="n"&gt;demuestra&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="n"&gt;esto&lt;/span&gt; &lt;span class="n"&gt;funciona&lt;/span&gt; &lt;span class="n"&gt;incluso&lt;/span&gt; &lt;span class="n"&gt;fuera&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;software&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;con&lt;/span&gt; &lt;span class="n"&gt;una&lt;/span&gt; &lt;span class="n"&gt;población&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="mf"&gt;70.000&lt;/span&gt; &lt;span class="n"&gt;personas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sin&lt;/span&gt; &lt;span class="n"&gt;enforcement&lt;/span&gt; &lt;span class="n"&gt;automatizado&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="err"&gt;⚠️&lt;/span&gt; &lt;span class="n"&gt;Ojo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="n"&gt;Las&lt;/span&gt; &lt;span class="n"&gt;métricas&lt;/span&gt; &lt;span class="n"&gt;tienen&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;costo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gobernarlas&lt;/span&gt; &lt;span class="n"&gt;mal&lt;/span&gt; &lt;span class="n"&gt;puede&lt;/span&gt; &lt;span class="n"&gt;generar&lt;/span&gt; &lt;span class="nf"&gt;gaming &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;gente&lt;/span&gt; &lt;span class="n"&gt;optimiza&lt;/span&gt; &lt;span class="n"&gt;para&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;número&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;para&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="n"&gt;real&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt; &lt;span class="n"&gt;El&lt;/span&gt; &lt;span class="n"&gt;MOOP&lt;/span&gt; &lt;span class="n"&gt;Map&lt;/span&gt; &lt;span class="n"&gt;evita&lt;/span&gt; &lt;span class="n"&gt;esto&lt;/span&gt; &lt;span class="n"&gt;porque&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;métrica&lt;/span&gt; &lt;span class="n"&gt;está&lt;/span&gt; &lt;span class="n"&gt;alineada&lt;/span&gt; &lt;span class="n"&gt;al&lt;/span&gt; &lt;span class="n"&gt;outcome&lt;/span&gt; &lt;span class="nf"&gt;real &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;limpieza&lt;/span&gt; &lt;span class="n"&gt;física&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;proxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Cuando&lt;/span&gt; &lt;span class="n"&gt;diseñes&lt;/span&gt; &lt;span class="n"&gt;métricas&lt;/span&gt; &lt;span class="n"&gt;para&lt;/span&gt; &lt;span class="n"&gt;tu&lt;/span&gt; &lt;span class="n"&gt;equipo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pregúntate&lt;/span&gt; &lt;span class="n"&gt;primero&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="err"&gt;¿&lt;/span&gt;&lt;span class="n"&gt;qué&lt;/span&gt; &lt;span class="n"&gt;pasa&lt;/span&gt; &lt;span class="n"&gt;si&lt;/span&gt; &lt;span class="n"&gt;alguien&lt;/span&gt; &lt;span class="n"&gt;optimiza&lt;/span&gt; &lt;span class="n"&gt;esto&lt;/span&gt; &lt;span class="n"&gt;al&lt;/span&gt; &lt;span class="n"&gt;máximo&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt; &lt;span class="err"&gt;¿&lt;/span&gt;&lt;span class="n"&gt;El&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="n"&gt;real&lt;/span&gt; &lt;span class="n"&gt;mejora&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;solo&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;número&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;

&lt;span class="n"&gt;El&lt;/span&gt; &lt;span class="n"&gt;barrido&lt;/span&gt; &lt;span class="n"&gt;forense&lt;/span&gt; &lt;span class="n"&gt;lo&lt;/span&gt; &lt;span class="n"&gt;hacen&lt;/span&gt; &lt;span class="mi"&gt;150&lt;/span&gt; &lt;span class="n"&gt;voluntarios&lt;/span&gt; &lt;span class="n"&gt;alineados&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;distancia&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt; &lt;span class="n"&gt;un&lt;/span&gt; &lt;span class="n"&gt;brazo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="c1"&gt;## Cómo funciona el ciclo MOOP de punta a punta
&lt;/span&gt;
&lt;span class="n"&gt;El&lt;/span&gt; &lt;span class="n"&gt;proceso&lt;/span&gt; &lt;span class="n"&gt;completo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;desde&lt;/span&gt; &lt;span class="n"&gt;el&lt;/span&gt; &lt;span class="n"&gt;final&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;evento&lt;/span&gt; &lt;span class="n"&gt;hasta&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;decisión&lt;/span&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;BLM&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sigue&lt;/span&gt; &lt;span class="n"&gt;una&lt;/span&gt; &lt;span class="n"&gt;secuencia&lt;/span&gt; &lt;span class="n"&gt;clara&lt;/span&gt; &lt;span class="n"&gt;que&lt;/span&gt; &lt;span class="n"&gt;vale&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;pena&lt;/span&gt; &lt;span class="n"&gt;visualizar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;graph LR&lt;br&gt;
    A["Evento Burning Man 8 dias"] --&amp;gt; B["Desmontaje de campamentos"]&lt;br&gt;
    B --&amp;gt; C["Equipo MOOP entra al sitio"]&lt;br&gt;
    C --&amp;gt; D["Barrido forense semanas"]&lt;br&gt;
    D --&amp;gt; E["Geolocalizacion y catalogo"]&lt;br&gt;
    E --&amp;gt; F["Publicacion MOOP Map"]&lt;br&gt;
    F --&amp;gt; G["Inspeccion BLM 120 puntos"]&lt;br&gt;
    G --&amp;gt; H{"Pasa la prueba"}&lt;br&gt;
    H --&amp;gt;|Si| I["Black Rock City vuelve"]&lt;br&gt;
    H --&amp;gt;|No| J["Permiso en riesgo"]&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


Lo interesante de este pipeline es que el output con mayor impacto no es la decisión del BLM (que casi siempre es "sí"), sino la publicación del mapa. Es ahí donde se cierra el feedback loop con la comunidad y donde se genera la presión social que lleva a la mejora del año siguiente. El BLM es la condición de borde; el mapa público es la herramienta de cambio.

## Qué sigue para el MOOP Map

¿Para dónde va el MOOP Map? La metodología base —barrido humano más georreferenciación manual— probablemente se mantenga, porque la precisión de un humano caminando despacio en busca de objetos pequeños es difícil de superar con sensores. Pero hay espacio para innovación.

### Posibles innovaciones tecnológicas

- **Drones con cámaras de alta resolución**: para escaneo previo de zonas y priorización de cuadrillas.
- **Computer vision**: clasificación automática de tipos de basura en imágenes de drone.
- **Análisis predictivo**: identificar campamentos con riesgo alto antes del desmontaje, basándose en patrones históricos por ubicación, tamaño y tipo de instalación.
- **Datasets abiertos**: publicación estructurada de los hallazgos para análisis externo, con investigadores académicos ya interesados en el material.

Por ahora, el equipo de Restauración Ambiental se mantiene en el método clásico, pero con un dataset que ya cubre dos décadas, hay material rico para que investigadores externos lo estudien. La comunidad data science alrededor del MOOP Map empieza a tomar forma —no formal, pero existente.

La lección más importante para 2026 y más allá: la mejor manera de crear cultura de Leave No Trace no es predicarla. Es medirla y publicar la medición. Para los equipos en LATAM que están construyendo sistemas, productos o comunidades, ese principio es totalmente exportable.

📖 Resumen en Telegram: [Ver resumen](#)

## Preguntas frecuentes

### ¿Qué significa MOOP exactamente?

MOOP significa *Matter Out of Place*: cualquier objeto humano que no debería estar en el desierto de Black Rock. Va desde un tornillo perdido hasta un pedazo de plástico de medio milímetro. La única excepción son las pisadas humanas en el polvo, que son inevitables.

### ¿Quién hace el barrido y cuánto dura?

Aproximadamente 150 voluntarios y empleados del equipo de Restauración Ambiental hacen el sweep. El proceso dura varias semanas después del cierre oficial del evento, dependiendo del tamaño del año y de qué tan MOOPier esté el sitio. Caminan en líneas paralelas a un brazo de distancia entre sí.

### ¿Qué pasa si Burning Man no pasa la inspección del BLM?

Si más de 12 de los 120 puntos de muestreo del BLM superan el límite de un pie cuadrado de basura por acre, el evento podría perder el permiso para regresar. Hasta hoy nunca ha fallado, pero en 2023 estuvo a un solo punto de hacerlo.

### ¿Por qué los lag bolts son el problema dominante en 2025?

Los lag bolts son tirafondos largos que se usan para anclar tiendas, instalaciones de arte y estructuras al suelo. Al desmontar, es fácil que uno se afloje y desaparezca bajo el polvo. No hay un solo culpable: prácticamente todos los campamentos perdieron alguno. Es un patrón distribuido, no concentrado.

### ¿Cómo se castiga a un campamento que deja mucha basura?

Los reincidentes son flagueados al equipo que asigna ubicaciones futuras dentro de Black Rock City. Pueden recibir peor ubicación al año siguiente o, en casos graves, perder el derecho a tener un placement en el evento. Adicionalmente hay presión social informal en redes (el famoso "MOOP Map shame thread" en Reddit).

### ¿Hay datasets abiertos disponibles para análisis?

Burning Man publica el mapa con sus colores y estadísticas agregadas, pero no un dataset estructurado completo. Los datos crudos quedan internos al equipo de Restauración Ambiental. Hay interés creciente en abrir más datos para investigación académica.

## Referencias

- [Not-Ship: The map that keeps Burning Man honest](https://www.not-ship.com/burning-man-moop/) — análisis original con visualizaciones del MOOP Map 2025.
- [Burning Man Project](https://burningman.org/) — sitio oficial del evento, incluye documentación sobre Leave No Trace y proceso MOOP.
- [Wikipedia: Burning Man](https://en.wikipedia.org/wiki/Burning_Man) — historia del evento, contexto regulatorio y estadísticas de asistencia.
- [r/BurningMan](https://www.reddit.com/r/BurningMan/) — comunidad activa donde se publica anualmente el MOOP Map shame thread.

📱 **¿Te gusta este contenido?** Únete a nuestro canal de Telegram [@programacion](https://t.me/programacion) donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Permacomputing: 10 principios para una computación sostenible</title>
      <dc:creator>lu1tr0n</dc:creator>
      <pubDate>Thu, 07 May 2026 08:20:10 +0000</pubDate>
      <link>https://forem.com/lu1tr0n/permacomputing-10-principios-para-una-computacion-sostenible-29a</link>
      <guid>https://forem.com/lu1tr0n/permacomputing-10-principios-para-una-computacion-sostenible-29a</guid>
      <description>&lt;p&gt;El concepto de &lt;strong&gt;permacomputing&lt;/strong&gt; empieza a salir de los círculos académicos y los foros de hackers para instalarse en debates serios sobre el futuro del software. La idea es simple en su enunciado y radical en sus consecuencias: aplicar las éticas de la permacultura —cuidar la tierra, cuidar las personas, redistribuir lo justo— al diseño, construcción y mantenimiento de sistemas computacionales. El sitio oficial &lt;a href="https://permacomputing.net/principles/" rel="noopener noreferrer"&gt;permacomputing.net&lt;/a&gt; publica diez principios que guían esta práctica, y en 2026 el debate ha ganado relevancia frente al crecimiento explosivo del consumo energético de la inteligencia artificial y de los desechos electrónicos.&lt;/p&gt;

&lt;p&gt;Para quien escribe código, configura infraestructura o decide qué dispositivo comprar, permacomputing no es una doctrina prescriptiva sino un marco para hacerse mejores preguntas. ¿Necesito desplegar este modelo en GPUs nuevas o un modelo más pequeño basta? ¿Tiene sentido reescribir esta app en Electron y triplicar el consumo de RAM? ¿Vale la pena renovar la flota de laptops cada tres años cuando la mayoría sigue funcionando? Las respuestas no están escritas, pero los principios ayudan a formularlas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es permacomputing
&lt;/h2&gt;

&lt;p&gt;El término permacomputing fue acuñado en 2020 por el programador finlandés &lt;strong&gt;Ville-Matias "viznut" Heikkilä&lt;/strong&gt;, conocido en la escena demoscene por sus experimentos con computación en condiciones extremas (programas que generan música compleja con apenas unas líneas de C). Su ensayo original proponía repensar la informática desde una perspectiva post-crecimiento, asumiendo que los recursos materiales para fabricar chips, baterías y data centers son finitos.&lt;/p&gt;

&lt;p&gt;El movimiento se inspira directamente en la &lt;strong&gt;permacultura&lt;/strong&gt;, una corriente de diseño agrícola y ecológico nacida en Australia en 1978 con los trabajos de Bill Mollison y David Holmgren. Permacultura no es solo agricultura orgánica: es un sistema de diseño que observa los ciclos naturales y crea soluciones de bajo consumo, alta resiliencia y mínima intervención. Permacomputing toma ese mismo espíritu y lo traduce al hardware, los sistemas operativos, los protocolos y las prácticas de desarrollo.&lt;/p&gt;

&lt;p&gt;La comunidad —que mantiene un working group activo y publica documentación abierta— deja claro que &lt;em&gt;permacomputing no es prescriptivo&lt;/em&gt;. No te dice qué lenguaje usar ni qué editor abrir. Lo que ofrece son lentes para mirar tu propia práctica y preguntarte si lo que estás construyendo aporta valor proporcional al costo socioambiental que implica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contexto: de la permacultura a los servidores solares
&lt;/h2&gt;

&lt;p&gt;Antes de entrar en los principios conviene situar el movimiento dentro de una genealogía. Hay precedentes claros que prepararon el terreno:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low-tech Magazine&lt;/strong&gt; (Kris De Decker, 2007) — una revista digital que desde 2018 corre sobre un servidor alimentado por paneles solares. Cuando no hay sol, el sitio se cae. Esa "limitación" es el punto.- &lt;strong&gt;The Small Web&lt;/strong&gt; y el &lt;strong&gt;250kb Club&lt;/strong&gt; — iniciativas que celebran sitios web livianos, sin trackers ni frameworks pesados.- &lt;strong&gt;100R / Hundred Rabbits&lt;/strong&gt; — el colectivo de Devine Lu Linvega y Rekka Bellum, que vive en un velero y desarrolla herramientas (Uxn, Orca, Left) optimizadas para correr con energía limitada.- &lt;strong&gt;Solarpunk&lt;/strong&gt; — el movimiento estético-político que imagina futuros tecnológicos en armonía con la biósfera.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Permacomputing recoge ideas de todas estas tradiciones y las organiza alrededor de diez principios concretos. El sitio permacomputing.net documenta cada uno con ejemplos, lecturas adicionales y estrategias de aplicación tanto para personas técnicas como para usuarios casuales.&lt;br&gt;
Servidores de bajo consumo: la práctica que inspira a permacomputing.&lt;/p&gt;
&lt;h2&gt;
  
  
  Los 10 principios, en español
&lt;/h2&gt;

&lt;p&gt;A continuación una traducción comentada de los diez principios. La versión completa con todos los matices vive en &lt;a href="https://permacomputing.net/principles/" rel="noopener noreferrer"&gt;permacomputing.net/principles&lt;/a&gt;:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Cuidar la vida
&lt;/h3&gt;

&lt;p&gt;Toda decisión técnica debe ponderar su impacto sobre los seres vivos —humanos y no humanos— y sobre los ecosistemas. Es el principio raíz, equivalente al "Earth Care" de la permacultura.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Cuidar todo el hardware (especialmente los chips)
&lt;/h3&gt;

&lt;p&gt;Los microchips son los componentes más caros de fabricar en términos energéticos y materiales: requieren litros de agua ultrapura, gases raros, energía intensiva y son prácticamente imposibles de reciclar. Maximizar la vida útil de cada dispositivo es un acto político.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. Mantenerlo pequeño
&lt;/h3&gt;

&lt;p&gt;El bloat es enemigo. Un binario más liviano no solo carga más rápido: cabe en hardware viejo, consume menos memoria, pesa menos en la red. Hay un linaje claro entre suckless, plan9 y este principio.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. Esperar lo mejor, prepararse para lo peor
&lt;/h3&gt;

&lt;p&gt;Diseñar sistemas resilientes a interrupciones, fallas de red, cortes de energía o colapso parcial. No por catastrofismo, sino porque la fragilidad ya es la realidad de millones de personas con conexiones inestables y hardware limitado.&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Mantenerlo flexible
&lt;/h3&gt;

&lt;p&gt;Sistemas que se adaptan a contextos diversos en lugar de imponer un único entorno "óptimo".&lt;/p&gt;
&lt;h3&gt;
  
  
  6. Construir sobre tierra firme
&lt;/h3&gt;

&lt;p&gt;Apoyarse en estándares abiertos, formatos durables, dependencias estables. Evitar construir sobre arenas movedizas (APIs propietarias que mañana cambian, frameworks que se reescriben cada dos años).&lt;/p&gt;
&lt;h3&gt;
  
  
  7. Amplificar la conciencia
&lt;/h3&gt;

&lt;p&gt;La computación puede fortalecer ecosistemas mediante proyectos de citizen science: medición de calidad del aire, biodiversidad, contaminación. Datos abiertos para tomar mejores decisiones colectivas.&lt;/p&gt;
&lt;h3&gt;
  
  
  8. Exponer todo (sin cajas negras)
&lt;/h3&gt;

&lt;p&gt;Transparencia en arquitectura, código y procesos. El usuario debería poder entender qué hace su software y por qué.&lt;/p&gt;
&lt;h3&gt;
  
  
  9. Responder a los cambios
&lt;/h3&gt;

&lt;p&gt;Adaptarse en lugar de imponer. Permacomputing prefiere sistemas evolutivos a soluciones rígidas.&lt;/p&gt;
&lt;h3&gt;
  
  
  10. Todo tiene su lugar (y a veces lo correcto es no hacer)
&lt;/h3&gt;

&lt;p&gt;Antes de añadir tecnología, preguntarse si realmente hace falta. El principio "Not Doing" reconoce que la mejor solución muchas veces es no construir nada nuevo.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Tip:&lt;/strong&gt; Antes de aceptar un ticket que pide "agregar IA" a una feature existente, pasalo por el filtro del principio 10. ¿Se resuelve mejor con un select bien hecho? ¿Ya existe la funcionalidad y basta documentarla?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  Datos y cifras: por qué importa ahora
&lt;/h2&gt;

&lt;p&gt;Los números detrás de la urgencia de permacomputing son contundentes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;62 millones de toneladas&lt;/strong&gt; de basura electrónica generadas en 2022 según el UN Global E-Waste Monitor —el equivalente al peso de unos 1.500 buques cargueros— y se proyectan 82 millones para 2030.- &lt;strong&gt;Entre 1% y 2% del consumo eléctrico mundial&lt;/strong&gt; proviene de los data centers, una cifra que la Agencia Internacional de Energía estima podría duplicarse para 2030 por la demanda de IA.- Producir un solo chip moderno consume &lt;strong&gt;miles de litros de agua ultrapura&lt;/strong&gt; y emite gases con potencial de calentamiento global miles de veces superior al CO₂.- Apenas el &lt;strong&gt;22%&lt;/strong&gt; del e-waste mundial se recicla formalmente. El resto termina en vertederos del Sur Global, contaminando suelos y aguas.- Una laptop promedio emite alrededor de &lt;strong&gt;300 kg de CO₂&lt;/strong&gt; en su fabricación —más que un vuelo Buenos Aires–Madrid en clase económica.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estos números explican por qué hablar de "computación sostenible" sin revisar el modelo de fabricación y descarte es una conversación incompleta.&lt;/p&gt;
&lt;h2&gt;
  
  
  Impacto en la práctica de desarrollo
&lt;/h2&gt;

&lt;p&gt;Aplicar permacomputing al día a día como developer no requiere mudarse a un velero. Hay decisiones cotidianas con impacto real:&lt;/p&gt;
&lt;h3&gt;
  
  
  Stack técnico
&lt;/h3&gt;

&lt;p&gt;Preferir lenguajes y runtimes eficientes cuando el caso lo permite. No todo necesita correr sobre Node + Electron + 80 dependencias. Una CLI en Go, una app TUI en Rust, un script en Python sencillo: muchas veces alcanza.&lt;/p&gt;
&lt;h3&gt;
  
  
  Infraestructura
&lt;/h3&gt;

&lt;p&gt;Elegir proveedores con energía renovable verificable. Un servidor en una región con grid limpio (Quebec, Islandia, partes de Brasil con hidroeléctrica) tiene una huella significativamente menor que el mismo workload en una región dominada por carbón.&lt;/p&gt;
&lt;h3&gt;
  
  
  Hardware
&lt;/h3&gt;

&lt;p&gt;Refurbished antes que nuevo. Reparar antes que reemplazar. Iniciativas como &lt;strong&gt;Framework Laptop&lt;/strong&gt; o &lt;strong&gt;iFixit&lt;/strong&gt; demuestran que es posible diseñar hardware reparable y seguir siendo competitivo.&lt;/p&gt;
&lt;h3&gt;
  
  
  Software
&lt;/h3&gt;

&lt;p&gt;Empacar binarios optimizados, no incluir dependencias innecesarias, soportar arquitecturas viejas cuando sea barato hacerlo. Aceptar que tu código va a correr en un equipo con 4GB de RAM en algún lugar del mundo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Auditar el peso real de tu app antes de shipear&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; dist/
&lt;span class="c"&gt;# 245M  dist/  ← ¿es necesario?&lt;/span&gt;

&lt;span class="c"&gt;# Bundle analyzer para webpack/vite&lt;/span&gt;
npx vite-bundle-visualizer

&lt;span class="c"&gt;# Para imágenes Docker, dive permite explorar capa por capa&lt;/span&gt;
dive my-image:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Ojo:&lt;/strong&gt; "small" no significa "primitivo". Permacomputing no romantiza la pobreza tecnológica. La idea es construir lo mínimo necesario para resolver el problema con elegancia, no privarse de herramientas útiles por dogmatismo.&lt;br&gt;
La cultura de la reparación: permacomputing avant la lettre en LATAM.&lt;/p&gt;
&lt;h2&gt;
  
  
  Permacomputing en clave LATAM
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;América Latina tiene una relación particular con muchos de estos principios porque, en gran medida, ya los practica por necesidad. La cultura de la reparación —del taller que arregla un Nokia 3310 al técnico que mantiene servidores Pentium 4 corriendo en el ministerio— es permacomputing avant la lettre.&lt;/p&gt;

&lt;p&gt;Algunos puntos donde la región está naturalmente alineada con el movimiento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reuso de hardware&lt;/strong&gt; — laptops corporativas usadas que llegan al mercado secundario después de ciclos de 3-5 años en empresas. En Argentina, Chile, México y Colombia hay un mercado robusto de equipos refurbished.- &lt;strong&gt;Conexiones inestables&lt;/strong&gt; — apps que funcionan offline-first, PWAs livianas y código que tolera latencia son parte del kit básico de cualquier developer regional.- &lt;strong&gt;Cortes de energía&lt;/strong&gt; — UPS, generadores, salvado automático cada minuto. La resiliencia no es teoría.- &lt;strong&gt;Frugalidad técnica&lt;/strong&gt; — no hay presupuesto para reemplazar todo cada año, así que mantener viejo es la norma.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Donde permacomputing puede aportar más a la región es en darle &lt;em&gt;marco conceptual y dignidad&lt;/em&gt; a prácticas que muchas veces se ven como signos de subdesarrollo, cuando en realidad son ventajas competitivas para construir software resiliente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diagrama: permacultura como raíz
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TD
    A["Permacultura (1978)"] --&amp;gt; B["Earth Care"]
    A --&amp;gt; C["People Care"]
    A --&amp;gt; D["Fair Share"]
    B --&amp;gt; E["Permacomputing"]
    C --&amp;gt; E
    D --&amp;gt; E
    E --&amp;gt; F["10 principios"]
    F --&amp;gt; G["Cuidar el hardware"]
    F --&amp;gt; H["Mantenerlo pequeno"]
    F --&amp;gt; I["Resiliencia"]
    F --&amp;gt; J["No hacer"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Qué sigue para el movimiento
&lt;/h2&gt;

&lt;p&gt;Permacomputing está en una etapa de consolidación. La working group publica artículos, organiza encuentros y mantiene el sitio principal. Hay una comunidad activa en el fediverso (Mastodon) bajo el hashtag &lt;code&gt;#permacomputing&lt;/code&gt;, conferencias relacionadas como &lt;strong&gt;handmade.network&lt;/strong&gt; y &lt;strong&gt;HOPE&lt;/strong&gt;, y una creciente literatura académica sobre "computación sustentable" que dialoga con estas ideas.&lt;/p&gt;

&lt;p&gt;El próximo desafío del movimiento es escalar sin perder coherencia. Que un principio inspire una práctica concreta —y verificable— es mucho más útil que diez principios bonitos sin tracción. Iniciativas como bandwidth budgets en sitios estáticos, calculadoras de huella de carbono para websites (&lt;a href="https://www.websitecarbon.com/" rel="noopener noreferrer"&gt;websitecarbon.com&lt;/a&gt;) y certificaciones de software verde empiezan a operacionalizar estos valores.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💭 Clave:&lt;/strong&gt; Permacomputing no es anti-tecnología. Es anti-desperdicio. La pregunta no es "¿menos computación?" sino "¿qué computación, para quién y por cuánto tiempo?".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;📖 Resumen en Telegram: Ver resumen&lt;/p&gt;

&lt;h2&gt;
  
  
  Preguntas frecuentes
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ¿Permacomputing es lo mismo que green computing?
&lt;/h3&gt;

&lt;p&gt;No exactamente. Green computing suele enfocarse en eficiencia energética dentro del paradigma actual. Permacomputing cuestiona el paradigma mismo: el modelo de crecimiento perpetuo, la obsolescencia programada y la dependencia de hardware nuevo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Tengo que dejar de usar Kubernetes?
&lt;/h3&gt;

&lt;p&gt;No. Permacomputing no prohíbe tecnologías, propone preguntarse si son la herramienta adecuada para cada caso. Si tu workload realmente justifica orquestación distribuida, adelante. Si lo usás para un blog estático que recibe 100 visitas al día, quizá un VPS de cinco dólares al mes alcanza.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Quién mantiene permacomputing.net?
&lt;/h3&gt;

&lt;p&gt;Una working group informal compuesta por desarrolladores, artistas, investigadores y activistas. Es un proyecto comunitario sin financiamiento corporativo.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Existen herramientas concretas alineadas con estos principios?
&lt;/h3&gt;

&lt;p&gt;Sí. Algunos ejemplos: el navegador &lt;strong&gt;Dillo&lt;/strong&gt;, el sistema operativo &lt;strong&gt;9front&lt;/strong&gt;, los lenguajes &lt;strong&gt;Uxn&lt;/strong&gt; y &lt;strong&gt;Orca&lt;/strong&gt; de Hundred Rabbits, distribuciones Linux livianas como &lt;strong&gt;Alpine&lt;/strong&gt; y &lt;strong&gt;Void&lt;/strong&gt;, y el ecosistema &lt;strong&gt;suckless&lt;/strong&gt; (dwm, st, surf).&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Cómo empiezo a aplicar permacomputing en mi trabajo?
&lt;/h3&gt;

&lt;p&gt;Auditá. Medí el peso de tus apps, el consumo de tu pipeline de CI/CD, el ciclo de vida del hardware que decidís comprar. Sin datos no hay diagnóstico, y sin diagnóstico no hay cambio.&lt;/p&gt;

&lt;h3&gt;
  
  
  ¿Es viable para una startup que necesita escalar rápido?
&lt;/h3&gt;

&lt;p&gt;Depende del nicho. Para muchas startups B2B con tracción incipiente, ir lean en stack y hardware reduce burn rate y alarga la pista. Permacomputing y unit economics se llevan mejor de lo que parece.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://permacomputing.net/principles/" rel="noopener noreferrer"&gt;permacomputing.net/principles&lt;/a&gt; — los 10 principios oficiales con explicaciones extendidas y estrategias de aplicación.- &lt;a href="https://solar.lowtechmagazine.com/" rel="noopener noreferrer"&gt;solar.lowtechmagazine.com&lt;/a&gt; — la revista que corre sobre un servidor solar y se cae cuando no hay sol suficiente.- &lt;a href="https://wiki.xxiivv.com/site/permacomputing.html" rel="noopener noreferrer"&gt;wiki.xxiivv.com&lt;/a&gt; — la página de Devine Lu Linvega (Hundred Rabbits) sobre permacomputing y herramientas asociadas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;📱 &lt;strong&gt;¿Te gusta este contenido?&lt;/strong&gt; Únete a nuestro canal de Telegram &lt;a href="https://t.me/programacion" rel="noopener noreferrer"&gt;@programacion&lt;/a&gt; donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.&lt;/p&gt;

</description>
      <category>technology</category>
      <category>science</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
