wandres.dev
NIVEL DIOS: SÍNTESIS · la plataforma completa

Hacia dónde va la plataforma y cómo seguir aprendiendo

La última lección del track mira hacia adelante con la misma exigencia con la que miró hacia atrás. Tres movimientos explican casi todo lo que Cloudflare ha hecho en los últimos años y casi todo lo que hará: la convergencia de cada producto hacia un único primitivo que es el Worker con bindings, la apuesta por la IA con estado sobre Durable Objects, y la infraestructura de compatibilidad que permite que la plataforma cambie sin romperte. Cerramos con un método de aprendizaje continuo que no depende de que alguien escriba el siguiente tutorial.

⏱ 23 min

Termina el track y queda la pregunta más difícil de todas, porque es la única que no se puede responder leyendo documentación: qué de lo que has aprendido seguirá siendo cierto dentro de tres años. La respuesta honesta tiene dos partes. Una parte de lo aprendido caducará —nombres de productos, límites concretos, APIs que se sustituyen por otras mejores— y no pasa nada, porque esa parte se vuelve a aprender en una tarde. La otra parte no caduca, porque no describe una plataforma sino una física: dónde está el cómputo respecto al estado, cuántas veces hay que cruzar esa distancia y qué garantías necesita cada hecho. Esta lección separa las dos, muestra hacia dónde apunta la trayectoria y te deja un método para seguir solo.

🎯 Al terminar esta lección sabrás
  • Identificar la convergencia hacia un único primitivo y qué implica para tus decisiones de hoy.
  • Entender por qué la IA con estado es la apuesta central y por qué encaja con Durable Objects.
  • Usar las compatibility dates como la infraestructura que permite evolucionar sin romper.
  • Adoptar un método de aprendizaje continuo que no dependa de que existan tutoriales.

La convergencia: todo termina siendo un Worker con bindings

El movimiento más claro de los últimos años no es un producto nuevo, es una simplificación. Durante un tiempo, Cloudflare tuvo dos formas de desplegar una aplicación: Pages, orientada a sitios con assets y funciones, y Workers, orientada a código. Esa dualidad se resolvió en una dirección: Pages quedó en modo heredado y Workers absorbió sus capacidades, sirviendo assets estáticos de forma nativa, con vistas previas por rama y compilación gestionada. Hoy no hay decisión que tomar, y esa es exactamente la señal que interesa: la plataforma prefiere quitar un concepto antes que mantener dos caminos.

Esa señal es más informativa de lo que parece. Una plataforma que retira un camino asume un coste real —usuarios que migran, documentación que reescribir, reputación que arriesgar— y solo lo hace cuando cree que la simplificación resultante lo compensa. Contar cuántos conceptos añade y cuántos retira en un año dice más sobre su dirección que cualquier hoja de ruta publicada.

El mismo patrón se repite en cada rincón. Los Containers no son un producto paralelo con su propio panel y su propio despliegue: se declaran en tu wrangler.jsonc, se gobiernan desde un Worker y reciben identidad estable de un Durable Object. Los Workflows no son un orquestador externo: son una clase que despliegas junto a tu Worker y que se invoca por binding. El Agents SDK no introduce un runtime nuevo: es una capa sobre Durable Objects. Y la composición entre servicios dejó de pasar por HTTP interno para pasar por RPC sobre WorkerEntrypoint, donde llamas a un método de otro servicio como si fuera local, con tipos, sin serializar a mano ni autenticar una frontera de red que no existe.

flowchart TD
W[Worker con bindings] --> A[assets estaticos servidos por la red]
W --> B[Durable Objects con SQLite]
W --> C[Containers gobernados desde el Worker]
W --> D[Workflows como pasos durables]
W --> E[Agents SDK sobre Durable Objects]
W --> F[RPC entre servicios con WorkerEntrypoint]
B --> G[el estado y el codigo en el mismo sitio]
E --> G

La consecuencia práctica es que el número de conceptos que hay que sostener a la vez baja en lugar de subir, y eso es raro en una plataforma que crece. Aprender Cloudflare hoy es aprender un primitivo —el Worker— y una forma de conectar cosas —el binding—, y después ir descubriendo qué se puede enchufar. Comparado con el patrón habitual de las nubes, donde cada capacidad nueva trae su servicio, su consola, su modelo de permisos y su forma de facturar, esta dirección es una apuesta deliberada por que el sistema entero quepa en una cabeza.

