# Arquitectura · Aegis Latent Core

> Por dentro: el orden exacto en que viaja una petición, las piezas del programa que la procesan y cómo se conecta a una aplicación existente cambiando una sola línea de configuración.

- URL: https://aegis-latent-core.vercel.app/arquitectura
- Para: Equipos técnicos y de arquitectura.
- Actualizado: 2026-09-27
- Idioma: español

## Flujo de una petición

```
llamante ──────────►  gateway Aegis  ──────────────────────►  proveedor
                        │  admisión: auth · alcance · límites
                        │  WAF · rate limiting · sesión
                        │
                        │  (política superada) reenvío
                        │  ◄──────────── respuesta ──────────
                        │
                        │  redactar → hash → firmar → WAL + fsync → hoja MMR
                        │  (los rechazos se confirman en la misma cadena
                        │   firmada antes de devolver el error)
                        │
llamante ◄──────────  respuesta + X-Aegis-Evidence-Status
                        + X-Aegis-Request-ID + cabeceras de prueba X-Aegis-MMR-*
```

## Modos

- **No-streaming:** El registro de evidencia se confirma **antes** de que la respuesta sea observable por el llamante.
- **Streaming:** Eventos saneados salen de forma incremental por una cola acotada mientras el estado es `pending-terminal`. Un resumen terminal exacto se confirma y sólo entonces se emite el marcador final; si el commit falla, el marcador se retiene.
- **Fail-closed:** Sin firmante, sin limitador distribuido o con un ledger que no reproduce, no hay servicio.
- **Topología:** Varios workers compartiendo un WAL no dan una cadena ordenada única; no hay orden total entre procesos ni regiones.

## Ciclo de vida (llamada no-streaming)

1. **Admisión** (admisión) — Autenticación, alcance y límites del cuerpo.
2. **WAF y rate limiting** (admisión) — Regex normalizadas, sesión y limitador (Redis en producción).
3. **Reenvío al proveedor** (proveedor) — Sólo si la política se supera. Los rechazos saltan directamente al registro.
4. **Respuesta del proveedor** (proveedor) — El gateway la retiene: todavía no la ve su aplicación.
5. **Redactar y hashear** (evidencia) — Redacción opt-in; el WAL guarda hashes en el path declarado.
6. **Firmar y encadenar** (evidencia) — HMAC por defecto; Ed25519 o ML-DSA-65 si se configura.
7. **WAL + fsync → hoja MMR** (evidencia) — Commit durable (group commit). Si falla, 503 y ningún nodo sin confirmar.
8. **Emisión** (emisión) — Respuesta + X-Aegis-Evidence-Status + cabeceras de prueba MMR.

## Piezas del núcleo

La wheel publicada es `py3-none-any`; la extensión Rust (PyO3) es opcional.

| # | Pieza | Python | Rust | Nota |
| --- | --- | --- | --- | --- |
| 1 | Ledger de evidencia y WAL: CryptographicAuditLedger: hash canónico, enlace al predecesor, firma, append al WAL con fsync y hoja MMR. Group commit coalescente. | `aegis/core/crypto_audit.py` | `aegis_rust_v2/src/wal.rs` | Commit p99 1,22 ms con fsync real (2026-09-24, contenedor compartido de 4 CPU). |
| 2 | Merkle Mountain Range: Acumulador append-only con prueba de inclusión portable O(log n), sin conocimiento cero. Esquema aegis-mmr-inclusion-v2 con separación de dominio. | `aegis/core/mmr.py` | `aegis_rust_v2/src/mmr.rs` | Rust/Python 4,77× de media, 4,94× máx. medido el 2026-09-03: propiedad del host, no del código. |
| 3 | WAF de capa 1: Regex sobre una copia normalizada del texto, endurecidas contra homoglifos, espaciado y leetspeak; pre-filtro Aho-Corasick en Rust. | `aegis/proxy/waf.py` | `aegis_rust_v2/src/waf.rs` | El pre-filtro Rust no normaliza Unicode (UC-063). No es una frontera contra inyección (UC-042). |
| 4 | Forwarder: Reenvío asíncrono al proveedor con cota de tamaño de respuesta acumulada. | `aegis/proxy/app.py` | `aegis_rust_v2/src/forwarder.rs` | La cota limita el cuerpo acumulado, no el pico transitorio de memoria (UC-062). |
| 5 | Streaming SSE acotado: Cola acotada por bytes e ítems; estado pending-terminal; un resumen terminal exacto se confirma antes del marcador final. | `aegis/proxy/streaming.py` | — | +20,1 MB RSS para 1 000 streams SSE concurrentes en proceso (2026-09-24). |
| 6 | Rate limiting: Token bucket sin locks en Rust; limitador distribuido en Redis que puede fallar cerrado. El modo en memoria es sólo para desarrollo. | `aegis/core/ratelimiter.py` | `aegis_rust_v2/src/rate_limit.rs` |  |
| 7 | Firma post-cuántica ML-DSA-65: ML-DSA-65 (FIPS 204) detrás de un trait intercambiable. Ed25519 y HMAC como alternativas; ruta HSM en el servidor enterprise. | `aegis_server/crypto/keyring.py` | `aegis_rust_v2/src/pqc.rs` | sign 173 µs · verify 62,4 µs. verify() NO es constant-time (UC-012); no hay validación FIPS 140 (UC-013). |

## Integración

Compatible con OpenAI y con la API nativa de Anthropic. Proveedores con adaptador: OpenAI, Anthropic, Google Gemini, vLLM, Hugging Face, OpenAI-compat.

```bash
# Antes
OPENAI_BASE_URL=https://api.openai.com/v1

# Después — el tráfico pasa por Aegis
OPENAI_BASE_URL=http://aegis:8080/v1
```

Imagen firmada: `ghcr.io/juanlunaia/aegis-latent-core:5.0.1`. Aviso: `pip install aegis-latent-core` instala 4.1.2, no 5.0.1.

---

Siguiente: [Cumplimiento](https://aegis-latent-core.vercel.app/cumplimiento.md) · Índice: https://aegis-latent-core.vercel.app/llms.txt · Todo el sitio: https://aegis-latent-core.vercel.app/llms-full.txt
