19 may 2026

Angular 22: Para Alucinaciones con @boundary, Tipos y MCP

angularangular22googleio2026signalsmcpskillsagentsiatypescript

Angular 22 cierra el bucle de alucinación con @boundary nativo, tipos exhaustivos y builds verificados por MCP. Todo lo de Google I/O 2026.

Angular 22: Tuberías agnósticas y arquitecturas de plantillas resilientes

Los agentes de IA escriben código roto. Lo afirman como funcional, tú confías en ellos, y terminas depurando a las 2am. Angular 22 está construido para cerrar ese bucle.

En Google I/O 2026, el equipo de Angular reveló algo más grande que un lanzamiento de features. Avanzando hacia 22 (semana del 1 de junio de 2026), Angular consolida Signal Forms y Resource APIs a estable — mientras diseña activamente el framework como ciudadano de primera clase en entornos de desarrollo agnóstico. El objetivo: que sea estructuralmente imposible que los agentes envíen código roto en silencio.

Aquí está el análisis arquitectónico — qué cambió, qué significa y por qué importa para tu stack.

La tubería agnóstica: Angular MCP + Skills

El bucle de codificación LLM estándar es notoriamente frágil. El agente escribe código, dice que funciona, y tú descubres los errores de compilación en tiempo de ejecución. ¿Te suena familiar?

Angular ataca esta fricción directamente emparejando dos sistemas críticos: el servidor MCP de la CLI de Angular — que permite a los asistentes de IA interactuar con la CLI para generar código, modernizar, buscar ejemplos y ejecutar compilaciones — y el framework Angular Skills, una capa de conocimiento especializada que enseña a los agentes a escribir código moderno alineado con 22.

Piénsalo así: el MCP es la capacidad del agente de actuar — ejecutar el linter, disparar una compilación, iniciar el dev server. Las Skills son el conocimiento del agente de cómo actuar bien — componentes signal-first, OnPush por defecto, patrones correctos de validación de formularios. Necesitas los dos.

Cómo funciona: la pila MCP Server + Skills

Configura el servidor MCP de Angular en tu IDE o entorno de agente:

{ "mcpServers": { "angular-cli": { "command": "npx", "args": ["-y", "@angular/cli", "mcp"] } } }

La skill angular-developer se activa al crear proyectos, componentes o servicios, e inyecta patrones modernos automáticamente:

  • Reactividad signal-first: input() y output() en lugar de @Input() y @Output()
  • OnPush por defecto: Change detection correcta desde el inicio
  • Componentes standalone: Sin boilerplate de NgModule
  • Formularios type-safe: Signal Forms para manejo reactivo y tipado

Ejemplo del mundo real: los agentes pueden implementar chat de flota impulsado por IA actualizando FleetService con un método queryFleet(prompt), usando la skill gemini-sdk para enviar el estado actual units() a Gemini y filtrar datos basados en la entrada del usuario. La skill maneja el patrón; el agente maneja el cableado.

Cerrando el bucle de alucinación: MCP + Chrome DevTools para Agentes

Aquí es donde se pone interesante. Encadena Angular MCP con Chrome DevTools para Agentes — una instancia de navegador completamente administrada que permite a los agentes navegar tu aplicación en ejecución, interactuar con ella y tomar capturas de pantalla para verificar qué se renderiza realmente.

El flujo de trabajo se vuelve determinista:

  1. El agente escribe código usando la skill angular-developer
  2. MCP dispara dev_server.wait_for_build — se bloquea hasta que la compilación tenga éxito o falle
  3. El agente inicia el dev server con dev_server.start
  4. Chrome DevTools toma una captura de pantalla para verificar visualmente los cambios del DOM
  5. El agente lee la salida renderizada y corrige errores si es necesario

Sin más “asumiré que funcionó.” El agente tiene ojos en tu aplicación en ejecución. Ese es el bucle completamente cerrado.

Resiliencia de plantillas con @boundary

