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

# TS-002 — QueuePort y NotificationChannelPort + adaptadores de F1

> Objetivo: ambos puertos en packages/core; adaptadores VercelQueueAdapter, ResendEmailAdapter, FcmPushAdapter, InAppAdapter, WebhookAdapter; binding en el composition root de cada módulo.

> Traducción. Autoritativo: [`../../task-specs/ts-002-ports-and-adapters.md`](/task-specs/ts-002-ports-and-adapters).

Arquetipo: comando síncrono · Referencias: enmienda A1 (debe estar APLICADA primero), ADR-019,
standards/jobs.md, standards/notifications.md.

En alcance: interfaces de puerto + envelopes Zod · harness de consumidor (compuerta de
`processed_jobs`, reintentos con backoff y jitter, escritor de `dead_letters`, token buckets) ·
cableado de carriles `notif.{canal}.{carril}` · función pura `resolveChannels` con matriz unitaria
completa (niveles 0–3 × compuertas del destinatario).

Fuera: adaptador de SMS (F1b, tras el ADR de proveedor) · fallback entre canales (F2).

Aceptación: test de replay del harness (el mismo `job_id` dos veces ⇒ un solo efecto) · test de yield
de marketing bajo profundidad transaccional · 100% de cobertura de ramas en `resolveChannels` · cero
imports directos de proveedores fuera de los adaptadores (regla de lint).
