Método · Cómo construimos sistemas

Demostramos que el código funciona.

La mayoría de las agencias esperan que su código funcione. Nosotros ejecutamos verificación matemática, detección de drift entre spec y código, y 8+ pruebas destructivas por función — antes de que una sola línea llegue a producción. Por eso nuestros sistemas no entran en pánico a las tres de la madrugada.

Pipeline · Spec → Allium → Plan → Impl → Playwright → TLA+
Verificación
TLA+ formal · drift de Allium · Playwright destructivo
Stack
.NET · ASP.NET Core · React · Blazor · TypeScript · SQL Server · Postgres · SQLite · Docker Swarm · Azure · Semantic Kernel
Cobertura
1:1 funcional + 8 destructivas por superficie
IA aumentado
Claude Code · registro de specs · auto-hooks
En producción
6 sistemas en vivo en live4.se · todos con demo abierta

"Trabajamos en ágil" es lo más vacío que se puede decir sobre desarrollo de software en 2026. Todo el mundo lo dice. Nadie puede mostrar qué significa. No es un proceso — es una placa para colgar en la pared después del stand-up diario.

Nuestro método se puede auditar. Deja artefactos — archivos de spec, informes de Allium, modelos TLA+, informes de Playwright — que se pueden leer y rebatir. Atrapa race conditions antes de que lleguen a producción, drift entre especificación e implementación antes de que alguien se pregunte por qué el código y la documentación ya no coinciden, y transiciones de estado ilógicas antes de que un usuario final las encuentre por nosotros.

El pipeline no es un secreto. Se ejecuta en cada cambio no trivial de cada sistema que operamos. Abajo está lo que hace cada fase, por qué existe, y qué significa en la práctica.

No construimos más funciones de las que el cliente necesita. Lo que se construye tiene lógica demostrable detrás.

El pipeline en seis fases.

Cada fase produce artefactos que pueden leer las personas y verificar las máquinas. Sin saltos de fase, sin atajos. Las fases se ejecutan en orden en cada cambio no trivial — ya sea un campo nuevo en un formulario o un modelo de dominio nuevo.

Fase 01

Especificación.

Escribimos qué debe hacer el sistema antes de escribir cómo. Un archivo de spec por funcionalidad, revisado antes de escribir una línea de código. Más una ronda de clarificación que atrapa huecos que aparecerían en producción.

/specify · /clarify
Fase 02

Spec formal (Allium).

La spec se formaliza en Allium — un lenguaje de interrogación de especificaciones. Inconsistencias y ambigüedades emergen como preguntas abiertas antes de la implementación. Después se compara la spec con el código para detectar drift.

/allium:elicit
Fase 03

Plan + tareas.

La spec se descompone en un plan y una lista de tareas ordenada por dependencias. Luego corre una fase de análisis que auto-aplica todas las remediaciones recomendadas. La implementación empieza contra un plano totalmente instrumentado, no contra un revoltijo de ideas.

/plan · /tasks · /speckit.analyze
Fase 04

Implementación.

El código se escribe contra el plan — no en sentido abstracto, sino tarea por tarea. Backend-first como principio, no como eslogan: toda la autorización, auditoría, soft-delete e idempotencia se imponen del lado del servidor. El frontend es una capa de vista delgada.

.NET · React · EF Core · SSE
Fase 05

Pruebas de navegador.

Cobertura funcional 1:1 — doce funciones producen doce pruebas. Más ocho pruebas destructivas por superficie: XSS, inyección SQL, bypass de auth, race conditions, entrada inválida, valores límite. Todas en Playwright. Sin "happy path".

Playwright · Funcional + destructivo
Fase 06

Verificación formal (TLA+).

Las máquinas de estado se modelan en TLA+ y los invariantes se demuestran matemáticamente. El verificador de modelos TLC encuentra race conditions, deadlocks y estados que nadie pensó. Lo que sale de esa fase no es una prueba que "pasó" — es una demostración.

TLA+ · TLC · Invariantes

Lo que hacen la mayoría. Lo que hacemos nosotros.

Una comparación honesta con lo que encontramos cuando heredamos un sistema construido por otros. No es un ataque — es solo una calibración de lo que "listo para producción" significa de verdad.

Pruebas

Clic manual antes del release.

Agencia típica. Alguien hace clic por el sistema, ve que nada explota y pulsa deploy. Los casos límite los descubre el cliente.

Manual · Pensamiento mágico
Pruebas

1:1 funcional + 8 destructivas.

Nosotros. Cada función implementada tiene al menos una prueba de Playwright. Más ocho pruebas destructivas por superficie que intentan romper el sistema de las seis maneras más comunes en que se puede romper.

Playwright · Auditable
Spec