En ingeniería de UI compleja — mezclar layouts DOM con WebGL pesado, loops de animación personalizados o widgets de terceros — un único fallo de componente puede crashear todo el ciclo de detección de cambios. Pantalla en blanco. Fallo total. El usuario no ve nada.

Angular 22 introduce @boundary (llegando a Developer Preview en Q3 2026) para resolver exactamente esto.

@boundary es un límite de error nativo integrado directamente en la compilación de plantillas de Angular. Si un widget aislado lanza un error fatal, @boundary lo atrapa — el crash no sube, y el resto de tu app sigue funcionando.

Aislamiento de errores y patrones de fallback

@boundary { <heavy-webgl-scene-renderer /> } @catch (error) { <div class="error-fallback"> <h3>Escena no disponible</h3> <p>{{ error.message }}</p> <button (click)="retryBoundary()">Recargar escena</button> </div> }

A diferencia de try-catch en lógica de componentes, @boundary opera a nivel de compilación de plantillas. Conoce el árbol de componentes y puede aislar errores sin deshacer todo el ciclo de detección de cambios. Esa distinción importa — no estás parcheando fallos después, los estás conteniendo antes de que se propaguen.

Lógica de reintento sin recarga de estado

La arquitectura habilita reintento intencional:

export class DashboardComponent { @signal() sceneError: Error | null = null; retryBoundary() { // Re-renderiza el boundary, re-ejecuta el componente, // pero preserva el estado de la aplicación externa this.sceneError = null; } }

En Angular tradicional, un error crítico en un componente fuerza una recarga de página completa. Con @boundary, el dashboard de flota puede crashear mientras el usuario sigue viendo la cola de servicio y la lista de vehículos. La contención de errores se convierte en una preocupación arquitectónica de primera clase, no en un parche de último momento.

Límites multinivel para control granular

Anida bloques @boundary para manejo de errores en capas que refleja dominios de fallo reales:

@boundary { <telemetry-dashboard> @boundary { <ai-predictive-diagnostics /> } @catch { <p>Diagnósticos no disponibles</p> } </telemetry-dashboard> } @catch { <p>Dashboard desconectado</p> }

El boundary interno atrapa errores del componente de diagnósticos. El boundary externo atrapa todo el dashboard. Dos dominios de fallo distintos, dos caminos de recuperación distintos.

Análisis profundo: mecánicas avanzadas de control de flujo en @switch

La evolución del control de flujo de Angular no es solo estética más limpia — se trata de mover responsabilidades de tiempo de ejecución a garantías de tiempo de compilación. Las actualizaciones al bloque @switch atacan dos puntos de dolor clásicos.

1. Coincidencia múltiple de casos (reducción de boilerplate)

Si varios estados compartían representación de UI idéntica, antes tenías que duplicar bloques de plantilla. Ya no:

@switch (orderStatus()) { @case ('pending', 'processing') { <p>Tu pedido se está preparando.</p> } @case ('shipped') { <p>Tu pedido está en camino.</p> } @case ('delivered') { <p>Pedido completado.</p> } }

El compilador de plantillas agrupa estas ramas eficientemente sin generar view nodes redundantes. Un caso, múltiples estados manejados. Especialmente poderoso con enums de estado isomórfico donde la representación que enfrenta al usuario es idéntica en varios estados backend.

2. Exhaustive checking mediante el tipo never

Este es el crítico. Cuando tratas con tipos de unión estrictos de TypeScript, un bug de producción clásico: el equipo backend añade un nuevo estado, la plantilla frontend nunca se actualiza, la UI falla silenciosamente. Con exhaustive checking, la compilación falla en su lugar.

// TypeScript del componente export type OrderStatus = 'pending' | 'processing' | 'shipped' | 'delivered'; export class OrderComponent { orderStatus = signal<OrderStatus>('pending'); // TypeScript no compilará sin todos los casos manejados private assertNever(value: never): never { throw new Error(`Estado no manejado: ${value}`); } }
<!-- Plantilla con garantía exhaustiva --> @switch (orderStatus()) { @case ('pending') { <p>Esperando ser procesado.</p> } @case ('processing') { <p>Tu pedido se está preparando.</p> } @case ('shipped') { <p>Tu pedido está en camino.</p> } @case ('delivered') { <p>Pedido completado.</p> } @default { {{ assertNever(orderStatus() as never) }} } }

Un ingeniero backend añade 'returned' sin notificar al frontend — la compilación de TypeScript falla inmediatamente. Esto desplaza la carga de type safety de las pruebas en tiempo de ejecución al proceso de compilación del desarrollo. Exactamente donde pertenece.

¡Uf! Esa red de seguridad es poderosa.

Funciones de plantilla inline: reduciendo boilerplate de clase

En 22 puedes inlinear funciones arrow cortas directamente en bindings de eventos de plantilla sin inflar tu clase TypeScript. Es más que cosmético — es una declaración sobre dónde pertenece la lógica.

El patrón: manejadores de eventos y transformaciones

En lugar de exponer cada manejador transitorio como método de clase:

// Antes: contamina la API del componente export class CartComponent { items = signal([...]); onAddItem(id: string) { this.items.update(items => [...items, { id }]); } onRemoveItem(id: string) { this.items.update(items => items.filter(i => i.id !== id)); } }

Ahora puedes inlinearlos directamente:

<!-- v22: funciones arrow inline en plantillas --> <button (click)="items.update(items => [...items, newItem()])">Añadir</button> <button (click)="items.update(items => items.filter(i => i.id !== id))">Eliminar</button>

La superficie del componente se encoge. Solo la verdadera API pública permanece visible. Los manejadores transitorios se quedan en la plantilla, donde lógicamente pertenecen.

Errores de plantilla e inferencia de tipos

El compilador de plantillas ahora atrapa desajustes de tipos en expresiones inline inmediatamente:

<!-- Error de TypeScript: items.update espera una función updater --> <button (click)="items.update('invalid')">Incorrecto</button> <!-- ✓ Correcto: type checking completo en el parámetro de la función arrow inline --> <button (click)="items.update(items => items.slice(0, items.length - 1))"> Eliminar último </button>

Esto es crítico para desarrollo asistido por agentes. Cuando la skill angular-developer escribe código de plantilla, el compilador atrapa alucinaciones antes de que lleguen a producción. No en tiempo de ejecución — en tiempo de compilación.

Ejemplo del mundo real: transformaciones de campo de formulario

Del codelab logistics-manager-app — cuando un usuario describe un problema como “El vehículo emite humo y el motor se ha detenido,” la IA debe establecer automáticamente la prioridad a CRITICAL añadiendo un listener al campo de issue en serviceForm.

Con funciones de plantilla inline, esto es compacto y transparente:

<input (blur)="priorityField.setValue( analyzePriority(issueField.value) )" placeholder="Describe el problema..." />

El manejador se queda cerca de su disparador. La intención permanece visible.

Refinamientos de reactividad adicionales

Más allá de agentes, límites de error y control de flujo, Angular 22 afina la experiencia de desarrollo más amplia con varias actualizaciones que empujan en la misma dirección: menos estado global, más reactividad granular.

Signal Forms: reactividad granular para formularios complejos

Saliendo de Developer Preview en 22, Signal Forms combina la tipación estricta de formularios reactivos con la reactividad granular de Signals. Un formulario con 50 campos ahora actualiza solo el campo que cambió — no el árbol de formulario completo.

export class ServiceTicketForm { form = new FormGroup({ issueDescription: new FormControl(''), priority: new FormControl('LOW'), assignedTechnician: new FormControl(''), }); // Acceso basado en signal con rastreo granular priority$ = this.form.get('priority')!.valueAsSignal; // Solo la pantalla de prioridad se re-renderiza cuando priority cambia priorityStyles = computed(() => { const level = this.priority$(); return level === 'CRITICAL' ? 'bg-red' : 'bg-yellow'; }); }

Angular Aria: primitivos de UI accesibles

Junto con Signal Forms, Angular Aria — el conjunto de directivas de UI headless completamente accesible — también alcanza estable. Dropdowns personalizados, modales y popovers construidos con Angular Aria incluyen automáticamente:

