> ## Documentation Index
> Fetch the complete documentation index at: https://internal.softcrum.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ADR-003 — Arquitectura hexagonal y la lista cerrada de puertos

> Estado: Propuesto (RECONSTRUCCIÓN — requiere validación) · Fecha: 2026-08-17 (reconstruido) Refs: ../constitution/founding-constitution.md.

Estado: **Propuesto (RECONSTRUCCIÓN — requiere validación)** · Fecha: 2026-08-17 (reconstruido)
Refs: [`../constitution/founding-constitution.md`](/es/constitution/founding-constitution)

> Traducción. Autoritativo: [`../../adr/adr-003-hexagonal-and-ports.md`](/adr/adr-003-hexagonal-and-ports).
>
> ⚠️ Reconstruido a partir del material que tenemos, no recuperado. Etiquetas: **\[derived]** tiene
> respaldo en el repositorio · **\[inferred]** es deducido · **\[proposed]** es un hueco que llené.

## Contexto

Una plataforma que pretende sobrevivir a sus vendors tiene que poder reemplazar uno sin una
reescritura. La respuesta habitual es "usa interfaces", que se degrada porque nadie se pone de
acuerdo en qué amerita una — y en un código donde los agentes escriben la mayor parte, ese desacuerdo
se compone cada semana. **\[inferred]**

## Decisión

**Arquitectura hexagonal sin excepción.** \[derived] El código de dominio y de aplicación depende de
puertos. Un SDK de vendor importado fuera de un archivo de adaptador es un defecto, impuesto por lint.

**La lista de categorías de puerto es cerrada.** \[derived] Existen seis categorías; agregar una exige
una enmienda de constitución revisada línea por línea por el owner. Ese cierre es la parte que carga
el peso: sin él, "usa un puerto" se convierte en "inventa una abstracción", y una abstracción
inventada por pull request es peor que ninguna.

Los bindings se declaran en el composition root de cada módulo, `makeDeps(ctx)`. \[derived]

Las seis categorías están reconstruidas con baja confianza en
[`../constitution/founding-constitution.md`](/es/constitution/founding-constitution) Parte 2.
**\[inferred]** La enmienda A1 agrega `QueuePort` y `NotificationChannelPort` como siete y ocho.

## Consecuencias

* Un cambio de vendor es un adaptador más un ADR, no una migración.
* Los agentes no pueden inventar abstracciones, porque la lista de las permitidas es finita y nombrada.
  − Algunas abstracciones genuinamente útiles quedarán bloqueadas hasta una enmienda. Ese costo se
  acepta: el rito de la enmienda es barato y raro, y la alternativa no tiene límite.

## Lo que no pude determinar

Si la base de datos y la autenticación se excluyeron deliberadamente de la lista de puertos o
simplemente nunca surgieron. El `getDb(tenantCtx)` de R8 sugiere exclusión deliberada. **\[inferred]**
