Jonatan Matajonmatum.com
conceptosnotasexperimentosensayos
© 2026 Jonatan Mata. All rights reserved.v2.1.1
Experimentos

Segundo Cerebro Serverless

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».

evergreen#serverless#aws#knowledge-graph#second-brain#terraform#bedrock#dynamodb#mcp#agentcore#lambda#architecture#production

¿Qué es?

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.

Arquitectura

El sistema separa tres capas con responsabilidades claras:

Loading diagram...
  • Memoria: DynamoDB single-table design con GSIs para queries bidireccionales + S3 para contenido largo
  • Cómputo: 5 funciones Lambda especializadas (capture, search, graph, connect, flag) orquestadas por Step Functions
  • Interfaz: dos puertas — API Gateway REST para el SPA humano, AgentCore Gateway para agentes MCP

Bedrock proporciona clasificación (Claude) y embeddings (Titan 1,024 dimensiones).

Progreso

El proyecto sigue cuatro fases definidas en el ensayo. Las cuatro fases están completas y desplegadas en dev:

FaseComponentesEstado
1 — CapturaTerraform foundation, DynamoDB, S3, Capture Lambda, API Gateway, Step Functions, migración de datos✅ Completa
2 — LecturaSearch Lambda (híbrida keyword + semántica), Graph Lambda, CloudFront + S3 frontend✅ Completa
3 — AgenteAgentCore MCP Gateway con 6 herramientas, Connect Lambda, Flag Lambda, write safety✅ Completa
4 — SurfacingSurfacing Lambda con 5 analizadores, EventBridge daily digest, SNS email✅ Completa
TransversalBenchmarks, configuración domain-agnostic, observabilidad🔲 Pendiente

Lo que funciona hoy

Puerta humana (API Gateway REST):

  • POST /capture — ingesta texto, clasifica con Bedrock Claude, genera embeddings con Titan, persiste en DynamoDB + S3 vía Step Functions
  • GET /search?q= — búsqueda híbrida keyword + semántica con cosine similarity sobre embeddings de 1,024 dimensiones
  • GET /graph — grafo completo de conocimiento (nodos + edges bidireccionales)
  • GET /nodes/{id} — nodo individual con edges y nodos relacionados
  • GET /health — health check

Puerta del agente (AgentCore MCP Gateway):

  • read_node — lee un nodo por slug con metadata, edges y nodos relacionados
  • list_nodes — lista nodos con filtros por tipo, status y tags
  • search — búsqueda híbrida keyword + semántica
  • add_node — crea un nodo seed con clasificación automática de Bedrock
  • connect_nodes — crea edges bidireccionales con audit trail
  • flag_stale — marca un nodo para revisión humana sin modificarlo

Surfacing (digest diario):

  • 5 analizadores: seeds olvidados, nodos huérfanos, conexiones faltantes, candidatos a promoción, gaps de contenido
  • EventBridge cron diario a las 8 AM UTC → Surfacing Lambda → SNS email
  • Umbrales configurables vía variables de entorno (STALE_DAYS, MIN_EDGES, SIMILARITY_THRESHOLD)
  • Verificado en dev: 17 stale seeds, 1 huérfano, 40 content gaps en ~2.5s para 170 nodos

Infraestructura:

  • CloudFront + S3 para hosting estático del frontend
  • Migración completa de ~160 nodos desde jonmatum.com MDX a DynamoDB + S3
  • Backfill de embeddings para todos los nodos existentes
  • CI/CD con GitHub Actions OIDC (sin credenciales estáticas)
  • Smoke test script con 12 verificaciones de endpoints
  • GitHub Actions OIDC role en bootstrap Terraform

Resiliencia (deep review #3):

  • invokeWithRetry() con backoff exponencial para throttling de Bedrock (1s, 2s, 4s)
  • Pipeline de captura crea edges bidireccionales (consistencia con connect_nodes)
  • batchGetNodes() elimina queries N+1 en Graph Lambda
  • CORS en todas las rutas de error, Content-Type en todas las respuestas
  • Despliegue a prod en CI/CD con aprobación por environment

Puerta del agente: MCP Gateway

La «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 MCPLambdaOperaciónEscritura
read_nodeGraphLee nodo + edges + relacionadosNo
list_nodesGraphLista/filtra nodosNo
searchSearchBúsqueda híbrida keyword + semánticaNo
add_nodeCaptureCrea nodo seed con clasificación IASí
connect_nodesConnectCrea edge bidireccionalSí
flag_staleFlagMarca nodo para revisiónSí

Write safety

Las operaciones de escritura siguen controles estrictos:

  • Audit trail: toda mutación crea un item AUDIT# en DynamoDB con actor, acción, cambios y TTL de 90 días
  • Seed-only: los nodos creados por agentes inician como seed — requieren revisión humana para promoción
  • Sin deletes: los agentes no pueden eliminar nodos, solo marcarlos para revisión con flag_stale
  • Actor tracking: cada operación registra el actor (agent:{session_id} o api)
  • Validación de existencia: 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);

