Smoke test público y evidencia de release

La comprobación externa se ejecuta con scripts/run_public_smoke.py. Su objetivo es demostrar que una instancia publicada responde desde fuera de Azure, tolera el primer arranque y conserva un análisis sintético recuperable.

Configuración

Configura, únicamente en variables/secrets del entorno schemasafe-demo:

Nombre Tipo Uso
SCHEMASAFE_PUBLIC_URL variable origen HTTPS del backend publicado, sin ruta ni credenciales
SCHEMASAFE_PUBLIC_TOKEN secret del entorno schemasafe-demo token corto de rol analyst para public-demo y heterogeneous-age; nunca se entrega al frontend

El token nunca se escribe en el artifact. La URL se valida como origen HTTPS y el workflow no se ejecuta si falta cualquiera de los dos valores.

Para generarlo localmente, usa la clave que también se configura como SCHEMASAFE_AUTH_SIGNING_KEY en el entorno y ejecuta desde backend:

$env:AUTH_SIGNING_KEY_REF = "env:SCHEMASAFE_AUTH_SIGNING_KEY"
$env:SCHEMASAFE_AUTH_SIGNING_KEY = "<misma-clave-del-entorno>"
$env:PYTHONPATH = "."
python scripts/issue_token.py --subject public-reviewer --role analyst `
  --project public-demo --resource heterogeneous-age --minutes 1440

El comando convierte automáticamente el nombre corto del recurso en el claim RBAC public-demo:heterogeneous-age. No pegues la clave ni el token en el repositorio, logs o chats; guarda solamente el resultado como secret SCHEMASAFE_PUBLIC_TOKEN.

La imagen del backend incluye los fixtures sintéticos en /app/escenarios/fixtures. El resolvedor acepta esa ruta de imagen y la ruta del checkout local, de modo que el smoke puede ejecutar el mismo contrato en Azure y en desarrollo sin publicar credenciales ni bases NoSQL.

Qué verifica

El runner registra latencias y estados de /health, /api/v1/readiness, /api/v1/engines y /api/v1/operations. Luego envía una única propuesta sintética sobre mongodb/heterogeneous-age y consulta el reporte por su id para comprobar el read-after-write. La evidencia solo conserva campos operativos seleccionados; no incluye cuerpos completos, headers, tokens, contraseñas ni secretos.

El primer health y los reintentos de readiness disponen de una ventana de arranque en frío de 120 segundos. Si readiness no llega a ready, falla el workflow. El smoke no llama endpoints de escritura de los motores NoSQL: la propuesta usa el contrato de inspección y fixture-first del backend. El read-after-write demuestra persistencia observable por API; para afirmar que el proveedor físico es PostgreSQL se debe conservar además la configuración segura de CLOUD-05, porque ese dato no se expone al cliente público.

Ejecución manual

$env:SCHEMASAFE_PUBLIC_URL = 'https://<backend-publico>'
$env:SCHEMASAFE_PUBLIC_TOKEN = '<token-corto-de-demo>'
python scripts/run_public_smoke.py --output artifacts/public-smoke.json

En GitHub Actions, Public demo smoke se dispara manualmente o después de un despliegue público exitoso. Si falta la configuración, la corrida queda explícitamente bloqueada y no inventa una URL ni una evidencia. Cuando está configurada, un fallo devuelve código distinto de cero, publica el artifact aun en caso de error y bloquea la corrida de smoke que sirve como gate de release.

La evidencia local es temporal y no debe commitearse; el workflow la conserva como artifact con el id de la corrida, timestamps y latencias.