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.
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.
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.
admin_panel_needed requerido pero no aplica
go-or-rust-microservice
Servicio extraído, equipo ≥ 30, QPS ≥ 1000.
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
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
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