~/progetti/formicaio/README.md
←~/progetti/formicaio/README.md

Formicaio

{ “fecha”: “2026-10-24”, “estado”: “live”, “módulos_stack”: 14 }

Un equipo de agentes especializados para tus objetivos de cada día — recuerdan el contexto, citan sus fuentes y miden el progreso

Formicaio nace de una pregunta que me hacía cada mañana: «¿qué puedo comer esta mañana?». Para responderla bien hacen falta el plan de entrenamiento, el día de la semana, lo que hay en la despensa y el objetivo — y con un chat de IA genérico había que explicarlo todo desde cero, cada vez: un cuarto de hora para decidir una comida, para luego recibir un consejo que no sabía nada de mí. Formicaio parte del supuesto contrario: el contexto es un dato estructurado, no un texto que reescribir. Es un asistente personal hecho de agentes especializados, agrupados en equipos — atletismo, estudio, cualquier otro ámbito — que responden en pocos segundos con tu contexto, dicen de qué fuente viene cada consejo y llevan la cuenta de lo que haces de verdad.

## Equipos, agentes y fuentes

Un equipo es un ámbito con su estado compartido: objetivos, métricas, compromisos recurrentes, tipos de observación. Dentro hay uno o varios agentes, cada uno con sus instrucciones, sus principios y sus documentos. Antes de cada respuesta, una lectura estructurada de la pregunta elige al agente que debe responder y reconoce lo que hay que registrar; después el agente responde citando los pasajes de los que saca el consejo.

·Documentos por agente, divididos en pasajes y encontrados con la búsqueda de texto completo de PostgreSQL: cada cita remite al pasaje exacto
·Observaciones leídas del chat: un entrenamiento saltado, un pesaje o una comida se convierten en datos, validados por el núcleo, sin rellenar formularios
·Compromisos recurrentes, como los entrenamientos de la semana, con las excepciones dichas en el chat
·Cada respuesta es una recomendación para un día concreto: un toque bajo la respuesta dice cómo ha ido, y de ahí sale la medida de la adherencia

## Un núcleo que no sabe nada de atletismo

El requisito más estricto era la agnosticidad: un ámbito nuevo tiene que añadirse solo con configuración, sin tocar el código. El núcleo no conoce ni la pista ni los exámenes, y una comprobación en la CI falla si un término del piloto aparece en sus módulos. La configuración de un equipo está descrita por un JSON Schema versionado y validada con Ajv; cada guardado publica una nueva versión inmutable, y cada turno registra la que ha usado. El segundo equipo, estudio, nació así: un archivo de configuración, cero líneas de código. Hoy equipos, agentes, métricas y tipos de observación se crean y se modifican directamente desde la app, a partir de plantillas.

## El turno, de la pregunta a la respuesta

Cada pregunta es un turno con una traza completa: la versión de la configuración, el contexto enviado al modelo, los intentos, las comprobaciones de reglas, los tokens y el coste. El contexto se ensambla leyendo el núcleo en el mismo proceso, porque dentro de un turno el sistema tiene que leer sus propias escrituras: es el motivo principal por el que la arquitectura es un monolito modular y no un conjunto de servicios.

·Monolito modular con fronteras rígidas: una interfaz pública por módulo, un esquema de PostgreSQL y un rol de base de datos por módulo, dependencias verificadas en la CI con dependency-cruiser
·Eventos encolados en la misma transacción del turno y entregados una sola vez por graphile-worker, con dead-letter tras tres intentos
·Un tope de gasto diario por usuario, reservado bajo un advisory lock antes de llamar al modelo
·El texto de preguntas y respuestas se borra a los 90 días: quedan fechas, duraciones, costes y una huella

## Tu clave, tu modelo

Formicaio no tiene una clave propia. Cada usuario elige el proveedor en los ajustes — Anthropic, OpenAI o DeepSeek — y pega su propia clave, que se sella con AES-256-GCM en un esquema aparte. Hay un modelo por proveedor, detrás de un adaptador común con su propio ciclo de reintentos dentro del presupuesto de latencia del turno. Cada respuesta la paga quien la pide, y antes de elegir la app explica con claridad cómo trata los datos cada proveedor.

## Medir, no adivinar

El proyecto tiene un gate semanal con dos números: la adherencia, es decir, la proporción de días de compromiso en los que el consejo se sigue de verdad (el objetivo es al menos el 80 %), y el tiempo desde la pregunta hasta la respuesta mostrada (p95 por debajo de dos minutos, frente al cuarto de hora del punto de partida). La calidad de las respuestas se evalúa sobre un conjunto de preguntas congelado, en una copia desechable de la base de datos, nunca en producción.

## Diseño e identidad visual

La app es una PWA instalable, pensada para el móvil pero cómoda también en el escritorio, con una estética suave y un único azul como color primario. El logotipo es un hormiguero en sección: el montículo arriba, las cámaras dentro, las galerías recortadas hasta la entrada, de modo que en cualquier superficie se ve el fondo a través. En el nombre, la «AI» de FORMICAIO va en el color de acento.

·HeroUI v3 con los tokens de Formicaio, tema claro y oscuro
·Plus Jakarta Sans servida por la propia app: ninguna petición a servicios de fuentes externos
·Acceso sin contraseña, con el email y un código de seis cifras, construido sobre las API de Clerk con el markup de la app
·Respuestas en Markdown renderizadas de forma segura, con citas numeradas; cada página pública se verifica con axe-core en los tests

## Stack tecnológico

Un monorepo TypeScript gestionado con pnpm: el backend, la PWA y un cliente de API generado a partir del contrato OpenAPI del backend, para que front-end y back-end no puedan divergir en silencio.

·Backend: NestJS sobre Fastify, Kysely para el acceso a datos, PostgreSQL 18
·Colas y vencimientos: graphile-worker sobre el mismo PostgreSQL
·Configuración de los equipos: JSON Schema validado con Ajv
·Web: React, Vite, React Router, TanStack Query, HeroUI v3, Tailwind CSS v4, i18next
·Modelos: los SDK de Anthropic y de OpenAI, que también sirve a DeepSeek a través de su API compatible
·Tests por niveles con Vitest, desde las fronteras entre módulos hasta los procesos reales con el proveedor del modelo simulado

## En producción

Funciona en contenedores Docker en un servidor de la Unión Europea. Las imágenes las construye la CI, etiquetadas con el SHA del commit, y cada commit en main pasa a producción por sí solo: de la CI el servidor acepta una única cosa, el despliegue de un commit de main, siempre con una copia de seguridad de la base de datos antes de las migraciones. La base de datos está en un volumen cifrado con LUKS2, y las copias nocturnas salen del servidor ya cifradas con age, hacia Cloudflare R2.

Formicaio es un proyecto personal, ideado, diseñado y desarrollado en solitario, y su primer usuario soy yo. Los documentos del proyecto — discovery, estimación, modelo de dominio, arquitectura, plan de implementación y plan de pruebas — los escribió donumAI y yo los aprobé etapa por etapa. El criterio con el que lo juzgo está escrito en el gate: cuatro semanas de uso diario, con una adherencia de al menos el 80 %. Lo demás son intenciones.

// stack
[“nestjs”, “postgres”, “react”, “llm”, “fastify”, “kysely”, “graphile-worker”, “vite”, “heroui”, “tailwind”, “typescript”, “pwa”, “json-schema”, “docker”, ]