La spec vive en un documento de Confluence.

Agencia típica. La spec se escribe una vez, después se aleja del código. Seis meses después nadie sabe responder a "¿por qué funciona así?".

Drift · Olvido
Spec

Drift de Allium entre spec y código.

Nosotros. Spec y código se comparan automáticamente. El drift emerge como preguntas abiertas, no como suposiciones. La spec es código fuente — versionada, revisada, siempre en sincronía.

Allium · Detección de drift
Estado

Race conditions detectadas en producción.

Agencia típica. Una máquina de estados se boceta en la pizarra, luego se programa sobre la marcha. Las race conditions las atrapa un usuario desafortunado un jueves por la tarde.

Pizarra · Esperanza
Estado

TLA+ demuestra invariantes.

Nosotros. Las máquinas de estado se modelan formalmente, los invariantes se demuestran. TLC encuentra el cúmulo de estados que la lógica no maneja — antes de que se convierta en un incidente de producción.

TLA+ · Demostrable

El stack — lo que elegimos y por qué.

Pocas decisiones técnicas, tomadas una vez, profundizadas durante diez años. No cambiamos de stack cada sprint. Cambiamos cuando hay una razón real — y la justificamos por escrito.

Backend

.NET · ASP.NET Core.

Un runtime maduro, rápido y gratuito con un sistema de tipos fuerte. EF Core con SaveChanges interceptors que capturan el audit-trail de forma centralizada — ningún código se escapa. Escribimos .NET desde la versión 1.1.

.NET · EF Core · ASP.NET
Frontend

React · Blazor donde encaja.

React por defecto para frontends nuevos — server components, suspense, streaming nativo. Blazor WASM para PWA donde C# end-to-end vale la pena. Nunca religión SPA: elegimos según el sistema.

React · Blazor WASM · TypeScript
Base de datos

SQLite. También en producción.

SQLite sobre NFS aloja varios proyectos sin la ceremonia del tenant_id. Las copias de seguridad son archivos para comprimir. Sin costes operativos por un servidor de base separado. Cambiamos a PostgreSQL el día que la carga lo exija — pocas veces antes.

SQLite · WAL · NFS
IA

LLM autoalojado con fail-open.

Un modelo local dentro del clúster Docker Swarm. Si la IA está caída, el sistema sigue funcionando sin bloqueos — la autocategorización pasa a manual, nada se rompe. Amigable con el RGPD porque los datos no salen del clúster.

LLM local · Semantic Kernel · RAG
Operación

Docker Swarm en Azure.

Somos dueños de toda la cadena: arquitectura, base de datos, frontend, operación. Nuestro propio clúster Swarm en live4.se. Sin servicios gestionados con precios opacos. Sabes exactamente qué se ejecuta y dónde.

Docker Swarm · Azure · live4.se
Herramientas

Claude Code · registro de specs.

Desarrollo aumentado con IA con hooks deterministas. Un registro de specs como fuente de verdad para lo siguiente que se construye. Hooks de pipeline que bloquean el trabajo sin spec. La IA sigue un método que escribimos, revisamos y versionamos.

Claude Code · Hooks · Subagents

La amplitud completa.

Elegimos pocas tecnologías por sistema — pero la lista de lo que realmente dominamos es más larga. 25+ años de entregas dan una base amplia para apoyarse cuando el problema no encaja con la solución estándar.

Backend

El ecosistema .NET.

.NET 6–10 · C# · ASP.NET Core · .NET Aspire · EF Core · Dapper · MediatR · Quartz.NET · SignalR · gRPC · GraphQL · REST · Clean Architecture · CQRS · DDD · SaaS multi-tenant · microservicios · Node.js

Frontend

Web y móvil.

TypeScript · JavaScript · React · React Native · Expo · Next.js · Vue · Svelte · Blazor WASM · Blazor Server · HTMX · Tailwind · Bootstrap · jQuery · HTML · CSS · WordPress · Android (Java) · iOS (Obj-C)

Bases de datos

Relacional, documento, búsqueda.

SQL Server · T-SQL · PostgreSQL · pgvector · pg_trgm · MySQL · MongoDB · Redis · SQLite · Elasticsearch · optimización de índices · estrategias de backup · execution plans · migraciones de schema

IA & verificación formal

Agentes, RAG, lógica demostrable.

Semantic Kernel · Microsoft Agent Framework · Azure OpenAI · Ollama · LLMs locales · Claude Code · Cursor · GitHub Copilot · RAG · embeddings · búsqueda híbrida (pgvector + pg_trgm) · TLA+ · Allium · desarrollo spec-driven · custom skills

Cloud (Azure)

Servicios que usamos.

App Service · Functions · Container Apps · Service Bus · Event Grid · SQL · Storage · Key Vault · API Management · Entra ID · Monitor · App Insights