  • Navegación por teclado (arrow keys, enter, escape)
  • Roles ARIA y regiones activas
  • Gestión de focus
  • Anuncios para screen reader

Sin alucinaciones de agentes sobre accesibilidad. Está integrado. ¿Alucinante, no?

Vitest como predeterminado

La CLI de Angular ahora crea todos los proyectos nuevos con Vitest como test runner predeterminado, reemplazando Karma. Las pruebas se ejecutan en milisegundos en lugar de segundos — el bucle de feedback del agente se vuelve casi instantáneo. Eso es mucho tiempo ahorrado por iteración.

OnPush como change detection predeterminado

Los nuevos componentes usan ChangeDetectionStrategy.OnPush por defecto, alentando reactividad basada en signals en lugar de cambios disparados por Zone.js desde el inicio del proyecto. Esto entrena tanto a desarrolladores como a agentes a pensar en términos de cambios de estado granulares y rastreables — no en detección de cambios global.

Angular Skills: enseñando a agentes patrones modernos

Las Angular Skills son capas de conocimiento especializadas que ayudan a los agentes a escribir código alineado con 22 desde la primera línea. Dos skills clave se incluyen con Angular 22:

angular-developer: Genera código para componentes, servicios, gestión de estado, formularios, routing, SSR y más. Siempre referencia la versión correcta de Angular antes de proporcionar orientación — para que los agentes no usen patrones de Angular 15 en un proyecto Angular 22.

angular-new-app: Crea una nueva app de Angular usando la CLI, con flags como --ai-config=[agents, claude, copilot, cursor, gemini, jetbrains, none, windsurf] para afinar el código generado para las convenciones de cada agente específico.

Una cosa a tener en cuenta: Skills y herramientas MCP son complementarias, no intercambiables. Un servidor MCP por dominio — no cargues todo a la vez. Versionea tus skills como código — una skill para patrones de Angular 19 te lastimará en Angular 22. Y mide tu presupuesto de contexto — si más del 30% de tu ventana de contexto está en definiciones de herramientas, tienes un problema de configuración. Desarrollé esto en profundidad en MCP Skills vs MCP Tools: La forma correcta de configurar MCP Server.

El lanzamiento de consolidación

Angular 22 ya no solo está alcanzando en el espacio de reactividad. Al integrar nativamente MCP y Angular Skills, endurecer los límites de error de plantillas con @boundary, automatizar exhaustive type checking en el control de flujo y habilitar funciones de plantilla inline — está definiendo activamente cómo se ve una arquitectura frontend moderna y lista para agentes.

Angular 22 es la era signal-first hecha concreta. El esfuerzo de modernización de varios años converge en un modelo de desarrollo coherente, listo para producción, nativo para agentes donde:

  • Los agentes escriben plantillas type-safe que compilan o fallan, nunca silenciosamente.
  • Los límites de error aíslan fallos en lugar de crashear toda la aplicación.
  • El control de flujo es exhaustivo por defecto, no una sorpresa en tiempo de ejecución.
  • Los servidores MCP cierran el bucle de alucinación con visibilidad real del navegador.
  • Las skills enseñan a agentes patrones modernos adaptados a tu versión y convenciones.

¿El problema de depurar a las 2am? Ese es el bucle de alucinación. Angular 22 lo cierra.


Referencias:

Anteriormente escribí sobre Angular MCP y el fin de las migraciones manuales — un buen punto de partida si eres nuevo en la configuración del servidor MCP de Angular.