Hay una segunda convergencia, más silenciosa y quizá más importante, que ocurre dentro del propio almacenamiento: el estado tiende a colocarse junto al cómputo que lo usa. El backend SQLite de los Durable Objects, que sustituyó al de clave-valor, no es solo un motor más capaz: es la afirmación de que una entidad debe poder responder preguntas sobre sus propios datos sin salir de sí misma. Cuando un objeto puede ejecutar consultas locales sobre su historial, muchas arquitecturas que antes necesitaban una base compartida dejan de necesitarla, y el reparto entre lo que vive dentro de la entidad y lo que vive fuera se desplaza.

// El manifiesto es el mapa entero del sistema: un fichero, todas las decisiones.
{
  "name": "plataforma",
  "main": "src/index.ts",
  "compatibility_date": "2026-01-15",
  "assets": { "directory": "./dist", "binding": "ASSETS" },
  "d1_databases": [{ "binding": "DB", "database_name": "produccion" }],
  "durable_objects": { "bindings": [{ "name": "SALAS", "class_name": "Sala" }] },
  "services": [{ "binding": "NEGOCIO", "service": "core" }],
  "ai": { "binding": "AI" }
}
💡
Cuando dos caminos coexisten, apuesta por el que absorbe

La heurística que mejor ha funcionado en esta plataforma es sencilla: ante dos formas de hacer lo mismo, elige la que está absorbiendo a la otra, aunque hoy tenga alguna carencia. Workers absorbió a Pages; el backend SQLite absorbió al de clave-valor en Durable Objects; los bindings absorbieron a las llamadas HTTP internas. En cada caso, quien apostó por el que absorbía se ahorró una migración y quien se quedó en el camino cómodo la pagó más tarde. La señal que delata cuál es cuál suele estar en la documentación antes que en los anuncios: el camino que absorbe es el que aparece en los ejemplos nuevos.

La apuesta: inteligencia artificial con estado

La segunda dirección es más ambiciosa y explica por qué Cloudflare ha invertido donde ha invertido. La primera generación de aplicaciones de IA era sin estado: una petición, un prompt, una respuesta, y el modelo no recordaba nada entre llamadas. Para eso cualquier plataforma sirve, porque el trabajo real ocurre en el proveedor del modelo y tú solo haces de intermediario.

La generación siguiente no funciona así. Un agente mantiene una conversación que dura días, acumula memoria, ejecuta herramientas, espera aprobaciones humanas, reanuda tras un fallo y coordina con otros agentes. Eso no es una función efímera: es una entidad con identidad, estado propio y ejecución serializada, que es la definición literal de un Durable Object. Y aquí está el argumento estructural: Cloudflare no tuvo que inventar un primitivo para agentes porque llevaba años teniéndolo por otras razones. El objeto que servía para una sala de chat sirve para un agente sin cambiar nada de su naturaleza.

Esa coincidencia no fue planificada y por eso resulta interesante. Los Durable Objects se diseñaron para colaboración y coordinación, mucho antes de que la palabra agente significara lo que significa hoy, y resultaron ser la abstracción exacta que el nuevo problema necesitaba. Cuando eso ocurre en ingeniería suele indicar que el primitivo captura algo real y no una moda: no es una herramienta para agentes, es una herramienta para entidades con estado, y los agentes resultan ser un caso particular.

// Un agente es un Durable Object: identidad estable, estado propio, un hilo.
export class Asistente extends Agent<Env, EstadoAsistente> {
  async onMessage(mensaje: string) {
    this.setState({ ...this.state, turnos: this.state.turnos + 1 });
    if (this.state.gastoAcumulado > this.state.presupuesto) {
      return "presupuesto agotado para esta sesion";
    }
    return this.responderConHerramientas(mensaje);
  }

  async alarm() {
    await this.compactarMemoria(); // el agente sigue vivo sin nadie hablandole
  }
}