Contenedores & infra

Operación, virt, red.

Docker · Docker Swarm · Docker Compose · Kubernetes · Linux (Ubuntu/Debian) · Windows Server · Active Directory · DNS · IIS · Nginx · virtualización · GPU-farm

CI/CD & pruebas

Pipelines y puertas de calidad.

Azure DevOps · GitHub Actions · BitBucket · Bicep (IaC) · xUnit · NUnit · Playwright · Testcontainers · pruebas de estrés con k6 · revisión de código · pull requests · Git/GitHub

Seguridad & identidad

Auth, RGPD, accesibilidad.

OAuth2 · OpenID Connect · JWT · WebAuthn · Passkeys · RGPD · Zero Trust · audit-trail · soft-delete · idempotency-keys · WCAG 2.1 AA

Integraciones & datos

Pago, comunicación, gobernanza de datos.

Stripe · Swish · Twilio · Mailjet · Google APIs · Fortnox · SCORM · OpenTelemetry · Prometheus · Grafana · gobernanza de datos · catálogo de datos · gestión de metadatos · modelado conceptual · calidad de datos

La versión larga.

Para quien quiera la profundidad técnica — aquí está lo que cada fase produce realmente, por qué existe y cómo se conecta con la siguiente. En general: el pipeline es una cadena de artefactos donde cada fase toma como entrada un documento de la fase anterior y produce un nuevo documento que la siguiente fase puede leer. Sin entregas verbales. Sin "creo que hablamos de eso en el stand-up del miércoles".

Allium — el drift como dato.

Allium es un lenguaje de interrogación: escribís una especificación, luego se ejecuta una pasada de elicitación que encuentra huecos, ambigüedades e inconsistencias. Produce preguntas abiertas que hay que responder antes de avanzar. Más tarde se ejecuta una pasada de destilación que compara el código terminado con la spec — el drift aparece en tres categorías: especificado-pero-no-implementado, implementado-pero-no-especificado y drift de comportamiento. Cada elemento recibe una decisión individual: corregir ahora, defer (rastrear en spec) o dismiss con razón. Sin decisiones grupales de "lo vemos después" — cada hallazgo tiene un responsable y una fecha.

TLA+ — demostraciones, no pruebas.

Una prueba que pasa muestra que una ejecución funcionó. No dice nada sobre las ejecuciones que no probaste. TLA+ modela el sistema como un espacio de estados y hace un recorrido exhaustivo — el verificador de modelos TLC prueba cada secuencia posible de eventos y encuentra los estados donde los invariantes se rompen. Para gestión de casos: ¿puede un caso estar a la vez cerrado y en curso? Para SSE: ¿qué pasa si el cliente reconecta a la mitad de una actualización? Para idempotencia: ¿qué pasa si la misma idempotency-key llega en dos requests simultáneos? TLC responde matemáticamente, no por probabilidad.

Pruebas destructivas — seis categorías.

Las pruebas funcionales verifican que el camino feliz funcione. Las pruebas destructivas verifican que el sistema no se caiga cuando alguien intenta romperlo. Ejecutamos al menos ocho escenarios destructivos por superficie, repartidos en seis categorías.

La validación de entrada bombardea los campos con cadenas demasiado largas, caracteres inválidos, nulls y valores vacíos. La autorización intenta leer y escribir recursos que el usuario no posee. La categoría de inyección mete XSS en campos de texto e inyección SQL en parámetros de búsqueda. Las race conditions fuerzan a dos clientes a cambiar el mismo recurso en el mismo segundo. Los valores límite ponen a prueba longitudes máximas, conteos máximos y la paginación en la última página. La corrupción de estado envía cambios en orden incorrecto o contra recursos ya eliminados.

Nada de esto es teórico. Cada categoría ha atrapado bugs reales en sistemas en producción que construimos — antes de que salieran.

Desarrollo aumentado con IA — sin religión de IA.

Claude Code se usa como herramienta, no como reemplazo. El pipeline de arriba no es generado por IA — está documentado, versionado e impuesto vía hooks deterministas. Los hooks bloquean el trabajo de feature sin spec, exigen clarificación antes del plan, ejecutan la elicitación de Allium antes de la implementación y se niegan a liberar una feature sin validación de Playwright y TLA+. La IA sigue el método — no lo inventa. El resultado: velocidad de IA con revisión humana en las decisiones de arquitectura.

Este método tarda más en la primera semana. Ahorra meses cuando el sistema tiene un año.

No somos la opción correcta para todo.

Volvemos con una valoración del encaje — y si no somos los que necesitáis, lo decimos directamente.

Escríbenos unas líneas sobre lo que intentáis construir.

Escríbenos