Ingeniero Backend Senior — CULTIVA IA

Backend Architecture Decision
AgenteFlow SaaS

Análisis arquitectónico completo con decisión de stack, anti-patrones y SLO verificable para un SaaS B2B de automatización IA.

Kill criteria: OK (0 disparados) Fit score: 100% node-express 2026-06-12
📋
Inputs — Asunciones verificadas (Karpathy #1) 7 forcing-questions respondidas
Equipo Backend
6 ingenieros
QPS p99 (año 1)
120 req/seg
Ratio lectura/escritura
15 : 1
Modelo de tenancy
shared-multi-tenant
Sensibilidad de datos
PII
Patrón arquitectónico
modular-monolith
Lenguaje preferido
TypeScript
Platform team
No disponible
Panel de administración
No requerido
🛡
Kill Criteria Check 0 de 4 criterios disparados
Ningún criterio de parada activado. Los inputs son coherentes y el diseño puede avanzar. El motor no auto-aprueba — revisa los approvers antes de producción.
Equipo ≥ 6 → modular monolith es el patrón correcto (Newman MonolithFirst)
120 QPS p99 → modular monolith aguanta hasta ~5000 QPS antes de forzar microservicios
Datos PII con equipo ≥ 4 → umbral de compliance cubierto (no PHI/PCI, no escalado obligatorio)
QPS plausible para equipo de 6 → forecast validado
🏆
Comparación de Perfiles 4 perfiles evaluados
Empate técnico (100% vs 100%): node-express y fastapi-python coinciden en todos los constraints estructurales. El desempate es el lenguaje preferido del equipo: TypeScript → node-express gana.
Recomendado
node-express
Node.js + TypeScript strict + Fastify/Express + Drizzle/Prisma + Postgres. Equipo TS, < 15 eng, SaaS customer-facing. Ecosistema JS unificado, async nativo, Zod para validación.
Fit Score 100%
team_size 1–15 ✓
tenancy shared-multi-tenant ✓
data_sensitivity ≤ pii ✓
pattern modular-monolith ✓
stack-language TypeScript ✓
Runner-up
fastapi-python
FastAPI + SQLAlchemy 2 async + Postgres. Team 1-20, SaaS o ML-adjacent. Fuerte historia async, ideal si el equipo ya conoce Python o integra modelos ML.
Fit Score 100%
team_size 1–20 ✓
tenancy shared-multi-tenant ✓
data_sensitivity ≤ pii ✓
pattern modular-monolith ✓
stack-language no coincide (Python, no TS)
django-monolith
Content-heavy + admin, equipo 2-25.
Fit Score 89%
admin_panel_needed requerido pero no aplica
go-or-rust-microservice
Servicio extraído, equipo ≥ 30, QPS ≥ 1000.
Fit Score 26%
team_size < 30
QPS < 1000
platform_team = false
🧱
Stack Recomendado — node-express TypeScript strict · Node 22 LTS · PostgreSQL 16+
Core
Runtimenode-22-lts
Lenguajetypescript-strict
Frameworkfastify-v5 / express-v5
Validaciónzod
Base de Datos
BD principalpostgresql-16+
ORMdrizzle / prisma
Cacheredis (solo si justificado)
Queuepg-boss / pgmq
Auth & Seguridad
Authlucia-auth / authjs-v5
Rate limitingexpress-rate-limit
Headershelmet
JWTRS256 · 1h expiry
Observabilidad & Tests
Tracingopentelemetry + honeycomb
Testsvitest + supertest
BD testtestcontainers-postgres
Coverage≥ 70%
backend_decision_engine.py — AgenteFlow invocation
# Comando ejecutado para obtener esta decisión:
python3 scripts/backend_decision_engine.py \
  --team-size 6 \
  --qps-p99 120 \
  --read-write-ratio 15 \
  --tenancy shared-multi-tenant \
  --data-sensitivity pii \
  --pattern modular-monolith \
  --language-preference typescript

# Resultado: node-express 100% | fastapi-python 100% (runner-up)
# Kill criteria tripped: 0
🚫
Anti-patrones — NO introducir en node-express 7 reglas
KILL
mongoose Postgres + Drizzle/Prisma siempre gana para workloads relacionales.
KILL
callback-style async/await en toda la base de código. Sin callbacks.
KILL
no-validation Cada request body validado con Zod. Sin excepciones.
KILL
express sin helmet + cors Security defaults obligatorios desde el primer commit.
KILL
kafka a este escala Postgres LISTEN/NOTIFY o pg-boss maneja bien hasta 120 QPS de background jobs.
KILL
microservices Modular monolith con boundaries claros. Equipo de 6 no puede operar microservicios sin platform team.
KILL
session cookies sin CSRF CSRF tokens o SameSite=Lax. Obligatorio con datos PII.
WARN
JWT hardcodeado Secretos SIEMPRE en variables de entorno. El legacy de AgenteFlow tiene este problema — primer refactor.
📊
SLO Floor Verificable — Karpathy #4 Targets mínimos medibles antes de lock
Latencia p50
80 ms
Latencia p95
250 ms
Latencia p99
600 ms
Uptime SLO
99.5 %
Test Coverage
70 %
Seguridad max
MEDIUM
RPO máx
60 min
RTO máx
4 h
👤
Cadena de Aprobadores Este motor NUNCA auto-aprueba
schema_change_production
tech-lead + on-call
new-external-service
tech-lead + cfo
auth-or-authz-change
tech-lead + security-owner
Próximos Pasos — Antes de bloquear la decisión
Fork obligatorio
slo-architect Formalizar el SLO con error budget
api-design-reviewer Validar contrato API y breaking changes
database-designer ERD + estrategia de índices
senior-security Threat model + OWASP Top 10
Scaffolding inmediato (AgenteFlow)
Primer sprint de migración
# 1. Scaffoldear rutas desde OpenAPI
python3 scripts/api_scaffolder.py \
  agenteflow-openapi.yaml \
  --framework fastify \
  --output src/routes/

# 2. Analizar BD legacy
python3 scripts/database_migration_tool.py \
  --connection $DATABASE_URL \
  --analyze

# 3. Load test baseline
python3 scripts/api_load_tester.py \
  https://api.agenteflow.io/workflows \
  --concurrency 120 \
  --duration 30
📚
Referencias Canon
01Martin Kleppmann — Designing Data-Intensive Applications (2017) — decisiones de BD, cache, queue
02Sam Newman — Building Microservices — MonolithFirst, criterio equipo ≥ 30
03OWASP API Security Top 10 (2023) — security hardening workflow
04Google SRE Workbook — SLO + error budget canónico
05Fastify v5 docs — framework preferido para latencia baja en Node.js
06Drizzle ORM + Zod — stack de validación type-safe moderno para TypeScript