Backend serverless de producción para un grafo de conocimiento personal — DynamoDB, Lambda, Bedrock, MCP, Step Functions. La implementación de la arquitectura descrita en el ensayo «Del prototipo a producción».
La implementación de producción del segundo cerebro serverless descrito en el ensayo homónimo. Mientras el ensayo define la arquitectura — capas de memoria, cómputo e interfaz con «dos puertas» para humanos y agentes — este repositorio es el código que la materializa.
Disponible como código fuente.
El sistema separa tres capas con responsabilidades claras:
Bedrock proporciona clasificación (Claude) y embeddings (Titan 1,024 dimensiones).
El proyecto sigue cuatro fases definidas en el ensayo. Las cuatro fases están completas y desplegadas en dev:
| Fase | Componentes | Estado |
|---|---|---|
| 1 — Captura | Terraform foundation, DynamoDB, S3, Capture Lambda, API Gateway, Step Functions, migración de datos | ✅ Completa |
| 2 — Lectura | Search Lambda (híbrida keyword + semántica), Graph Lambda, CloudFront + S3 frontend | ✅ Completa |
| 3 — Agente | AgentCore MCP Gateway con 6 herramientas, Connect Lambda, Flag Lambda, write safety | ✅ Completa |
| 4 — Surfacing | Surfacing Lambda con 5 analizadores, EventBridge daily digest, SNS email | ✅ Completa |
| Transversal | Benchmarks, configuración domain-agnostic, observabilidad | 🔲 Pendiente |
Puerta humana (API Gateway REST):
POST /capture — ingesta texto, clasifica con Bedrock Claude, genera embeddings con Titan, persiste en DynamoDB + S3 vía Step FunctionsGET /search?q= — búsqueda híbrida keyword + semántica con cosine similarity sobre embeddings de 1,024 dimensionesGET /graph — grafo completo de conocimiento (nodos + edges bidireccionales)GET /nodes/{id} — nodo individual con edges y nodos relacionadosGET /health — health checkPuerta del agente (AgentCore MCP Gateway):
read_node — lee un nodo por slug con metadata, edges y nodos relacionadoslist_nodes — lista nodos con filtros por tipo, status y tagssearch — búsqueda híbrida keyword + semánticaadd_node — crea un nodo seed con clasificación automática de Bedrockconnect_nodes — crea edges bidireccionales con audit trailflag_stale — marca un nodo para revisión humana sin modificarloSurfacing (digest diario):
STALE_DAYS, MIN_EDGES, SIMILARITY_THRESHOLD)Infraestructura:
Resiliencia (deep review #3):
invokeWithRetry() con backoff exponencial para throttling de Bedrock (1s, 2s, 4s)connect_nodes)batchGetNodes() elimina queries N+1 en Graph LambdaContent-Type en todas las respuestasLa «puerta del agente» expone las funciones Lambda como herramientas MCP vía Bedrock AgentCore. Cualquier agente compatible con MCP puede descubrir y usar las herramientas semánticamente:
| Herramienta MCP | Lambda | Operación | Escritura |
|---|---|---|---|
read_node | Graph | Lee nodo + edges + relacionados | No |
list_nodes | Graph | Lista/filtra nodos | No |
search | Search | Búsqueda híbrida keyword + semántica | No |
add_node | Capture | Crea nodo seed con clasificación IA | Sí |
connect_nodes | Connect | Crea edge bidireccional | Sí |
flag_stale | Flag | Marca nodo para revisión | Sí |
Las operaciones de escritura siguen controles estrictos:
AUDIT# en DynamoDB con actor, acción, cambios y TTL de 90 díasseed — requieren revisión humana para promociónflag_staleagent:{session_id} o api)connect_nodes verifica que ambos nodos existan antes de crear edges// Audit trail en cada operación de escritura
const audit: AuditItem = {
PK: `AUDIT#${now}`,
SK: `NODE#${slug}`,
action: "connect",
actor,
changes: { source, target, edge_type, weight },
ttl: Math.floor(Date.now() / 1000) + 90 * 86400,
};
await putAudit(audit);Single-table design con cuatro tipos de items:
| PK | SK | Datos |
|---|---|---|
NODE#serverless | META | Tipo, status, títulos, summaries, tags, timestamps |
NODE#serverless | EDGE#aws-lambda | Tipo de relación, peso, dirección |
NODE#serverless | EMBED | Vector de 1,024 dimensiones (Titan V2) |
AUDIT#2026-03-19T10:30:00Z | NODE#serverless | Acción, actor, diff |
Dos GSIs habilitan queries inversas y filtros por status:
GSI2PK (status) — «todos los seeds sin actualizar en 7 días»Step Functions orquesta el pipeline completo con retry automático en throttling de Bedrock:
Cada paso es una invocación Lambda separada. Se usa Express Workflow (síncrono) para mantener la respuesta dentro del timeout de API Gateway.
La Search Lambda combina keyword matching y similitud semántica:
// Búsqueda híbrida: keyword + semántica
const keywordResults = await queryByKeywords(query, table);
const queryEmbedding = await generateEmbedding(query);
const allEmbeddings = await scanEmbeddings(table);
const semanticResults = allEmbeddings
.map(item => ({
slug: item.PK.replace("NODE#", ""),
score: cosineSimilarity(queryEmbedding, item.embedding),
}))
.sort((a, b) => b.score - a.score);
// Combinar scores con pesos configurables
const combined = mergeResults(keywordResults, semanticResults, {
keywordWeight: 0.3,
semanticWeight: 0.7,
});A la escala actual (~160 nodos, ~700KB de vectores) el scan en memoria es suficiente. El benchmark de escalabilidad (issue #12) evaluará alternativas para 10K+ nodos.
Toda la infraestructura se define con Terraform usando módulos reutilizables:
infra/
bootstrap/ → Backend de estado (S3 + DynamoDB lock)
modules/
dynamodb/ → Single-table design + GSIs
lambda/ → Funciones de cómputo
api-gateway/ → Puerta humana (REST)
step-functions/ → Orquestación de pipelines
s3/ → Contenido y frontend
cloudfront/ → CDN + headers de seguridad
iam/ → Roles y políticas
agentcore-gateway/ → Puerta del agente (MCP)
sns/ → Notificaciones
environments/
dev/ → Configuración dev (desplegado)
prod/ → Configuración prod
CI/CD usa GitHub Actions con OIDC — sin credenciales estáticas de AWS:
terraform-plan.yml — plan en PRsterraform-apply.yml — apply en merge a mainlambda-deploy.yml — empaquetado y despliegue de funcionesEscala a cero. Sin costos mínimos más allá del almacenamiento S3:
| Carga | Costo mensual |
|---|---|
| Idle (0 req/día) | ~$0.51 |
| Moderada (100 req/día) | ~$2.44 |
| Alta (1,000 req/día) | ~$11.21 |
El repositorio incluye 12 ADRs (Architecture Decision Records) en docs/decisions/ que documentan cada decisión técnica con contexto, alternativas evaluadas, datos de benchmarks y criterios de revisión:
| ADR | Decisión |
|---|---|
| 001 | Lambda packaging (zip) sin framework web |
| 002 | Write safety — 6 controles para mutaciones de agentes MCP |
| 003 | Autenticación Cognito y modelo de visibilidad (propuesto) |
| 004 | DynamoDB single-table design con 2 GSIs |
| 005 | Búsqueda híbrida keyword + semántica con pesos configurables |
| 006 | Step Functions Express para pipeline de captura |
| 007 | AgentCore Gateway sobre MCP server self-hosted |
| 008 | Scan de embeddings en memoria (temporal, hasta ~5K nodos) |
| 009 | Spec-Driven Development — 7 steering files antes de código |
| 010 | Optimización de tokens Bedrock — 20 slugs recientes vs todos |
| 011 | CloudFront + S3 sobre Vercel/Amplify |
| 012 | GitHub Actions OIDC sobre credenciales estáticas |
terraform applyEste proyecto traduce una arquitectura de referencia en código desplegable. La meta es que cualquier builder pueda tomar el repositorio, configurar su dominio (legal, investigación, educación) en terraform.tfvars, y desplegar un segundo cerebro completo con terraform apply. El ensayo explica el «por qué» de cada decisión; el código implementa el «cómo».
Las cuatro fases ya demuestran que la arquitectura funciona: captura con clasificación automática, búsqueda semántica híbrida, un grafo de conocimiento bidireccional, una puerta MCP para agentes IA con controles de escritura, y un digest diario proactivo que identifica seeds olvidados y conexiones faltantes — todo serverless, todo en Terraform, escalando a cero con ~$0.51/mes de costo idle.
Modelo de computación en la nube donde el proveedor gestiona la infraestructura automáticamente, permitiendo ejecutar código sin aprovisionar ni administrar servidores, pagando solo por el uso real.
Servicio de cómputo serverless de AWS que ejecuta código en respuesta a eventos sin necesidad de aprovisionar ni administrar servidores, escalando automáticamente desde cero hasta miles de ejecuciones concurrentes.
Base de datos NoSQL serverless de AWS con latencia de milisegundos a cualquier escala, ideal para aplicaciones que requieren alto rendimiento y escalabilidad automática.
Servicio serverless de AWS que proporciona acceso a modelos fundacionales de múltiples proveedores (Anthropic, Meta, Mistral, Amazon) vía API unificada, sin gestionar infraestructura de ML.
Servicio managed de AWS para crear, publicar y gestionar APIs REST, HTTP y WebSocket que actúan como puerta de entrada a funciones Lambda y otros servicios backend.
Servicio de orquestación serverless de AWS que coordina múltiples servicios en workflows visuales usando Amazon States Language (ASL), con manejo de errores, reintentos y ejecución paralela integrados.
Bus de eventos serverless de AWS que conecta aplicaciones usando eventos, permitiendo arquitecturas desacopladas y event-driven con enrutamiento basado en reglas.
Servicio de mensajería pub/sub de AWS que distribuye mensajes a múltiples suscriptores simultáneamente, habilitando patrones de fan-out y notificaciones a escala.
Servicio de almacenamiento de objetos de AWS con durabilidad del 99.999999999%, escalabilidad ilimitada y múltiples clases de almacenamiento para optimizar costos.
Servicio de gestión de identidad y acceso de AWS que controla quién puede hacer qué en tu cuenta, con políticas granulares basadas en el principio de mínimo privilegio.
Estructuras de datos que representan conocimiento como redes de entidades y relaciones, permitiendo razonamiento, descubrimiento de conexiones y consultas semánticas sobre dominios complejos.
Protocolo abierto creado por Anthropic que estandariza cómo las aplicaciones de IA se conectan con herramientas, datos y servicios externos mediante una interfaz universal.
Práctica de definir y gestionar infraestructura mediante archivos de configuración versionados en lugar de procesos manuales. Fundamento de la automatización moderna de operaciones.
Prácticas y estrategias para minimizar el gasto en cloud sin sacrificar rendimiento, incluyendo right-sizing, reservas, spot instances y eliminación de recursos ociosos.
Framework de AWS con seis pilares de mejores prácticas para diseñar y operar sistemas confiables, seguros, eficientes y rentables en la nube.