Diseño de DynamoDB

Single-table design con cuatro tipos de items:

PKSKDatos
NODE#serverlessMETATipo, status, títulos, summaries, tags, timestamps
NODE#serverlessEDGE#aws-lambdaTipo de relación, peso, dirección
NODE#serverlessEMBEDVector de 1,024 dimensiones (Titan V2)
AUDIT#2026-03-19T10:30:00ZNODE#serverlessAcción, actor, diff

Dos GSIs habilitan queries inversas y filtros por status:

  • GSI1: SK (hash) + PK (range) — «¿qué nodos apuntan a serverless?»
  • GSI2: GSI2PK (status) — «todos los seeds sin actualizar en 7 días»

Pipeline de captura

Step Functions orquesta el pipeline completo con retry automático en throttling de Bedrock:

Loading diagram...

Cada paso es una invocación Lambda separada. Se usa Express Workflow (síncrono) para mantener la respuesta dentro del timeout de API Gateway.

Búsqueda híbrida

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.

Infraestructura como código

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 PRs
  • terraform-apply.yml — apply en merge a main
  • lambda-deploy.yml — empaquetado y despliegue de funciones

Costo

Escala a cero. Sin costos mínimos más allá del almacenamiento S3:

CargaCosto mensual
Idle (0 req/día)~$0.51
Moderada (100 req/día)~$2.44
Alta (1,000 req/día)~$11.21

Decisiones de arquitectura

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:

ADRDecisión
001Lambda packaging (zip) sin framework web
002Write safety — 6 controles para mutaciones de agentes MCP
003Autenticación Cognito y modelo de visibilidad (propuesto)
004DynamoDB single-table design con 2 GSIs
005Búsqueda híbrida keyword + semántica con pesos configurables
006Step Functions Express para pipeline de captura
007AgentCore Gateway sobre MCP server self-hosted
008Scan de embeddings en memoria (temporal, hasta ~5K nodos)
009Spec-Driven Development — 7 steering files antes de código
010Optimización de tokens Bedrock — 20 slugs recientes vs todos
011CloudFront + S3 sobre Vercel/Amplify
012GitHub Actions OIDC sobre credenciales estáticas

Próximos pasos

  • AgentCore Runtime (issue #8) — hosting del agente de razonamiento en microVMs serverless con acceso a todas las herramientas del Gateway
  • Observabilidad (issue #14) — dashboards CloudWatch, alarmas, X-Ray tracing
  • Configuración domain-agnostic (issue #13) — hacer el sistema desplegable para cualquier dominio con terraform apply
  • Autenticación (issue #17) — implementar ADR-003: Cognito + modelo de visibilidad pública/privada

¿Por qué importa?

Este 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.

Referencias

  • Del prototipo a producción: un segundo cerebro serverless — Ensayo que define la arquitectura completa.
  • Repositorio en GitHub — Código fuente del proyecto.
  • AWS Serverless Lens — AWS, 2024. Marco de referencia para aplicaciones serverless.
  • DynamoDB Developer Guide — AWS, 2024. Guía del diseño single-table.
  • Bedrock AgentCore — AWS, 2025. Gateway MCP y Runtime para agentes.
  • AgentCore Gateway Developer Guide — AWS, 2025. Documentación del gateway MCP para herramientas Lambda.
  • MCP Specification — Anthropic, 2025. Protocolo de interoperabilidad para agentes.
  • Step Functions Developer Guide — AWS, 2024. Orquestación de workflows serverless.

Contenido relacionado

  • Serverless

    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.

  • AWS Lambda

    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.

  • AWS DynamoDB

    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.

  • AWS Bedrock

    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.

  • AWS API Gateway

    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.

  • AWS Step Functions

    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.

  • AWS EventBridge

    Bus de eventos serverless de AWS que conecta aplicaciones usando eventos, permitiendo arquitecturas desacopladas y event-driven con enrutamiento basado en reglas.

  • AWS SNS

    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.

  • AWS S3

    Servicio de almacenamiento de objetos de AWS con durabilidad del 99.999999999%, escalabilidad ilimitada y múltiples clases de almacenamiento para optimizar costos.

  • AWS IAM

    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.

  • Grafos de Conocimiento

    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 de Contexto de Modelo (MCP)

    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.

  • Infrastructure as Code

    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.

  • Optimización de Costos

    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.

  • AWS Well-Architected Framework

    Framework de AWS con seis pilares de mejores prácticas para diseñar y operar sistemas confiables, seguros, eficientes y rentables en la nube.

Experimentos