Alrededor de ese núcleo, el resto de las piezas de IA encajan sin costuras: Workers AI para inferencia junto a las GPU, Vectorize para la memoria semántica, AI Gateway como el punto único donde se cachea, se limita el ritmo, se reintenta, se hace fallback entre proveedores y —sobre todo— se cuenta el gasto, y Workflows para los procesos largos que un agente dispara y que deben sobrevivir a cualquier fallo. La apuesta completa se resume en una frase: el edge deja de ser donde se sirve contenido y pasa a ser donde vive el estado de los agentes.

Vale la pena traducir esa frase a las cuatro propiedades concretas que un agente necesita y que casi nadie enumera junta. Necesita identidad, para que la conversación de un usuario sea la misma la semana que viene y no una reconstrucción a partir de un histórico. Necesita serialización, para que dos mensajes simultáneos no produzcan dos ramas de memoria divergentes. Necesita durabilidad selectiva, para que un fallo a mitad de una herramienta no repita un pago ya emitido. Y necesita continuar sin nadie delante, para esperar una aprobación, reintentar mañana o compactar su memoria de madrugada. Las cuatro las da el mismo primitivo, y es difícil exagerar cuánto trabajo ahorra que no haya que ensamblarlas de cuatro servicios distintos.

Esa apuesta tiene también una lectura defensiva que explica parte de la inversión. Si el valor de una aplicación de IA se concentrara únicamente en el modelo, las plataformas de infraestructura quedarían reducidas a intermediarios sustituibles y la competencia se decidiría por céntimos. Al situar el valor en el estado —la memoria del agente, sus herramientas, sus permisos, su historial auditable, su presupuesto—, la infraestructura vuelve a ser el sitio donde vive lo que no se puede trasladar de un día para otro. Que esa lectura sea interesada no la hace menos correcta.

Conviene añadir el contrapunto honesto, porque una apuesta es una apuesta. Nadie sabe todavía qué fracción de las aplicaciones de IA necesitará de verdad estado duradero y coordinación, ni si el mercado se decantará por agentes persistentes o por interacciones efímeras con memoria delegada a una base vectorial. Lo que sí puede afirmarse es que, si esa fracción resulta ser grande, esta plataforma parte de una posición estructuralmente distinta a la de sus competidoras, porque las demás tendrían que construir el primitivo y aquí ya estaba.

⚠️
Una tendencia no es una razón para rediseñar lo que funciona

Que la plataforma apunte hacia la IA con estado no significa que tu sistema deba incorporarla. La mayor parte del software valioso que se construye encima de Cloudflare sigue siendo contenido, APIs y aplicaciones multi-tenant, y seguirá siéndolo. Leer la trayectoria sirve para decidir sobre lo nuevo y para no apostar por caminos en retirada, no para justificar reescrituras. El coste de seguir cada tendencia es exactamente el mismo que el de ignorarlas todas, solo que se paga en la dirección contraria.

La infraestructura que permite cambiar sin romper

Hay una pieza que rara vez se nombra al hablar del futuro y que es la que de verdad lo hace posible: las compatibility dates. Cada Worker declara una fecha, y esa fecha congela el comportamiento del runtime tal y como era ese día. Un cambio incompatible que llegue después no te afecta hasta que tú subas la fecha, deliberadamente, y observando qué cambia.

// La fecha congela el runtime: la plataforma puede cambiar sin que tu Worker cambie.
{
  "compatibility_date": "2026-01-15",
  "compatibility_flags": ["nodejs_compat"]
}

Ese mecanismo tiene una implicación que merece pensarse despacio. En la mayoría de las plataformas, la evolución y la estabilidad están en tensión: cada mejora del runtime es un riesgo para quien ya está en producción, así que las decisiones antiguas se arrastran para siempre y el sistema se llena de sedimento. Aquí no: workerd puede corregir un comportamiento heredado sin romper a nadie, porque el código antiguo sigue viendo el mundo antiguo. La lista de compatibility flags es, leída con atención, una arqueología de la plataforma: cada una documenta una decisión que se consideró mejorable y el momento exacto en que se corrigió.

