OM
EN ES

Situación

En distintas apps de cliente y hosts CMS, los equipos reconstruían flows de formularios parecidos con validación a medida y shells que se enteraban de cada keystroke—lentos de entregar y caros de cambiar.

Tarea

Aplicar un criterio de capas consistente—schema, engine-o-estado y field UI—elegido por producto o CMS, para que el lifecycle del form se quedara local y lo específico del host en el borde.

Acción

En superficies CMS, prioricé schema estable de form más adapters del host. En apps de producto, schema por contrato o builders tipados con field UI delgada. Reutilicé patterns (visibility, validación async, submit pipeline, shells tontos) solo donde ese host los necesitaba—no todos a la vez en una sola app.

Resultado

El trabajo con forms pesados avanzaba más rápido cuando el reuso justificaba un schema; los forms mínimos o hiper-custom se seguían armando a mano. Bajó el ruido de re-render porque los shells dejaron de suscribirse a cada keystroke.

Forma del sistema

Mismo criterio de capas entre productos; stacking distinto por host:

| Patrón | Cuándo encajaba | |---------|-----------------| | A — Schema contrato + engine + UI tonta | Apps de producto que necesitaban un cerebro de form claro y fields presentacionales | | B — Builders tipados + engine fino + fields del DS | Equipos que querían tipado fuerte sin amarrarse a una librería de forms pesada | | C — Schema + adapters CMS/host | Hosts tipo Sanity / HubSpot / Drupal, donde el borde cambia pero la idea del form debe seguir portable |

Importante: esto describe varias apps/CMS, cada una eligiendo un stacking—no una sola app ejecutando A, B y C a la vez.

Decisiones

Superficies CMS → schema + adapters (C)

Elegimos: un schema estable de form más un adapter del host para payloads, errores y ownership de cambios de schema. Rechazamos: meter APIs del CMS, detalles del content model o el lifecycle del embed dentro de la field UI o del layout shell. Por qué: los hosts CMS cambian; el form debe permanecer portable. El adapter absorbe el borde.

Apps de producto → A o B, no el modelo CMS a la fuerza

Elegimos: schema por contrato + engine (A) o builders tipados + engine fino (B), según el equipo. Rechazamos: arrastrar el stacking CMS-adapter a una app que no lo necesitaba—o forzar un engine de app dentro de un CMS. Por qué: la arquitectura es una decisión por producto. Copiar el stacking de otro host por costumbre crea el acoplamiento que este caso busca evitar.

Patrones que rindieron

Usados across apps/CMS según hacía falta (otra vez: elegidos por superficie):

  • Visibility condicional — pasos/condiciones en onboarding o flows de marketing CMS.
  • Validación async — cuando el host/API era dueño del check; la UI solo mostraba el error.
  • Submit pipeline — sobre todo en CMS: el engine arma el payload → el adapter entrega → la UI no conoce el endpoint.
  • Shell tonto — el estado del form no suscribe el layout/shell del CMS a cada keystroke.

Para el skim de un engineering manager: en hosts CMS pesan más el submit pipeline + shell tonto; visibility y async aparecen cuando el form gana esa complejidad.

Cuándo no usarlo

El layering schema-driven era la herramienta equivocada cuando:

  • El form era one-off / UX hiper-custom—el schema costaba más de lo que ahorraba; armar la UI a mano.
  • El form era mínimo (unos 2–3 campos)—ceremonia sin reuso; cablear inputs del design system y submit directo.

Qué rechazamos

  • Validators viviendo solo en la UI (duplicados y difíciles de reutilizar)
  • Layouts o shells CMS re-renderizando o suscritos a cada keystroke
  • Lógica de endpoint / content model del CMS dentro de field components

Lección transferible

Principal: Aísla el lifecycle del form del shell del host. Si el layout se entera de cada keystroke, ya perdiste.

Reglas de apoyo:

  • Validators y el borde CMS no viven en la field UI—la UI pinta; el schema, engine o adapter decide.
  • El stacking (A/B/C) se elige por app o CMS; no se copia de otro producto por costumbre.
  • Schema-driven cuando hay reuso o complejidad real; a mano cuando el form es mínimo o hiper-custom.

Límites de este texto

Anonimizado entre clientes y hosts. Sin schemas de campos propietarios, endpoints internos ni marcas. La narrativa más profunda de contratos multi-CMS pertenece al caso multi-CMS; este caso se queda en layering de forms y aislamiento de estado. Trabajo de cliente bajo NDA — se muestra la arquitectura y las decisiones, los detalles de producto quedan fuera por diseño.