TWA autoalojado en estado de "fallo suave": la interfaz de usuario a pantalla completa funciona, pero la delegación nativa falla

Estoy intentando que las notificaciones nativas funcionen para una TWA (Trusted Web Activity) de mi sitio de Discourse autoalojado y me he encontrado con un “fallo suave” muy extraño en la verificación de Digital Asset Link.

Aquí están los síntomas exactos:

  1. La aplicación se inicia y se ejecuta a pantalla completa sin la barra de URL, lo que sugiere que el enlace de activos está funcionando parcialmente.

  2. Sin embargo, aparece un mensaje toast de “Ejecutando en Chrome” en cada inicio.

  3. Lo más importante es que, cuando la PWA solicita permiso de notificación, muestra el mensaje de aviso estilo navegador, no el diálogo nativo de Android. Esto demuestra que la delegación de la API nativa está fallando.

Este comportamiento es consistente en todos los dispositivos de prueba (Android 12 y 13) y con los APK generados tanto por Bubblewrap como por PWABuilder de Microsoft.

Después de una depuración exhaustiva, he confirmado que toda mi configuración del lado del cliente y del servidor público parece ser perfecta. El problema parece ser un problema sutil del lado del servidor que solo afecta al validador de Android.

Esto es lo que ya he verificado:

  • Clave de firma y assetlinks.json: La huella digital SHA-256 de mi android.keystore es una coincidencia exacta del 100% con la huella digital en mi archivo /.well-known/assetlinks.json en vivo.

  • Respuesta del servidor: Mi servidor sirve la URL assetlinks.json con un estado 200 OK, el Content-Type correcto de application/json, y sin encabezados CORS bloqueantes cuando se verifica con herramientas web estándar.

  • Configuración de la aplicación Android: El AndroidManifest.xml generado es correcto y contiene el com.google.androidbrowserhelper.trusted.DelegationService estándar.

  • Configuración de administración de Discourse: Mi configuración de seguridad de administración para cors origins y Allowed crawler user agents están ambas vacías.

Dado este comportamiento específico de “fallo suave”, mi pregunta es:

¿Existe alguna regla Nginx conocida, configuración de firewall o un problema sutil de respuesta del servidor (como un ligero retraso o un encabezado no estándar) en la configuración predeterminada de Discourse autoalojado que cause que el validador de Android otorgue una “confianza parcial” (permitiendo la interfaz de usuario a pantalla completa) pero deniegue el nivel de confianza superior requerido para la delegación de API nativa?

He llegado al límite de lo que se puede diagnosticar desde el lado del cliente. Cualquier información sobre la configuración profunda del servidor sería muy apreciada.