Ese mismo espíritu explica que workerd sea de código abierto y que sea el mismo runtime que ejecuta tu wrangler dev local. La paridad entre desarrollo y producción no es una promesa comercial, es una consecuencia de que sea literalmente el mismo binario, y cuando una duda sobre el comportamiento no la resuelve la documentación, el código fuente está ahí para resolverla.

De ahí se deriva un hábito operativo que conviene adoptar y que cuesta cinco minutos al trimestre: subir la compatibility date de forma deliberada y periódica, no dejarla congelada durante años. Una fecha vieja no te protege, te aísla: acumula diferencias entre tu entorno y el que describe toda la documentación nueva, y llega un día en que actualizarla ya no es un cambio menor sino una auditoría. Subirla poco a poco, leyendo qué flags entran en cada salto y desplegando primero a un entorno de prueba, mantiene ese coste en el terreno de lo trivial.

Señal a vigilar Qué te dice Con qué frecuencia
Compatibility flags nuevas Qué se consideró un error y se corrigió Al subir la fecha
Ejemplos de la documentación Cuál es el camino que absorbe Al empezar algo nuevo
Changelog de la plataforma Qué sale de beta y qué se marca heredado Mensual
Fuente de workerd El comportamiento exacto ante una duda Cuando la duda es real

Cómo seguir aprendiendo cuando ya no hay track

El método que funciona tiene cuatro hábitos y ninguno consiste en esperar el siguiente tutorial.

El primero es construir algo pequeño y completo, no seguir ejemplos. Un proyecto de una tarde que atraviese el sistema entero —un borde que autentica, un dato caliente, una verdad estructurada, una coordinación y un trabajo diferido— enseña más que veinte guías, porque te obliga a tomar las decisiones en el orden real en el que aparecen y a sufrir las consecuencias de las malas. La diferencia entre seguir un ejemplo y construir algo completo es que el ejemplo ya tomó las decisiones por ti y las ocultó; lo que se aprende de verdad no es el código que se escribe, sino las bifurcaciones donde había que elegir.

El segundo es leer el changelog con un criterio, y el criterio es este: ignora lo que anuncia capacidades que no necesitas y presta atención a lo que cambia de estado. Que algo salga de beta significa que ya se puede construir encima; que algo se marque heredado significa que hay un camino que absorbe y conviene identificarlo antes de empezar nada nuevo. Un cambio de estado es información sobre la trayectoria de la plataforma; un anuncio de capacidad es información sobre su catálogo, y el catálogo lo puedes consultar el día que lo necesites.

El tercero es volver a la física cuando la documentación no llegue. Todo lo que aprendas después seguirá siendo una respuesta a las mismas preguntas: dónde está el cómputo respecto al estado, cuántos viajes hay entre ellos, qué garantía necesita este hecho, cuál es la unidad de aislamiento y qué límite protege qué propiedad. Un producto que no sepas encajar en ese marco probablemente no lo necesitas todavía.

Ese marco tiene además una propiedad útil como filtro de lectura: convierte cualquier anuncio en una pregunta corta. Ante una capacidad nueva, en lugar de estudiarla, pregúntate qué posición ocupa —si acerca el cómputo, si replica el dato, si elimina un viaje, si colapsa la distancia o si abre una salida— y qué le cuesta a cambio. Casi siempre la respuesta cabe en dos frases, y con esas dos frases ya sabes si te concierne. Estudiarla en profundidad es el paso siguiente, y solo se justifica cuando la respuesta fue que sí.

El cuarto es desconfiar de tu propia fluidez. El riesgo de quien termina un track como este no es olvidar, es lo contrario: aplicar con soltura el patrón que aprendió a un problema que pedía otro. La señal de alarma es notar que la decisión sale sin esfuerzo. Las decisiones fáciles son las que no se examinan, y son exactamente las que se pagan tres años después.

Hay una versión negativa de este método que también conviene tener presente, porque el tiempo de atención es finito y gastarlo mal cuesta tanto como no gastarlo. No merece la pena perseguir cada anuncio, ni reescribir código que funciona para estrenar una capacidad, ni adoptar nada que esté en fase temprana para algo que sostiene ingresos. Tampoco merece la pena aprender un producto entero antes de tener un problema que lo pida: el conocimiento adquirido sin un problema concreto se evapora en semanas y además genera la ilusión de saber, que es peor que no saber porque no se corrige sola.

