Conceptos, valor y escenarios típicos de clon — menos código.
Conceptos, valor y escenarios típicos de clon — menos código.
Preparing Ring content
Preparing Ring content
Preparing Ring content
Está hecho cuando: npm run dev sirve páginas, GET /api/health devuelve healthy (o ya corregiste AUTH_SECRET), un inicio de sesión de Auth.js crea una sesión y funciona un camino CRUD autenticado (entidades u oportunidades). El túnel en ready y la prueba de membresía con PaymentConductor son ampliados: no bloquean la personalización de marca del primer día.
Filtra con Fundador / Desarrollador en la barra lateral. Ejecuta esto después de la Instalación y las Migraciones. Las comprobaciones básicas son una pasada corta por el navegador. Los pagos necesitan el env del PSP + 004_payment_transactions antes de dar el checkout por bueno.
Primer éxito significa que el server.ts propio / la app Next sirve páginas, Auth.js v5 puede crear una sesión, DatabaseService lee y escribe sin fallos del adaptador y las rutas principales del marketplace cargan. No exige WayForPay, Stripe, PayPal, FCM ni conexión de billetera el primer día.
| Nivel | Qué debe funcionar | Suficiente para… |
|---|---|---|
| Básico | Página de inicio + /api/health + inicio de sesión con un proveedor + un camino CRUD | Personalizar la marca, invitar a testers |
| Ampliado | GET /api/tunnel/test → status: ready; UI de entidades + oportunidades | Demostrar tiempo real / descubrimiento |
| Pago opcional | Inicio de membresía → redirección de PaymentConductor o liquidación con crédito | Checkout en sandbox / ensayo de mejora de rol |
Usa el MCP de LegioX legiox-env-validator (o pide al agente con el prompt de abajo) antes de perseguir fallos de la UI. Informa de las variables de env que faltan. No modifica .env, no reinicia procesos ni llama a los PSP hasta que lo apruebes.
Prompt inicial:
Valida este clon para la prueba de primer éxito:
AUTH_SECRET,DB_BACKEND_MODE/DB_*de Postgres y, opcionalmente,WAYFORPAY_*/STRIPE_*/PAYPAL_*. Enumera las variables que faltan y la lista Básico frente a Pago opcional de/docs/getting-started/first-success. No escribas secretos ni reinicies el servidor hasta que yo lo apruebe.
Lista de entradas
.env.local a partir de env.local.template (o un secreto montado de k8s)http://localhost:3000 (o la URL del sitio que hayas configurado)Antes de hacer demos a las partes interesadas, recorre tú mismo el camino feliz del miembro:
Sin pantalla en blanco ni fallo del adaptador de base de datos en la terminal.
Google, Apple o Ring Mailer, el que hayas configurado (SMTP o Ethereal).
Demuestra las escrituras JSONB en Postgres y los controles por rol.
| Comprobación | ¿Superada? |
|---|---|
npm run dev arranca sin fallo del adaptador de base de datos | ☐ |
GET /api/health → healthy (o AUTH_SECRET corregido) | ☐ |
| El inicio de sesión se completa con un proveedor de Auth.js | ☐ |
| Crear/listar entidades o la lista de oportunidades funciona en la UI | ☐ |
GET /api/tunnel/test → status: ready | ☐ |
| Opcional: el inicio de membresía devuelve redirección / éxito con crédito | ☐ |
Sí. El primer éxito básico es autenticación + camino de datos. PaymentConductor es opcional hasta que hagas una demo de membresía de pago o del checkout de la tienda.
ready significa que SSE está en vivo?No. /api/tunnel/test confirma la configuración y la detección del proveedor. Los streams en vivo necesitan un cliente con sesión iniciada que llame a /api/tunnel/sse (o al proveedor que hayas configurado).
004_payment_transactions para el nivel Básico?No. Aplícala antes de la prueba de Pago opcional para que el libro contable pueda registrar las intenciones de membresía / tienda.
firebase-full puede superar la página de inicio + autenticación en un prototipo, pero la profundidad de PaymentConductor y las funciones de ERP/noticias esperan Postgres como base principal (k8s-postgres-fcm / supabase-fcm). Consulta Selección de base de datos.
degraded: ¿la app está caída?El proceso está en marcha. La falta de AUTH_SECRET (camino Postgres) o de variables críticas de Firebase degrada el estado. Define los secretos, reinicia y vuelve a lanzar el curl.
GET /api/wallet/balance devuelve 404 cuando aún no existe una fila de billetera. No es un fallo del nivel Básico. Crea o recarga la billetera mediante los flujos de billetera después de autenticarte.
Requisito previo: instalación y env antes de esta lista de prueba.
Requisito previo: esquema + 004_payment_transactions antes de la prueba de PaymentConductor.
En detalle: proveedores de Auth.js y forma de la sesión cuando el registro ya funciona.
Siguiente paso: rails, libro contable y webhooks cuando el inicio de membresía funcione.
Está hecho cuando: npm run dev sirve páginas, GET /api/health devuelve healthy (o ya corregiste AUTH_SECRET), un inicio de sesión de Auth.js crea una sesión y funciona un camino CRUD autenticado (entidades u oportunidades). El túnel en ready y la prueba de membresía con PaymentConductor son ampliados: no bloquean la personalización de marca del primer día.
Filtra con Fundador / Desarrollador en la barra lateral. Ejecuta esto después de la Instalación y las Migraciones. Las comprobaciones básicas son una pasada corta por el navegador. Los pagos necesitan el env del PSP + 004_payment_transactions antes de dar el checkout por bueno.
Primer éxito significa que el server.ts propio / la app Next sirve páginas, Auth.js v5 puede crear una sesión, DatabaseService lee y escribe sin fallos del adaptador y las rutas principales del marketplace cargan. No exige WayForPay, Stripe, PayPal, FCM ni conexión de billetera el primer día.
| Nivel | Qué debe funcionar | Suficiente para… |
|---|---|---|
| Básico | Página de inicio + /api/health + inicio de sesión con un proveedor + un camino CRUD | Personalizar la marca, invitar a testers |
| Ampliado | GET /api/tunnel/test → status: ready; UI de entidades + oportunidades | Demostrar tiempo real / descubrimiento |
| Pago opcional | Inicio de membresía → redirección de PaymentConductor o liquidación con crédito | Checkout en sandbox / ensayo de mejora de rol |
Usa el MCP de LegioX legiox-env-validator (o pide al agente con el prompt de abajo) antes de perseguir fallos de la UI. Informa de las variables de env que faltan. No modifica .env, no reinicia procesos ni llama a los PSP hasta que lo apruebes.
Prompt inicial:
Valida este clon para la prueba de primer éxito:
AUTH_SECRET,DB_BACKEND_MODE/DB_*de Postgres y, opcionalmente,WAYFORPAY_*/STRIPE_*/PAYPAL_*. Enumera las variables que faltan y la lista Básico frente a Pago opcional de/docs/getting-started/first-success. No escribas secretos ni reinicies el servidor hasta que yo lo apruebe.
Lista de entradas
.env.local a partir de env.local.template (o un secreto montado de k8s)http://localhost:3000 (o la URL del sitio que hayas configurado)Antes de hacer demos a las partes interesadas, recorre tú mismo el camino feliz del miembro:
Sin pantalla en blanco ni fallo del adaptador de base de datos en la terminal.
Google, Apple o Ring Mailer, el que hayas configurado (SMTP o Ethereal).
Demuestra las escrituras JSONB en Postgres y los controles por rol.
| Comprobación | ¿Superada? |
|---|---|
npm run dev arranca sin fallo del adaptador de base de datos | ☐ |
GET /api/health → healthy (o AUTH_SECRET corregido) | ☐ |
| El inicio de sesión se completa con un proveedor de Auth.js | ☐ |
| Crear/listar entidades o la lista de oportunidades funciona en la UI | ☐ |
GET /api/tunnel/test → status: ready | ☐ |
| Opcional: el inicio de membresía devuelve redirección / éxito con crédito | ☐ |
Sí. El primer éxito básico es autenticación + camino de datos. PaymentConductor es opcional hasta que hagas una demo de membresía de pago o del checkout de la tienda.
ready significa que SSE está en vivo?No. /api/tunnel/test confirma la configuración y la detección del proveedor. Los streams en vivo necesitan un cliente con sesión iniciada que llame a /api/tunnel/sse (o al proveedor que hayas configurado).
004_payment_transactions para el nivel Básico?No. Aplícala antes de la prueba de Pago opcional para que el libro contable pueda registrar las intenciones de membresía / tienda.
firebase-full puede superar la página de inicio + autenticación en un prototipo, pero la profundidad de PaymentConductor y las funciones de ERP/noticias esperan Postgres como base principal (k8s-postgres-fcm / supabase-fcm). Consulta Selección de base de datos.
degraded: ¿la app está caída?El proceso está en marcha. La falta de AUTH_SECRET (camino Postgres) o de variables críticas de Firebase degrada el estado. Define los secretos, reinicia y vuelve a lanzar el curl.
GET /api/wallet/balance devuelve 404 cuando aún no existe una fila de billetera. No es un fallo del nivel Básico. Crea o recarga la billetera mediante los flujos de billetera después de autenticarte.
Requisito previo: instalación y env antes de esta lista de prueba.
Requisito previo: esquema + 004_payment_transactions antes de la prueba de PaymentConductor.
En detalle: proveedores de Auth.js y forma de la sesión cuando el registro ya funciona.
Siguiente paso: rails, libro contable y webhooks cuando el inicio de membresía funcione.
Está hecho cuando: npm run dev sirve páginas, GET /api/health devuelve healthy (o ya corregiste AUTH_SECRET), un inicio de sesión de Auth.js crea una sesión y funciona un camino CRUD autenticado (entidades u oportunidades). El túnel en ready y la prueba de membresía con PaymentConductor son ampliados: no bloquean la personalización de marca del primer día.
Filtra con Fundador / Desarrollador en la barra lateral. Ejecuta esto después de la Instalación y las Migraciones. Las comprobaciones básicas son una pasada corta por el navegador. Los pagos necesitan el env del PSP + 004_payment_transactions antes de dar el checkout por bueno.
Primer éxito significa que el server.ts propio / la app Next sirve páginas, Auth.js v5 puede crear una sesión, DatabaseService lee y escribe sin fallos del adaptador y las rutas principales del marketplace cargan. No exige WayForPay, Stripe, PayPal, FCM ni conexión de billetera el primer día.
| Nivel | Qué debe funcionar | Suficiente para… |
|---|---|---|
| Básico | Página de inicio + /api/health + inicio de sesión con un proveedor + un camino CRUD | Personalizar la marca, invitar a testers |
| Ampliado | GET /api/tunnel/test → status: ready; UI de entidades + oportunidades | Demostrar tiempo real / descubrimiento |
| Pago opcional | Inicio de membresía → redirección de PaymentConductor o liquidación con crédito | Checkout en sandbox / ensayo de mejora de rol |
Usa el MCP de LegioX legiox-env-validator (o pide al agente con el prompt de abajo) antes de perseguir fallos de la UI. Informa de las variables de env que faltan. No modifica .env, no reinicia procesos ni llama a los PSP hasta que lo apruebes.
Prompt inicial:
Valida este clon para la prueba de primer éxito:
AUTH_SECRET,DB_BACKEND_MODE/DB_*de Postgres y, opcionalmente,WAYFORPAY_*/STRIPE_*/PAYPAL_*. Enumera las variables que faltan y la lista Básico frente a Pago opcional de/docs/getting-started/first-success. No escribas secretos ni reinicies el servidor hasta que yo lo apruebe.
Lista de entradas
.env.local a partir de env.local.template (o un secreto montado de k8s)http://localhost:3000 (o la URL del sitio que hayas configurado)Antes de hacer demos a las partes interesadas, recorre tú mismo el camino feliz del miembro:
Sin pantalla en blanco ni fallo del adaptador de base de datos en la terminal.
Google, Apple o Ring Mailer, el que hayas configurado (SMTP o Ethereal).
Demuestra las escrituras JSONB en Postgres y los controles por rol.
| Comprobación | ¿Superada? |
|---|---|
npm run dev arranca sin fallo del adaptador de base de datos | ☐ |
GET /api/health → healthy (o AUTH_SECRET corregido) | ☐ |
| El inicio de sesión se completa con un proveedor de Auth.js | ☐ |
| Crear/listar entidades o la lista de oportunidades funciona en la UI | ☐ |
GET /api/tunnel/test → status: ready | ☐ |
| Opcional: el inicio de membresía devuelve redirección / éxito con crédito | ☐ |
Sí. El primer éxito básico es autenticación + camino de datos. PaymentConductor es opcional hasta que hagas una demo de membresía de pago o del checkout de la tienda.
ready significa que SSE está en vivo?No. /api/tunnel/test confirma la configuración y la detección del proveedor. Los streams en vivo necesitan un cliente con sesión iniciada que llame a /api/tunnel/sse (o al proveedor que hayas configurado).
004_payment_transactions para el nivel Básico?No. Aplícala antes de la prueba de Pago opcional para que el libro contable pueda registrar las intenciones de membresía / tienda.
firebase-full puede superar la página de inicio + autenticación en un prototipo, pero la profundidad de PaymentConductor y las funciones de ERP/noticias esperan Postgres como base principal (k8s-postgres-fcm / supabase-fcm). Consulta Selección de base de datos.
degraded: ¿la app está caída?El proceso está en marcha. La falta de AUTH_SECRET (camino Postgres) o de variables críticas de Firebase degrada el estado. Define los secretos, reinicia y vuelve a lanzar el curl.
GET /api/wallet/balance devuelve 404 cuando aún no existe una fila de billetera. No es un fallo del nivel Básico. Crea o recarga la billetera mediante los flujos de billetera después de autenticarte.
Requisito previo: instalación y env antes de esta lista de prueba.
Requisito previo: esquema + 004_payment_transactions antes de la prueba de PaymentConductor.
En detalle: proveedores de Auth.js y forma de la sesión cuando el registro ya funciona.
Siguiente paso: rails, libro contable y webhooks cuando el inicio de membresía funcione.
Espera Next.js listo en http://localhost:3000. El script del paquete ejecuta node --import tsx server.ts. Con RING_DEPLOY_TARGET=self-hosted, el servidor propio puede registrar WSS nativo en el log.
Forma verificada (app/api/health/route.ts): status es healthy | degraded | unhealthy (no "ok"). services.database es postgresql o firebase. Si falta AUTH_SECRET → degraded y HTTP 503. HEAD devuelve 200 cuando el proceso está en marcha.
/: espera HTTP 200, sin pantalla en blanco ni fallo del adaptador en la terminal./login (puede aplicarse un prefijo de idioma: /en/login).auth.ts: Google OAuth, Apple, Ring Mailer (OTP / enlace mágico / correo + contraseña), Google One Tap o credenciales de billetera cripto. El árbol predeterminado no incluye GitHub/Discord./profile muestra los datos del usuario y se mantiene al recargar. Opcional: GET /api/auth/session con las cookies del navegador devuelve { user: { id, email, role, … } }./api/entities y /api/opportunities requieren sesión: un 401 sin cookies es lo esperado.
Después de iniciar sesión en el navegador:
/entities: la lista carga y el formulario de creación se envía (un visitante puede recibir 403 al escribir; usa una cuenta de prueba member/admin)./opportunities: la lista carga para tu rol.Comprobación opcional en Postgres:
Espera un recuento ≥ 1 después del primer inicio de sesión. No existe la ruta /api/test-db: usa psql o las API autenticadas.
Espera "ready" y una lista de proveedores de lib/tunnel/config. SSE en vivo: pestaña Network → /api/tunnel/sse después de iniciar sesión. Consulta Protocolo del túnel.
Solo después de que las Migraciones hayan aplicado 004_payment_transactions.sql y hayas definido el env del procesador a partir de env.local.template (WAYFORPAY_*, y/o STRIPE_*, y/o PAYPAL_*).
UPGRADEABLE_ROLES, no la compra de platform-admin)./membership → elige un nivel superior y un rail configurado (card → WayForPay/Stripe mediante PaymentConductor, paypal, o credit_balance si la billetera tiene saldo).initiateMembershipPayment (app/_actions/membership-payment.ts) llama a PaymentConductor.createCheckout({ purpose: 'membership_upgrade', … }) (o primero a SubscriptionConductor para algunos rails)./api/payments/wayforpay/webhook, /api/payments/stripe/webhook, /api/payments/paypal/webhook (getWebhookUrl en lib/payments/payment.config.ts).checkout.session.completed / la captura de PayPal, la UI llega a /membership/success o /membership/failure.No des el checkout de producción por válido hasta que la verificación HMAC/de firma y las URL de retorno coincidan con la URL pública de tu sitio. En detalle: PaymentConductor.
Cuota de sandbox → PaymentConductor → webhook. Solo cuando el env de pagos esté definido.
Autenticación + un flujo CRUD sin notificaciones push ni billetera sigue siendo un clon de desarrollo válido. Conecta FCM y PaymentConductor antes de prometer membresía de pago o checkout de tienda (Entorno).
DB_* / DB_BACKEND_MODE en Requisitos previos.AUTH_SECRET y URI de redirección de OAuth (http://localhost:3000/api/auth/callback/google).WAYFORPAY_* / Stripe / PayPal antes de reintentar.| Scripts | npm run type-check, npm run build (la build ejecuta type-check) |
La detección de Postgres de la ruta de salud usa DATABASE_BACKEND=postgresql o DB_HOST / POSTGRES_HOST, no solo la cadena DB_BACKEND_MODE. Mantén ambas familias alineadas con env.local.template para que services.database indique postgresql cuando lo esperas.
Mismo flujo: correcciones de autenticación y base de datos cuando una fila de la lista sigue en rojo.
Siguiente paso: exploración de funciones cuando las comprobaciones básicas estén en verde.
Espera Next.js listo en http://localhost:3000. El script del paquete ejecuta node --import tsx server.ts. Con RING_DEPLOY_TARGET=self-hosted, el servidor propio puede registrar WSS nativo en el log.
Forma verificada (app/api/health/route.ts): status es healthy | degraded | unhealthy (no "ok"). services.database es postgresql o firebase. Si falta AUTH_SECRET → degraded y HTTP 503. HEAD devuelve 200 cuando el proceso está en marcha.
/: espera HTTP 200, sin pantalla en blanco ni fallo del adaptador en la terminal./login (puede aplicarse un prefijo de idioma: /en/login).auth.ts: Google OAuth, Apple, Ring Mailer (OTP / enlace mágico / correo + contraseña), Google One Tap o credenciales de billetera cripto. El árbol predeterminado no incluye GitHub/Discord./profile muestra los datos del usuario y se mantiene al recargar. Opcional: GET /api/auth/session con las cookies del navegador devuelve { user: { id, email, role, … } }./api/entities y /api/opportunities requieren sesión: un 401 sin cookies es lo esperado.
Después de iniciar sesión en el navegador:
/entities: la lista carga y el formulario de creación se envía (un visitante puede recibir 403 al escribir; usa una cuenta de prueba member/admin)./opportunities: la lista carga para tu rol.Comprobación opcional en Postgres:
Espera un recuento ≥ 1 después del primer inicio de sesión. No existe la ruta /api/test-db: usa psql o las API autenticadas.
Espera "ready" y una lista de proveedores de lib/tunnel/config. SSE en vivo: pestaña Network → /api/tunnel/sse después de iniciar sesión. Consulta Protocolo del túnel.
Solo después de que las Migraciones hayan aplicado 004_payment_transactions.sql y hayas definido el env del procesador a partir de env.local.template (WAYFORPAY_*, y/o STRIPE_*, y/o PAYPAL_*).
UPGRADEABLE_ROLES, no la compra de platform-admin)./membership → elige un nivel superior y un rail configurado (card → WayForPay/Stripe mediante PaymentConductor, paypal, o credit_balance si la billetera tiene saldo).initiateMembershipPayment (app/_actions/membership-payment.ts) llama a PaymentConductor.createCheckout({ purpose: 'membership_upgrade', … }) (o primero a SubscriptionConductor para algunos rails)./api/payments/wayforpay/webhook, /api/payments/stripe/webhook, /api/payments/paypal/webhook (getWebhookUrl en lib/payments/payment.config.ts).checkout.session.completed / la captura de PayPal, la UI llega a /membership/success o /membership/failure.No des el checkout de producción por válido hasta que la verificación HMAC/de firma y las URL de retorno coincidan con la URL pública de tu sitio. En detalle: PaymentConductor.
Cuota de sandbox → PaymentConductor → webhook. Solo cuando el env de pagos esté definido.
Autenticación + un flujo CRUD sin notificaciones push ni billetera sigue siendo un clon de desarrollo válido. Conecta FCM y PaymentConductor antes de prometer membresía de pago o checkout de tienda (Entorno).
DB_* / DB_BACKEND_MODE en Requisitos previos.AUTH_SECRET y URI de redirección de OAuth (http://localhost:3000/api/auth/callback/google).WAYFORPAY_* / Stripe / PayPal antes de reintentar.| Scripts | npm run type-check, npm run build (la build ejecuta type-check) |
La detección de Postgres de la ruta de salud usa DATABASE_BACKEND=postgresql o DB_HOST / POSTGRES_HOST, no solo la cadena DB_BACKEND_MODE. Mantén ambas familias alineadas con env.local.template para que services.database indique postgresql cuando lo esperas.
Mismo flujo: correcciones de autenticación y base de datos cuando una fila de la lista sigue en rojo.
Siguiente paso: exploración de funciones cuando las comprobaciones básicas estén en verde.
Espera Next.js listo en http://localhost:3000. El script del paquete ejecuta node --import tsx server.ts. Con RING_DEPLOY_TARGET=self-hosted, el servidor propio puede registrar WSS nativo en el log.
Forma verificada (app/api/health/route.ts): status es healthy | degraded | unhealthy (no "ok"). services.database es postgresql o firebase. Si falta AUTH_SECRET → degraded y HTTP 503. HEAD devuelve 200 cuando el proceso está en marcha.
/: espera HTTP 200, sin pantalla en blanco ni fallo del adaptador en la terminal./login (puede aplicarse un prefijo de idioma: /en/login).auth.ts: Google OAuth, Apple, Ring Mailer (OTP / enlace mágico / correo + contraseña), Google One Tap o credenciales de billetera cripto. El árbol predeterminado no incluye GitHub/Discord./profile muestra los datos del usuario y se mantiene al recargar. Opcional: GET /api/auth/session con las cookies del navegador devuelve { user: { id, email, role, … } }./api/entities y /api/opportunities requieren sesión: un 401 sin cookies es lo esperado.
Después de iniciar sesión en el navegador:
/entities: la lista carga y el formulario de creación se envía (un visitante puede recibir 403 al escribir; usa una cuenta de prueba member/admin)./opportunities: la lista carga para tu rol.Comprobación opcional en Postgres:
Espera un recuento ≥ 1 después del primer inicio de sesión. No existe la ruta /api/test-db: usa psql o las API autenticadas.
Espera "ready" y una lista de proveedores de lib/tunnel/config. SSE en vivo: pestaña Network → /api/tunnel/sse después de iniciar sesión. Consulta Protocolo del túnel.
Solo después de que las Migraciones hayan aplicado 004_payment_transactions.sql y hayas definido el env del procesador a partir de env.local.template (WAYFORPAY_*, y/o STRIPE_*, y/o PAYPAL_*).
UPGRADEABLE_ROLES, no la compra de platform-admin)./membership → elige un nivel superior y un rail configurado (card → WayForPay/Stripe mediante PaymentConductor, paypal, o credit_balance si la billetera tiene saldo).initiateMembershipPayment (app/_actions/membership-payment.ts) llama a PaymentConductor.createCheckout({ purpose: 'membership_upgrade', … }) (o primero a SubscriptionConductor para algunos rails)./api/payments/wayforpay/webhook, /api/payments/stripe/webhook, /api/payments/paypal/webhook (getWebhookUrl en lib/payments/payment.config.ts).checkout.session.completed / la captura de PayPal, la UI llega a /membership/success o /membership/failure.No des el checkout de producción por válido hasta que la verificación HMAC/de firma y las URL de retorno coincidan con la URL pública de tu sitio. En detalle: PaymentConductor.
Cuota de sandbox → PaymentConductor → webhook. Solo cuando el env de pagos esté definido.
Autenticación + un flujo CRUD sin notificaciones push ni billetera sigue siendo un clon de desarrollo válido. Conecta FCM y PaymentConductor antes de prometer membresía de pago o checkout de tienda (Entorno).
DB_* / DB_BACKEND_MODE en Requisitos previos.AUTH_SECRET y URI de redirección de OAuth (http://localhost:3000/api/auth/callback/google).WAYFORPAY_* / Stripe / PayPal antes de reintentar.| Scripts | npm run type-check, npm run build (la build ejecuta type-check) |
La detección de Postgres de la ruta de salud usa DATABASE_BACKEND=postgresql o DB_HOST / POSTGRES_HOST, no solo la cadena DB_BACKEND_MODE. Mantén ambas familias alineadas con env.local.template para que services.database indique postgresql cuando lo esperas.
Mismo flujo: correcciones de autenticación y base de datos cuando una fila de la lista sigue en rojo.