Skip to main content
Estado: Propuesto (RECONSTRUCCIÓN — requiere validación) · Fecha: 2026-08-17 (reconstruido) Refs: ../constitution/founding-constitution.md
Traducción. Autoritativo: ../../adr/adr-003-hexagonal-and-ports.md. ⚠️ 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 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]