Un último apunte sobre cómo se estudia esta plataforma en concreto, y que la distingue de otras: casi todas las respuestas difíciles están en un solo sitio, que es el manifiesto. Cuando algo no se comporta como esperas, la causa suele estar en la fecha de compatibilidad, en un binding mal declarado, en un límite configurado o en un modo de colocación que alguien activó. Mirar ahí antes que en el código ahorra una cantidad desproporcionada de tiempo, porque ese fichero es la única declaración completa de en qué mundo se ejecuta tu Worker.

🧲

Un primitivo que absorbe

Worker más bindings. Assets, contenedores, workflows y agentes se declaran y gobiernan desde ahí, y el número de conceptos baja en vez de subir.

🧠

Estado, no solo inferencia

Un agente es una entidad con identidad, memoria y un hilo. El primitivo que eso requiere ya existía aquí antes de que hiciera falta.

🔱

La física no caduca

Los nombres cambian y los límites suben. La distancia entre cómputo y estado, el número de viajes y la garantía que exige cada hecho, no.

Lo que has aprendido no es una plataforma, es una forma de repartir el trabajo entre el espacio y el tiempo

Si dentro de tres años Cloudflare hubiera renombrado la mitad de sus productos, subido todos los límites y añadido diez capacidades que hoy no existen, casi nada de lo que importa en este track habría caducado, y conviene entender por qué. Lo que has estado aprendiendo, bajo los nombres comerciales, es un conjunto de preguntas sobre cómo se reparte el trabajo entre el espacio y el tiempo, y esas preguntas no pertenecen a ningún proveedor. En el eje del espacio: dónde ocurre el cómputo respecto a dónde vive el estado, cuántas veces hay que recorrer esa distancia, y si conviene mover el cómputo, replicar el estado o eliminar el viaje. En el eje del tiempo: qué tiene que ocurrir antes de responder y qué puede ocurrir después, qué debe sobrevivir a un fallo y qué puede repetirse sin daño, y qué operaciones necesitan un orden y cuáles toleran ir unos segundos por detrás. Cada producto que has estudiado es una respuesta cristalizada a una combinación concreta de esas preguntas, y por eso el catálogo es memorizable pero no interesante: lo interesante es la pregunta que cada uno contesta. Quien se lleve eso podrá leer la documentación de una capacidad que aún no existe y situarla en el mapa en dos minutos, porque solo hay un número finito de posiciones posibles y ya las conoce todas. Quien se lleve la lista de productos tendrá que volver a empezar con cada anuncio. Hay una última cosa que decir, y es sobre la actitud más que sobre la técnica. La tentación al final de un recorrido largo es sentir que ya se sabe, y esa sensación es precisamente el riesgo, porque las arquitecturas malas casi nunca las construye quien duda: las construye quien aplica con fluidez un patrón excelente a un problema que pedía otro. El antídoto es incómodo y barato: cada vez que una decisión de arquitectura te salga sin esfuerzo, párate y nombra en voz alta qué hecho estás colocando, qué garantía necesita, cuántos viajes cuesta y cuál es la unidad de aislamiento. Si las cuatro respuestas salen, la fluidez estaba justificada. Si alguna se resiste, acabas de encontrar la parte del sistema que dentro de dos años iba a doler, y la has encontrado el único día en que arreglarla era gratis.

⚔️ Construye tu propia continuación
  1. Diseña un proyecto de una tarde que atraviese borde, dato caliente, verdad estructurada, coordinación y trabajo diferido, y nómbralas antes de escribir código.
  2. Sube la compatibility date de un Worker existente y explica qué comportamiento concreto cambia y por qué se consideró mejorable.
  3. Busca en la documentación dos formas de resolver lo mismo y argumenta cuál está absorbiendo a la otra con evidencia, no con intuición.
  4. Toma una capacidad de IA con estado y decide honestamente si tu sistema la necesita o si solo la quieres.
  5. Escoge la decisión de arquitectura que más fácil te resulte hoy y sométela a las cuatro preguntas: qué hecho, qué garantía, cuántos viajes, qué unidad de aislamiento.