Signmethod · Plan de pruebas de producción

Informe general de evidencias

Consulta centralizada de las validaciones, incidencias, capturas y artefactos técnicos conservados en docs/evidencias.

169archivos fuente
77bloques de evidencia
100evidencias visuales
49bloques con KO
77 bloques visibles
No hay evidencias que coincidan con la búsqueda y el filtro seleccionados.

ADM

Administración

1 bloque de evidencia
ADM-01 OK

Evidencia ADM-01 y ADM-02: perfil y contraseña

Editar los datos permitidos de Mi perfil.

Resultado esperado: Se guardan y persisten tras recargar.

2 archivos fuente 1 evidencia visual

Evidencias visuales

01ADM-01-ADM-02-PERFIL-CONTRASENA-2026-08-28.svgOriginal

Informe de evidencia

Evidencia ADM-01 y ADM-02: perfil y contraseña

Fecha de comprobación: 28/08/2026 Entorno: producción (https://signmethod.com/) Sesión: perfil owner de la empresa pepe

Alcance y seguridad

La comprobación se realizó sin registrar contraseñas, tokens, cookies ni códigos de sesión. El titular modificó personalmente los datos de perfil y la contraseña; las evidencias muestran únicamente estados y confirmaciones, nunca la clave. Las credenciales no deben compartirse por chat, capturas, Git ni documentos de prueba.

ADM-01 — Editar Mi perfil

Comprobaciones realizadas
  • Se abrió Información de perfilMi perfilInformación personal.
  • La pantalla expone como editables Nombre completo, Correo electrónico y Teléfono.
  • Cargo aparece como solo lectura y lo asigna el sistema.
  • En una sesión owner, Empresa y NIF/CIF aparecen editables.
  • Un correo sintético sin formato válido fue rechazado por la validación nativa del campo (typeMismatch: true).
  • Un NIF/CIF sintético inválido no cerró el formulario ni sustituyó el dato original.
  • Como comprobación positiva se modificó el nombre completo a Joel López Gutierrez y se guardó.
  • Después de recargar y volver a abrir Mi perfil, el nombre modificado continuaba visible.
  • Durante la carga de Mi perfil apareció el mensaje técnico Failed to fetch.
Revisión técnica
  • submitProfileEditor valida el correo y el NIF/CIF.
  • Nombre, correo y teléfono se almacenan mediante saveProfileOverride en la clave local signmethod.profileOverrides.v1.
  • El propio mensaje de éxito indica Perfil actualizado y guardado en este navegador..
  • Empresa y NIF/CIF, cuando los cambia el owner, se envían mediante POST /companies.

El criterio de ADM-01 exige persistencia tras recargar y queda demostrado con las capturas compartidas. La revisión técnica indica que los datos personales se guardan localmente en el navegador, por lo que la sincronización entre navegadores o dispositivos no queda demostrada y, si se considera un requisito funcional, debe cubrirse mediante una prueba adicional.

Comprobaciones adicionales recomendadas
  1. Anotar los valores originales antes de empezar.
  2. Restaurar el nombre original si el valor utilizado solo era de QA.
  3. Cerrar sesión, entrar de nuevo y comprobar otra vez.
  4. Abrir la cuenta en otro navegador o dispositivo si se requiere sincronización de perfil. Si el dato desaparece, registrar un defecto de persistencia porque el código utiliza localStorage.
  5. Mantener las capturas censuradas cuando contengan datos personales.

ADM-02 — Cambiar contraseña

Comprobaciones realizadas
  • Se abrió Mi perfilPrivacidad y seguridadCambiar contraseña.
  • El diálogo contiene los tres campos esperados: antigua, nueva y confirmación.
  • La interfaz informa de un mínimo de 10 caracteres y prohíbe espacios, < y >.
  • El código valida campos obligatorios, coincidencia, longitud y caracteres prohibidos antes de ejecutar updatePassword de AWS Amplify.
  • La sección de seguridad mostró Failed to fetch, por lo que debe comprobarse qué petición falla y presentar un mensaje comprensible.
  • El titular cambió personalmente la contraseña y la aplicación mostró Contraseña cambiada correctamente..
  • Los campos aparecen vacíos en la captura de confirmación y la contraseña no quedó expuesta.
  • El titular confirmó que la nueva contraseña es la que permite acceder a la cuenta.
  • La captura del diálogo muestra un defecto visual no bloqueante: los tres botones de mostrar/ocultar contraseña están mal posicionados, aparecen dentro de cajas grises que no siguen el estilo de los demás botones de acción y no mantienen una alineación uniforme con los campos.
Comprobaciones adicionales recomendadas
  1. Guardar la contraseña nueva únicamente en un gestor de contraseñas; no copiarla al chat ni al repositorio.
  2. En una siguiente rotación, conservar evidencia separada de los rechazos por campos vacíos, confirmación distinta, menos de 10 caracteres, espacios y caracteres < o >.
  3. Verificar que la contraseña anterior deja de ser válida, si esta comprobación puede hacerse sin bloquear la cuenta.
  4. Investigar el origen de Failed to fetch y sustituirlo por un mensaje funcional en español.
  5. Corregir INC-002: reutilizar un único componente de campo de contraseña, centrar verticalmente el botón de visibilidad, aplicar una separación interior constante y unificar tamaño, borde, color, hover, foco visible y etiqueta accesible con el sistema de diseño.
  6. Repetir la revisión visual en escritorio, móvil, zoom 200 % y navegación por teclado.

Imagen: Resumen visual de las comprobaciones

Resultado

  • ADM-01: OK. El cambio de nombre se guardó y permaneció visible después de recargar y volver a abrir Mi perfil.
  • ADM-02: OK. La aplicación confirmó el cambio y el titular comprobó que la nueva contraseña permite acceder a la cuenta.

Observaciones no bloqueantes: Mi perfil continúa mostrando Failed to fetch y los controles de visibilidad de contraseña presentan el defecto visual registrado como INC-002; ambos deben investigarse por separado.

AUT

Autenticación

2 bloques de evidencia
AUT-01 KO

Ejecutar npx playwright test contra el build previo.

Ejecutar npx playwright test contra el build previo.

Resultado esperado: Todas las pruebas se superan.

1 archivo fuente 0 evidencias visuales

Archivos asociados

AUT-01-playwright-report.zipZIP · 126.3 MB Abrir original
AUT-02 KO

Evidencia AUT-02: smoke público contra producción

Ejecutar $env:PLAYWRIGHT BASE URL='https://signmethod.com'; npx playwright test e2e/public.spec.ts .

Resultado esperado: El smoke público pasa sin escrituras AWS.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

Evidencia AUT-02: smoke público contra producción

Ejecución

  • Fecha: 28/08/2026.
  • Destino: https://signmethod.com.
  • Suite: e2e/public.spec.ts.
  • Navegadores: Chromium, Firefox, Edge y Safari/WebKit.
  • Seguridad: PLAYWRIGHT_ALLOW_AWS_WRITES no definida; la guarda de red bloqueó escrituras AWS.
  • Trazas: PLAYWRIGHT_TRACE=on.
  • Resultado: 76 pruebas ejecutadas, 19 superadas y 57 fallidas.

Comando reproducible:

powershell
$env:PLAYWRIGHT_BASE_URL='https://signmethod.com'
$env:PLAYWRIGHT_TRACE='on'
Remove-Item Env:PLAYWRIGHT_ALLOW_AWS_WRITES -ErrorAction SilentlyContinue
npx playwright test e2e/public.spec.ts

Inventario de la evidencia completa

  • Archivo: AUT-02-trazas-y-fallos-2026-08-28.zip.
  • Tamaño: 937.696.090 bytes (aproximadamente 894,26 MiB).
  • SHA-256: 268C30EC5D648D74531746C99D4E37B9B44BA29F72751C1A1EC2B96FEF4307FD.
  • Contenido: 57 archivos trace.zip y 57 archivos error-context.md; 114 archivos en total.
  • Ubicación local de trabajo: C:\Users\lolpj\AppData\Local\Temp\AUT-02-trazas-y-fallos-2026-08-28.zip.

El ZIP completo no está versionado en el repositorio debido a su tamaño. Debe conservarse en un almacenamiento de evidencias o incorporarse mediante Git LFS después de confirmar la cuota disponible. Cada traza puede abrirse con:

powershell
npx playwright show-trace ruta\al\trace.zip

Causas observadas en las trazas

GrupoFallosEvidencia observadaDiagnóstico
Navegación pública16Cuatro escenarios fallan en los cuatro navegadores esperando getByRole('button', { name: /menú/i }) hasta agotar 45 segundos o sin encontrarlo visible.El helper no encuentra visible el elemento esperado en #site-nav y usa como alternativa un botón de menú que la versión publicada no expone con ese rol/nombre. Hay divergencia entre la navegación publicada y los selectores de la prueba.
Alta pública16Cuatro escenarios fallan en los cuatro navegadores porque getByRole('button', { name: 'Crear cuenta' }) encuentra dos elementos: el botón de la cabecera y #altaBoton.El selector de openRegister es ambiguo y viola el modo estricto de Playwright. Es un defecto de automatización, no prueba por sí solo un defecto funcional del alta.
Acuerdos y firma con API simulada16En cuatro escenarios por navegador no aparecen firmante.qa@example.com, Solicitud QA.pdf, el mensaje de token inexistente o el botón Firmar.Los mocks y las expectativas ya no coinciden con la ruta, petición o modelo de respuesta consumido por la versión publicada. Debe verificarse el contrato real antes de decidir si se corrige la aplicación o la prueba.
Logotipo de la landing4En los cuatro navegadores no resulta visible getByRole('link', { name: 'Signmethod' }).La semántica accesible o el nombre del enlace del logotipo no coincide con lo esperado por la prueba.
Accesibilidad táctil móvil4La comprobación detecta los enlaces asistente@softradis.com y +34 661 51 51 51 con una altura aproximada de 18,89 px, inferior al mínimo de 32 px exigido por la suite.La interfaz publicada no cumple el criterio táctil definido por la prueba para esos enlaces.
Firefox aislado1permite saltar del login al registro publico termina por timeout global de 45 segundos en Firefox sin una aserción final concluyente.Debe repetirse de forma aislada con traza para diferenciar inestabilidad del navegador, problema de carga o fallo funcional.

Total clasificado: 57 de 57 fallos.

Acciones para completar AUT-02 al 100 %

  1. Confirmar con producto el comportamiento y la estructura accesible aprobados de la landing, navegación, alta y firma pública; no adaptar expectativas a un comportamiento incorrecto.
  2. Corregir openRegister para seleccionar de forma inequívoca el botón de cabecera que abre el diálogo, por ejemplo limitándolo a header, y mantener las acciones posteriores limitadas al diálogo.
  3. Corregir openPublicNavItem para localizar primero la navegación de escritorio realmente visible y usar el botón móvil solo en un viewport móvil; añadir un nombre accesible estable al botón si la aplicación carece de él.
  4. Alinear mockPublicAgreement, mockMissingPublicAgreement y mockPublicSignRequest con el endpoint, método, parámetros y esquema que consume actualmente producción. Comprobar en la traza que la petición es interceptada y que ninguna llamada simulada alcanza AWS.
  5. Decidir si el logotipo debe ser un enlace con nombre accesible Signmethod. Si es el contrato aprobado, corregir el HTML/ARIA; si cambió deliberadamente, actualizar el selector con una expectativa accesible equivalente.
  6. Aumentar a un mínimo de 32 px el área interactiva de los enlaces de correo y teléfono, sin limitarse a aumentar el tamaño visual del texto.
  7. Repetir en Firefox únicamente el escenario del salto de login a registro, con PLAYWRIGHT_TRACE=on, hasta obtener una causa concluyente y estable.
  8. Ejecutar primero cada grupo corregido en Chromium, Firefox, Edge y WebKit; después repetir la suite completa contra https://signmethod.com con las escrituras AWS desactivadas.
  9. Exigir 76 de 76 pruebas superadas, conservar el nuevo reporte y sus trazas, verificar el ZIP con SHA-256 y sustituir esta evidencia de fallo por la evidencia satisfactoria.
  10. Cambiar AUT-02 a OK únicamente cuando se cumpla el punto anterior. Hasta entonces el estado correcto es KO.

FIR

Firma de acuerdos

22 bloques de evidencia
FIR-01 OK

FIR-01 · Borrador persistente de acuerdo

Crear borrador con título, descripción, plazo, PDF y Pau Dengra.

Resultado esperado: Persiste después de cerrar y recargar.

1 archivo fuente 7 evidencias visuales

Evidencias visuales

01FIR-01-BORRADOR-PERSISTENTE-2026-09-01.html · FIR-01-01-modal-inicial-2026-09-01T08-44-31-643Z.pngOriginal
02FIR-01-BORRADOR-PERSISTENTE-2026-09-01.html · FIR-01-02-informacion-2026-09-01T08-44-31-643Z.pngOriginal
03FIR-01-BORRADOR-PERSISTENTE-2026-09-01.html · FIR-01-03-documento-2026-09-01T08-44-31-643Z.pngOriginal
04FIR-01-BORRADOR-PERSISTENTE-2026-09-01.html · FIR-01-04-pau-dengra-2026-09-01T08-44-31-643Z.pngOriginal
05FIR-01-BORRADOR-PERSISTENTE-2026-09-01.html · FIR-01-05-borrador-guardado-2026-09-01T08-44-31-643Z.pngOriginal
06FIR-01-BORRADOR-PERSISTENTE-2026-09-01.html · FIR-01-06-persistente-tras-recarga-2026-09-01T08-44-31-643Z.pngOriginal
07FIR-01-BORRADOR-PERSISTENTE-2026-09-01.html · FIR-01-07-borrador-reabierto-con-pau-2026-09-01T08-44-31-643Z.pngOriginal

Archivos asociados

FIR-01-BORRADOR-PERSISTENTE-2026-09-01.htmlHTML · 659.2 KB Abrir original
FIR-02 KO

FIR-02 · Edición y eliminación de borrador independiente

Editar y eliminar un borrador independiente.

Resultado esperado: No afecta a otros acuerdos.

7 archivos fuente 4 evidencias visuales

Evidencias visuales

01FIR-02-01-borrador-independiente-2026-09-01T08-52-09-687Z.pngOriginal
02FIR-02-02-borrador-editado-2026-09-01T08-52-09-687Z.pngOriginal
03FIR-02-03-edicion-guardada-2026-09-01T08-52-09-687Z.pngOriginal
04FIR-02-04-estado-tras-eliminacion-no-aislada-2026-09-01T08-53-59-720Z.pngOriginal

Informe de evidencia

FIR-02 - Edicion y eliminacion de borrador independiente

Prueba ejecutada el 01/09/2026 contra produccion (https://signmethod.com) con Playwright y sesion autenticada de Joel Lopez.

Datos usados

  • Borrador de partida: QA FIR-01 borrador 2026-09-01T08-44-31-643Z.
  • Borrador de control existente: prueba.
  • Titulo editado: QA FIR-02 editado 2026-09-01T08-52-09-687Z.

Flujo observado

  • Al abrir Enviar acuerdo > Borradores, se veian dos borradores: QA FIR-01 borrador 2026-09-01T08-44-31-643Z y prueba.
  • Se abrio el borrador QA y se modificaron titulo y descripcion.
  • Tras Guardar y salir, aparecio QA FIR-02 editado 2026-09-01T08-52-09-687Z, pero el listado mostro 0 documentos para ese borrador aunque el borrador original tenia 1 documento.
  • Al ejecutar la eliminacion, el listado acabo en Borradores 0; el borrador de control prueba tambien desaparecio.

Evaluacion

El resultado esperado era que la edicion y eliminacion de un borrador independiente no afectara a otros acuerdos. No se cumple: la edicion pierde el documento del borrador y la eliminacion deja vacio el listado, retirando tambien el borrador de control.

Evidencias

  • FIR-02-01-borrador-independiente-2026-09-01T08-52-09-687Z.png
  • FIR-02-02-borrador-editado-2026-09-01T08-52-09-687Z.png
  • FIR-02-03-edicion-guardada-2026-09-01T08-52-09-687Z.png
  • FIR-02-04-estado-tras-eliminacion-no-aislada-2026-09-01T08-53-59-720Z.png

Veredicto

FIR-02: KO. Vease INC-021.

Archivos asociados

FIR-02-EDICION-ELIMINACION-BORRADOR-2026-09-01.htmlHTML · 501.1 KB Abrir original
FIR-02-OBSERVACION-PLAN-PRUEBAS.htmlHTML · 3.9 KB Abrir original
FIR-03 KO

FIR-03 · Varios PDF y destinatarios ordenados

Crear acuerdo con varios PDF y destinatarios ordenados.

Resultado esperado: Muestra todos los elementos y el orden correcto.

7 archivos fuente 5 evidencias visuales

Evidencias visuales

01FIR-03-01-informacion-2026-09-01T08-53-59-720Z.pngOriginal
02FIR-03-02-varios-pdf-2026-09-01T08-53-59-720Z.pngOriginal
03FIR-03-03-destinatarios-ordenados-2026-09-01T08-53-59-720Z.pngOriginal
04FIR-03-04-mensaje-2026-09-01T08-53-59-720Z.pngOriginal
05FIR-03-07-segundo-pdf-anadido-2026-09-01T08-53-59-720Z.pngOriginal

Informe de evidencia

FIR-03 - Varios PDF y destinatarios ordenados

Prueba ejecutada el 01/09/2026 contra produccion (https://signmethod.com) con Playwright y sesion autenticada de Joel Lopez.

Datos usados

  • Acuerdo QA: QA FIR-03 acuerdo principal 2026-09-01T08-53-59-720Z.
  • PDF previstos:
  • fir-03-contrato-qa.pdf
  • fir-03-anexo-qa.pdf
  • Destinatarios previstos en modo secuencial:
  • 1. Pau Dengra (pau.dengra@softradis.com)
  • 2. Joel Lopez QA (joel.lopez@softradis.com)

Flujo observado

  • Se completo titulo, descripcion y plazo.
  • Se intento cargar dos PDF en el paso Documentos; al avanzar al resumen, solo aparecio 1 documento y se mostro unicamente fir-03-contrato-qa.pdf.
  • En un segundo intento sobre el borrador auto-guardado, se anadio fir-03-anexo-qa.pdf y el paso Documentos llego a mostrar ese archivo.
  • Al volver a Revisar y enviar, Playwright volvio a observar 1 documento en el resumen y no aparecio el conjunto completo de PDF previsto.
  • Los destinatarios se introdujeron en modo Secuencial; la pantalla de participantes muestra los indices 1 y 2, pero el resumen observado en el fallo no mantuvo la numeracion visible en todos los casos.
  • No se pulso Enviar; no se generaron correos para esta prueba.

Evaluacion

El resultado esperado era mostrar todos los elementos y el orden correcto. No se cumple porque el flujo no conserva o no muestra todos los PDF en el resumen final. La parte de destinatarios queda parcialmente validada en la pantalla de participantes, pero el caso completo debe mantenerse en KO hasta que el resumen y el borrador reflejen todos los documentos y el orden de firma de forma estable.

Evidencias

  • FIR-03-01-informacion-2026-09-01T08-53-59-720Z.png
  • FIR-03-02-varios-pdf-2026-09-01T08-53-59-720Z.png
  • FIR-03-03-destinatarios-ordenados-2026-09-01T08-53-59-720Z.png
  • FIR-03-04-mensaje-2026-09-01T08-53-59-720Z.png
  • FIR-03-07-segundo-pdf-anadido-2026-09-01T08-53-59-720Z.png

Veredicto

FIR-03: KO. Vease INC-022.

Archivos asociados

FIR-03-VARIOS-PDF-DESTINATARIOS-2026-09-01.htmlHTML · 598.0 KB Abrir original
FIR-04 OK

FIR-04 - Envio del acuerdo principal

Enviar el acuerdo principal.

Resultado esperado: Se crea una vez con estado pendiente.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

FIR-04 - Envio del acuerdo principal

Resultado

OK

La captura compartida por Joel Lopez el 01/09/2026 sirve como evidencia de produccion para la prueba FIR-04.

Evidencia observada

  • Entorno: https://signmethod.com
  • Vista: modal Acuerdos
  • Filtro activo: Pendientes (2)
  • Acuerdo validado: Prueba Pau
  • Descripcion: Prueba de envio de acuerdo FIR-04
  • Fecha de vencimiento: 08/09/2026
  • Estado mostrado: Enviado
  • Destinatarios enviados: 1
  • Firmados: 0
  • Accion disponible: Ver acuerdo

Evaluacion

El acuerdo principal aparece en el listado de pendientes de produccion con un unico registro visible para Prueba Pau, un destinatario enviado y ningun firmante completado. Esto cumple el criterio esperado de FIR-04: el acuerdo se crea una vez y queda pendiente de firma.

La segunda fila visible, prueba, corresponde a otro acuerdo y no afecta a la validacion de Prueba Pau.

Limitaciones

No se conserva una traza Playwright ni una captura local versionada para este punto; la evidencia aceptada es la captura compartida en el chat por el solicitante.

FIR-05 KO

FIR-05 — Recepción y revisión del correo de firma

Recibir y revisar el correo.

Resultado esperado: Destinatario, marca y enlace HTTPS son correctos.

2 archivos fuente 1 evidencia visual

Evidencias visuales

01FIR-05-panel-signmethod-playwright-2026-08-28.pngOriginal

Informe de evidencia

FIR-05 — Recepción y revisión del correo de firma

Fecha de validación: 28/08/2026 Responsable: Pau Dengra Resultado: KO

Correo revisado

  • Fecha de recepción: 20/08/2026 a las 09:02.
  • Remitente: no-reply@signmethod.com.
  • Destinatario: dengrapau@gmail.com.
  • Asunto: Prueba firmar acuerdo.
  • Entrega mostrada por Gmail: enviada directamente al destinatario y cifrada mediante TLS durante el transporte.

Presentación visual

El correo presenta correctamente:

  • Logotipo e identidad visual de SignMethod.
  • Etiqueta Firma requerida.
  • Encabezado Tienes un documento pendiente de firma.
  • Saludo a Pau Dengra.
  • Nombre del acuerdo, mensaje y relación de documentos.
  • Botón visible Firmar acuerdo.

La maquetación es legible y coherente con la marca.

Validación segura del enlace

El destino del botón se inspeccionó desde el DOM mediante OpenClaw, sin pulsarlo. Solo se conservaron los componentes no secretos:

text
protocol: http:
host: signmethod:8081
pathname: /
hasQuery: true

La cadena completa y sus parámetros no se mostraron ni se guardaron, ya que pueden contener un token de firma.

Conclusión

El destinatario, remitente y marca son correctos, pero el enlace no cumple el requisito HTTPS ni utiliza el dominio público de producción. http://signmethod:8081/ parece un origen interno de desarrollo o contenedor y no debe aparecer en un correo real.

FIR-05 queda en KO e INC-019 en severidad alta. Debe corregirse la URL base pública, enviar un correo nuevo y repetir FIR-05 antes de abrir el enlace en FIR-06.

FIR-06 OK

FIR-06 — Apertura del enlace sin sesión

Abrir el enlace sin sesión, en ventana privada.

Resultado esperado: Solo muestra el acuerdo destinado a Pau Dengra.

6 archivos fuente 4 evidencias visuales

Evidencias visuales

01FIR-06-correo-origen-playwright-2026-08-28.pngOriginal
02FIR-06-correo-origen-playwright-2026-09-01.pngOriginal
03FIR-06-enlace-sin-sesion-playwright-2026-08-28.pngOriginal
04FIR-06-enlace-sin-sesion-playwright-2026-09-01.pngOriginal

Informe de evidencia

FIR-06 — Apertura del enlace sin sesión

Fecha de ejecución: 28/08/2026 Responsable: Pau Dengra Estado: BLOQUEADA

Método

La prueba se automatizó con Playwright:

  1. Se abrió Gmail en un perfil QA persistente y autenticado por el usuario.
  2. Se buscaron mensajes procedentes de no-reply@signmethod.com.
  3. Se abrió un correo de solicitud de firma y se obtuvo en memoria el destino de Firmar acuerdo.
  4. No se imprimió ni guardó la URL completa ni sus parámetros.
  5. Se creó un contexto Playwright nuevo, sin cookies, almacenamiento ni sesión.
  6. Se abrió el enlace y se eligió Firmar sin iniciar sesión.

Datos censurados del enlace

text
protocol: http:
host: signmethod
pathname: /
hasQuery: true
hasFragment: false

Resultado observado

  • La apertura sin sesión fue posible.
  • La página mostró Visualización del acuerdo.
  • Solo se identificó al destinatario pau.dengra@softradis.com.
  • No se mostraron datos de otros destinatarios.
  • El acuerdo y los documentos no se cargaron.
  • En su lugar apareció: This legacy link is no longer valid. Request a new secure signing link.

Evidencias

  • FIR-06-correo-origen-playwright-2026-08-28.png: correo desde el que se obtuvo el enlace.
  • FIR-06-enlace-sin-sesion-playwright-2026-08-28.png: resultado en el contexto privado sin sesión.
  • Automatización reproducible: scripts/qa-fir06-playwright.mjs.

Conclusión

FIR-06 no puede calificarse como OK o KO respecto al aislamiento del acuerdo porque el enlace heredado no permite acceder al contenido que debe evaluarse. Queda BLOQUEADA por INC-019.

Para continuar se debe corregir la URL pública del correo, generar una solicitud nueva con enlace HTTPS y repetir la apertura en un contexto limpio antes de revisar los datos del acuerdo.

FIR-06 - Apertura del enlace sin sesion

Resultado

OK

Prueba reejecutada el 01/09/2026 mediante Playwright.

Metodo

  1. Se abrio Gmail en Chrome con la cuenta pau.dengra@softradis.com.
  2. Se buscaron mensajes procedentes de no-reply@signmethod.com.
  3. Se abrio el correo nuevo QA FIR-08 Plantilla campo obligatorio 2026-09-01.
  4. Se obtuvo en memoria el destino del boton Firmar acuerdo, sin imprimir ni guardar la URL completa ni sus parametros.
  5. Se abrio el enlace en un contexto Playwright nuevo, sin cookies, almacenamiento ni sesion.
  6. Se reviso la vista anonima resultante.

Datos censurados del enlace

text
protocol: https:
host: signmethod.com
pathname: /comprobar-token
hasQuery: true
hasFragment: false

Resultado observado

  • El enlace ya usa origen publico HTTPS de produccion.
  • La pagina sin sesion cargo ACUERDO ENVIADO.
  • La vista mostro Visualizacion del acuerdo.
  • Solo se identifico al destinatario pau.dengra@softradis.com.
  • No se observaron otros destinatarios en el contenido visible.
  • Se mostro 3 dias para firmar.
  • Se listo el documento FIR-07-documento-QA-produccion.pdf.
  • No aparecio el error This legacy link is no longer valid. Request a new secure signing link.

Evidencias

  • docs/evidencias/FIR-06-correo-origen-playwright-2026-09-01.png
  • docs/evidencias/FIR-06-enlace-sin-sesion-playwright-2026-09-01.png

Observaciones

  • La ejecucion del 28/08/2026 quedo bloqueada por INC-019 porque el enlace del correo apuntaba a un origen interno HTTP. La repeticion con el correo nuevo del 01/09/2026 corrige ese bloqueo para el caso probado.
  • La URL completa del enlace de firma y sus parametros no se guardaron en la evidencia.
FIR-07 KO

FIR-07 - Revision de PDF, mensaje, plazo y campos

Revisar PDF, mensaje, plazo y campos.

Resultado esperado: Coinciden con lo enviado por Joel López.

6 archivos fuente 5 evidencias visuales

Evidencias visuales

01FIR-07-acuerdo-enviado-ko-produccion-chrome-2026-09-01.pngOriginal
02FIR-07-acuerdo-produccion-chrome-2026-09-01.pngOriginal
03FIR-07-correo-origen-playwright-2026-09-01.pngOriginal
04FIR-07-recomprobacion-desde-inicio-produccion-chrome-2026-09-01.pngOriginal
05FIR-07-vista-firmante-pendiente-ko-2026-09-01.pngOriginal

Informe de evidencia

FIR-07 - Revision de PDF, mensaje, plazo y campos

Fecha de ejecucion: 01/09/2026 Entorno: produccion (https://signmethod.com/) Herramienta: Playwright sobre el Chrome ya abierto por el usuario Responsable: Pau Dengra Estado: KO

Objetivo

Verificar el caso FIR-07 del punto 13: revisar PDF, mensaje, plazo y campos del acuerdo recibido por Pau Dengra y comprobar que coinciden con lo enviado.

Metodo

  1. Se uso la sesion abierta en Chrome en https://signmethod.com/, autenticada como pau.dengra@softradis.com.
  2. Se creo un acuerdo QA nuevo en produccion.
  3. Se subio manualmente el PDF ficticio FIR-07-documento-QA-produccion.pdf.
  4. Se configuro un destinatario: Pau Dengra (pau.dengra@softradis.com).
  5. Se dejo el plazo en 3 dias.
  6. Se configuro un mensaje especifico para FIR-07.
  7. Se reviso la pantalla final antes de enviar y posteriormente el detalle del acuerdo enviado.

Datos antes del envio

La revision previa al envio mostraba:

  • OK Informacion
  • OK 1 documento
  • OK 1 participante
  • OK Mensaje
  • Acuerdo: QA FIR-07 Playwright produccion 2026-09-01
  • Documento: FIR-07-documento-QA-produccion.pdf
  • Participante: Pau Dengra (pau.dengra@softradis.com)
  • Vista del firmante con el mensaje completo y el documento visible.
  • Caducidad mostrada en la vista previa: 4/9/2026.

Se pulso Enviar y la interfaz confirmo: Acuerdo enviado correctamente a 1 destinatario.

Resultado observado despues del envio

En el dashboard:

  • Pendientes 1
  • Enviados 3
  • El listado muestra el acuerdo QA FIR-07 Playwright produccion 2026-09-01.
  • Estado: Enviado.
  • Vencimiento en listado/detalle superior: 08/09/2026.

Al abrir Ver acuerdo, el detalle muestra:

  • Estado: Enviado.
  • Vencimiento superior: 08/09/2026.
  • Firmados: 0/1.
  • En el paso Documentos del modal se detecta FIR-07-documento-QA-produccion.pdf como Documento enviado.
  • Resumen: OK Informacion, Pendiente 0 documentos, OK 1 participante, OK Mensaje.
  • Seccion DOCUMENTOS: Pendiente y Añade al menos un PDF o una plantilla.
  • Vista del firmante: Documento pendiente y Añade un PDF para completar la vista previa.
  • El boton Revisar y firmar aparece visible pero deshabilitado.

Recomprobacion desde el inicio

Se repitio la verificacion desde https://signmethod.com/:

  1. La portada publica mostraba el boton Dashboard.
  2. Al pulsar Dashboard, se recupero el panel privado de pau.dengra@softradis.com.
  3. Primero se reviso desde el panel administrador, donde el acuerdo aparecia en Pendientes 1.
  4. Despues se cambio al usuario/rol Firmante - Prueba Produccion y se repitio la comprobacion desde su panel.
  5. En el panel firmante se mostro Pendientes 1 y el listado indicaba el acuerdo QA FIR-07 Playwright produccion 2026-09-01 con estado Pendiente de firma, vencimiento 08/09/2026, 1 destinatario y 0 firmados.
  6. Al abrir Ver acuerdo como firmante, el modal mostro el mismo estado de fondo: vencimiento superior 08/09/2026, plazo interno 3, documento detectado en el paso Documentos, pero resumen final con Pendiente 0 documentos y vista del firmante con Documento pendiente.

La recomprobacion confirma el KO; no era un estado transitorio del modal inmediatamente despues del envio.

Comparacion FIR-07

ElementoEnviado / esperadoObservado al revisarResultado
PDFFIR-07-documento-QA-produccion.pdfAparece en el paso Documentos como Documento enviado, pero el resumen final indica Pendiente 0 documentos y la vista del firmante indica Documento pendiente.KO
MensajeMensaje QA con referencia al PDF, plazo y camposEl mensaje se conserva y se muestra.OK parcial
Plazo3 diasHay inconsistencia: vista previa antes del envio 4/9/2026; listado/detalle despues del envio 08/09/2026.KO
CamposSin campos preparados todaviaSe conserva como ausencia de campos, pero no puede firmarse porque falta el documento.OK parcial

Evidencias

  • docs/evidencias/FIR-07-acuerdo-enviado-ko-produccion-chrome-2026-09-01.png
  • docs/evidencias/FIR-07-acuerdo-produccion-chrome-2026-09-01.png
  • docs/evidencias/FIR-07-recomprobacion-desde-inicio-produccion-chrome-2026-09-01.png
  • docs/evidencias/FIR-07-vista-firmante-pendiente-ko-2026-09-01.png
  • PDF usado: docs/evidencias/FIR-07-archivos-prueba/FIR-07-documento-QA-produccion.pdf

Conclusion

FIR-07 queda KO.

Aunque antes del envio la revision indicaba OK 1 documento y mostraba FIR-07-documento-QA-produccion.pdf, despues de enviar el acuerdo el detalle queda incoherente: el paso Documentos aun lista el PDF como enviado, pero el resumen final marca Pendiente 0 documentos y la vista del firmante muestra Documento pendiente. Por tanto, la vista que debe usar el firmante no coincide con lo enviado y la firma queda bloqueada. Ademas, el plazo/caducidad aparece inconsistente entre la vista previa (4/9/2026) y el listado/detalle posterior (08/09/2026).

FIR-08 KO

FIR-08 - Campos obligatorios sin completar

Continuar sin completar campos obligatorios.

Resultado esperado: Bloquea la firma e identifica lo pendiente.

5 archivos fuente 3 evidencias visuales

Evidencias visuales

01FIR-08-firmante-ver-acuerdo-sin-accion-firma-2026-09-01.pngOriginal
02FIR-08-sin-campos-obligatorios-produccion-chrome-2026-09-01.pngOriginal
03FIR-08-vista-firmante-sin-campos-obligatorios-2026-09-01.pngOriginal

Informe de evidencia

FIR-08 - Campos obligatorios sin completar

Fecha: 01/09/2026

Entorno: Produccion, https://signmethod.com/

Herramienta: Playwright sobre el Chrome ya abierto.

Resultado: KO

Preparacion

  • Se creo la plantilla QA FIR-08 Plantilla campo obligatorio 2026-09-01.
  • Se subio el PDF FIR-07-documento-QA-produccion.pdf.
  • En el editor visual de documento se coloco un campo Firma; el editor paso de 0 campos a 1 campo.
  • Se guardo la plantilla correctamente.
  • Se creo y envio el acuerdo QA FIR-08 acuerdo campo obligatorio Playwright 2026-09-01.
  • Destinatario: Pau Dengra (pau.dengra@softradis.com).
  • En revision previa al envio se mostro OK 1 documento, OK 1 participante, OK Mensaje.
  • En el paso Campos del flujo de envio se mostro Paso completo y 1 campo de firma detectado.
  • Tras enviar, produccion mostro Acuerdo enviado correctamente a 1 destinatario.

Comprobacion como firmante

Con el rol Firmante - Prueba Produccion, el panel mostro Pendientes 2. En el listado de acuerdos, QA FIR-08 acuerdo campo obligatorio Playwright 2026-09-01 aparecio como Pendiente de firma, con vencimiento 08/09/2026, Dest. enviados 1 y Firmados 0.

Al pulsar Ver acuerdo, se abre una vista en modo visualizacion con los campos bloqueados:

  • Estas viendo este acuerdo dentro de la pantalla de enviar acuerdo. Los campos estan bloqueados.
  • Estado: Pendiente de firma
  • Vencimiento: 08/09/2026
  • Firmados: 0/1

Desde el listado de firmante solo aparece la accion Ver acuerdo. El menu de mas acciones no ofrece Firmar, y Editar / Cancelar aparecen deshabilitados. No hay una accion visible que permita iniciar la firma desde el panel de firmante.

Conclusiones

FIR-08 no puede validarse como OK desde el panel porque, aunque ya existe un acuerdo vigente con 1 campo de firma detectado, el firmante no puede llegar al flujo de firma desde la lista de acuerdos. Por tanto, no se puede intentar Continuar o Firmar acuerdo dejando el campo obligatorio sin completar, ni verificar que el sistema identifique el campo pendiente.

Mantener KO hasta que el panel de firmante exponga una accion de firma/revision del acuerdo pendiente o se pruebe mediante el enlace publico recibido por email.

Evidencia visual: docs/evidencias/FIR-08-firmante-ver-acuerdo-sin-accion-firma-2026-09-01.png.

FIR-08 - Continuar sin completar campos obligatorios

Fecha de ejecucion: 01/09/2026 Entorno: produccion (https://signmethod.com/) Herramienta: Playwright sobre el Chrome ya abierto por el usuario Responsable: Pau Dengra Estado: BLOQUEADA

Objetivo

Verificar que, al continuar sin completar campos obligatorios de firma, SignMethod bloquea la firma e identifica lo pendiente.

Metodo

Se uso el navegador Chrome abierto en produccion y se consulto el acuerdo QA QA FIR-07 Playwright produccion 2026-09-01 desde el listado de acuerdos.

No se completo ni se intento enviar ninguna firma.

Resultado observado

  • Tras pedir el cambio de rol, la pestana inspeccionada estaba en la sesion Firmante - Prueba Produccion.
  • El panel de firmante muestra Pendientes 1.
  • En el listado de acuerdos, el acuerdo QA FIR-07 Playwright produccion 2026-09-01 aparece con estado Pendiente de firma, vencimiento 08/09/2026, 1 destinatario y 0 firmados.
  • Al abrir Ver acuerdo, el modal muestra el paso Campos como opcional.
  • El detalle indica: No hay campos de firma preparados.
  • Tambien indica: Sin campos preparados todavia.
  • No se detectaron elementos de campo obligatorios que pudieran dejarse vacios.
  • El boton Revisar y firmar aparece deshabilitado por el problema de documentos ya registrado en FIR-07, no por campos obligatorios pendientes.

Conclusion

FIR-08 queda BLOQUEADA. No existe en el acuerdo disponible ningun campo obligatorio que permita verificar el comportamiento esperado de bloqueo por campos sin completar.

Para ejecutar FIR-08 hace falta crear o localizar un acuerdo vigente destinado a Pau Dengra con al menos un campo obligatorio de firma, iniciales, fecha, texto u otro tipo, abrirlo como firmante y pulsar continuar/firmar sin completarlo.

Evidencia

  • docs/evidencias/FIR-08-sin-campos-obligatorios-produccion-chrome-2026-09-01.png
  • docs/evidencias/FIR-08-vista-firmante-sin-campos-obligatorios-2026-09-01.png
FIR-09 OK

FIR-09 - Crear firma elegida, dibujada y subida, mas iniciales

Crear firma elegida, dibujada y subida, más iniciales.

Resultado esperado: Todas se previsualizan correctamente.

5 archivos fuente 4 evidencias visuales

Evidencias visuales

01FIR-09-firma-dibujada-creada-2026-09-01.pngOriginal
02FIR-09-firma-dibujada-modal-2026-09-01.pngOriginal
03FIR-09-firma-subida-modal-2026-09-01.pngOriginal
04FIR-09-firmas-previsualizadas-produccion-chrome-2026-09-01.pngOriginal

Informe de evidencia

FIR-09 - Crear firma elegida, dibujada y subida, mas iniciales

Resultado

OK

Prueba ejecutada el 01/09/2026 mediante Playwright sobre el Chrome ya abierto en produccion (https://signmethod.com/).

Contexto

  • Usuario: Pau Dengra
  • Cuenta visible: pau.dengra@softradis.com
  • Rol visible durante la prueba: Administrador - Prueba Produccion
  • Ruta: Informacion de perfil > Mi perfil > Firmas
  • Resultado esperado: todas las firmas e iniciales se previsualizan correctamente.

Validacion realizada

  1. Se abrio el panel Firmas.
  2. Se creo una firma mediante la opcion Elegir para Pau Dengra con iniciales PD.
  3. Se verifico el mensaje de confirmacion Firma creada / La firma se ha creado correctamente.
  4. Se verifico que el listado Firmas guardadas mostraba previsualizacion de firma e iniciales.
  5. Se creo una firma mediante la opcion Dibujar, trazando firma e iniciales en los dos lienzos del modal.
  6. Se verifico de nuevo el mensaje de confirmacion y que el listado aumentaba a 2 firmas y 2 iniciales previsualizadas.
  7. Se creo una firma mediante la opcion Subir, usando los ficheros PNG de QA:
  • docs/evidencias/FIR-09-archivos-prueba/FIR-09-firma-subida.png
  • docs/evidencias/FIR-09-archivos-prueba/FIR-09-iniciales-subidas.png
  1. Se verifico que el modal mostraba ambos ficheros subidos y sus previsualizaciones antes de pulsar Crear.
  2. Tras crear la firma subida, se verifico el estado final del listado:
  • 3 imagenes Firma de Pau Dengra
  • 3 imagenes Iniciales de Pau Dengra
  • Estado visible: Firma creada / La firma se ha creado correctamente.

Evidencias

  • docs/evidencias/FIR-09-firma-dibujada-modal-2026-09-01.png
  • docs/evidencias/FIR-09-firma-dibujada-creada-2026-09-01.png
  • docs/evidencias/FIR-09-firma-subida-modal-2026-09-01.png
  • docs/evidencias/FIR-09-firmas-previsualizadas-produccion-chrome-2026-09-01.png
  • docs/evidencias/FIR-09-archivos-prueba/FIR-09-firma-subida.png
  • docs/evidencias/FIR-09-archivos-prueba/FIR-09-iniciales-subidas.png

Observaciones

  • La seccion Informacion personal del perfil mostro previamente un estado Failed to fetch; no bloqueo la ejecucion de FIR-09 porque la seccion Firmas permitio crear y previsualizar las tres variantes.
  • La creacion de firmas muestra un aviso legal indicando que la firma y las iniciales seran la representacion electronica para documentos y contratos vinculantes.
FIR-10 OK

FIR-10 - Firmar y completar el acuerdo

Firmar y completar el acuerdo.

Resultado esperado: Confirma una sola firma y cambia a completado.

5 archivos fuente 4 evidencias visuales

Evidencias visuales

01FIR-10-acuerdo-firmado-resultado-2026-09-01.pngOriginal
02FIR-10-firma-seleccionada-antes-confirmar-2026-09-01.pngOriginal
03FIR-10-firmar-acuerdo-resultado-2026-09-01.pngOriginal
04FIR-10-seleccionar-firma-modal-2026-09-01.pngOriginal

Informe de evidencia

FIR-10 - Firmar y completar el acuerdo

Resultado

OK

Prueba ejecutada el 01/09/2026 a las 12:09:48 +02:00 mediante Playwright sobre el Chrome ya abierto en produccion (https://signmethod.com/).

Contexto

  • Usuario firmante: Pau Dengra
  • Cuenta visible: pau.dengra@softradis.com
  • Correo usado: QA FIR-08 Plantilla campo obligatorio 2026-09-01
  • Acuerdo visible en el flujo: QA FIR-08 acuerdo campo obligatorio Playwright 2026-09-01
  • Documento: FIR-07-documento-QA-produccion.pdf

Validacion realizada

  1. Se accedio al acuerdo desde el enlace HTTPS publico recibido por email.
  2. La vista inicial mostro Acuerdo enviado, Visualizacion del acuerdo, destinatario pau.dengra@softradis.com, 3 dias para firmar y el documento FIR-07-documento-QA-produccion.pdf.
  3. Se pulso Firmar, abriendo el modal Firmar acuerdo.
  4. El modal mostro un unico campo obligatorio Firma con estado inicial Seleccionar firma.
  5. Se abrio el selector Selecciona una firma, que mostraba las firmas guardadas creadas en FIR-09.
  6. Se selecciono una firma guardada de Pau Dengra.
  7. El campo obligatorio cambio a Firma Pau Dengra.
  8. Tras confirmacion expresa del usuario, se pulso el boton final Firmar acuerdo.
  9. La aplicacion volvio al dashboard mostrando Se ha firmado el acuerdo correctamente.
  10. El resumen del dashboard paso a Pendientes 1 y Completados 1.

Evidencias

  • docs/evidencias/FIR-10-seleccionar-firma-modal-2026-09-01.png
  • docs/evidencias/FIR-10-firma-seleccionada-antes-confirmar-2026-09-01.png
  • docs/evidencias/FIR-10-acuerdo-firmado-resultado-2026-09-01.png

Observaciones

  • El primer boton Firmar no completa el acuerdo directamente; abre el modal de revision y firma.
  • La finalizacion real se produce al pulsar Firmar acuerdo dentro del modal, despues de seleccionar la firma.
  • La URL completa del enlace de firma y sus parametros no se guardaron en la evidencia.
FIR-11 KO

FIR-11 - Listado y detalle de acuerdo

Abrir listado y detalle.

Resultado esperado: Estado, firmante, fechas, documentos e historial son correctos. Al entrar en Ver acuerdo desde el listado, el detalle debe mostrar cada destinatario al que se envió el acuerdo y el estado individual de cada usuario, por ejemplo pendiente, enviado, firmado, rechazado, caducado o sustituido según corresponda.

4 archivos fuente 2 evidencias visuales

Evidencias visuales

01FIR-11-01-listado-acuerdos-2026-09-01T10-01-56-161Z.pngOriginal
02FIR-11-02-detalle-acuerdo-2026-09-01T10-01-56-161Z.pngOriginal

Informe de evidencia

FIR-11 - Listado y detalle de acuerdo

Resultado

KO

La prueba se ejecuto el 01/09/2026 en produccion (https://signmethod.com) mediante Playwright, con Joel Lopez como usuario emisor/owner.

Caso revisado

Se abrio el modal Acuerdos y se reviso el listado general. Despues se pulso Ver acuerdo sobre el primer acuerdo visible:

  • Acuerdo: QA FIR-03 acuerdo principal 2026-09-01T08-53-59-720Z
  • Descripcion: Acuerdo principal QA con varios PDF y destinatarios ordenados.
  • Estado en listado: Enviado
  • Destinatarios enviados: 2
  • Firmados: 0
  • Vencimiento en listado: Sin token

Resultado observado

El listado muestra informacion agregada de estado y contadores, pero al entrar en Ver acuerdo el detalle no muestra el estado individual de cada destinatario.

En el detalle se observa:

  • Pantalla: Visualizacion del acuerdo
  • Modo: Modo visualizacion
  • Aviso: Estas viendo este acuerdo dentro de la pantalla de enviar acuerdo. Los campos estan bloqueados.
  • Estado agregado: Enviado
  • Vencimiento: Sin token
  • Firmados: 0/2
  • Datos basicos del acuerdo visibles.

No se muestra una relacion de los 2 destinatarios con su estado propio, por ejemplo pendiente, enviado, firmado, rechazado, caducado o sustituido. Por tanto, no se cumple el resultado esperado de FIR-11.

Evidencias

  • Captura del listado: docs/evidencias/FIR-11-01-listado-acuerdos-2026-09-01T10-01-56-161Z.png
  • Captura del detalle: docs/evidencias/FIR-11-02-detalle-acuerdo-2026-09-01T10-01-56-161Z.png
  • Resultado Playwright: docs/evidencias/FIR-11-playwright-result-2026-09-01T10-01-56-161Z.json

Conclusion

FIR-11 queda como KO. La incidencia ya esta recogida en INC-023: el detalle de Ver acuerdo debe mostrar documentos, fechas, historial y, especialmente, cada destinatario con su estado individual.

Documentación y datos

FIR-11-playwright-result-2026-09-01T10-01-56-161Z.jsonJSON · 3.0 KBAbrir original
{
  "baseUrl": "https://signmethod.com/",
  "startedAt": "2026-09-01T10:01:56.663Z",
  "screenshots": [
    "D:\\areatrabajo\\signmethod\\docs\\evidencias\\FIR-11-01-listado-acuerdos-2026-09-01T10-01-56-161Z.png",
    "D:\\areatrabajo\\signmethod\\docs\\evidencias\\FIR-11-02-detalle-acuerdo-2026-09-01T10-01-56-161Z.png"
  ],
  "observations": [],
  "listText": "× Acuerdos Acuerdos Todos los acuerdos enviados y borradores de la empresa. Nuevo acuerdo Todos (5) Borradores (1) Cancelados (0) Pendientes (2) Completado (0) ACUERDO ETIQUETA FECHA DE VENCIMIENTO ESTADO DEST. ENVIADOS FIRMADOS ACCIONES QA FIR-03 acuerdo principal 2026-09-01T08-53-59-720Z Acuerdo principal QA con varios PDF y destinatarios ordenados. Sin etiqueta Sin token Enviado 2 0 Ver acuerdo Contrato de prestación de servicios 1 documento · 1 firmante #Demo 28/05/2026 Caducada 1 0 Ver acuerdo Acuerdo de confidencialidad 1 documento · 2 firmantes #Legal 28/05/2026 Caducada 2 0 Ver acuerdo Prueba Pau Prueba de envio de acuerdo FIR-04 #Prueba 08/09/2026 Enviado 1 0 Ver acuerdo prueba prueba #prueba 04/09/2026 Enviado 1 0 Ver acuerdo Detalle rápido Todos los acuerdos enviados y borradores de la empresa.",
  "rows": [],
  "selectedRow": "",
  "detailText": "Acuerdos Plantillas Administración Temporalidad Inicio Owner · pepe joel.lopez@softradis.com EMPRESA ACTIVA pepe · Owner ⌄ Usuarios Enviar acuerdo Comprar ahora Salir × Flujo Visualización del acuerdo Modo visualización Estás viendo este acuerdo dentro de la pantalla de enviar acuerdo. Los campos están bloqueados. Estado: Enviado · Vencimiento: Sin token · Firmados: 0/2 1 Información Paso completo La información básica del acuerdo está completa. Datos del acuerdo Título del acuerdo * 52/120 Descripción del acuerdo * 62/1000 Tiempo para firmar * 3 días 7 días 15 días 30 días Días disponibles Fecha de vencimiento: Sin token Etiqueta Etiqueta del acuerdo Sirve para localizar y filtrar este acuerdo desde el buscador. 0/80 Protección del acuerdo Proteger el acuerdo con contraseña Cerrar Base multiempresa Panel Owner Vista operativa con tareas pendientes, actividad e información general. PENDIENTES 2 Acuerdos esperando firma PRÓXIMOS A VENCER 2 Vencen en los próximos 7 días COMPLETADOS RECIENTEMENTE 0 Cerrados en los últimos 7 días USUARIOS Y ROLES 1 Personas en esta empresa USUARIOS Y ROLES 1 Usuarios de la empresa 0 Administradores 0 Emisores 0 Firmantes Acuerdos Todos los acuerdos enviados y borradores de la empresa. Nuevo acuerdo Enviados 4 Pendientes 2 Completados 0 Actividad Documento creado Contrato demo pendiente de firmantes 09:12 Invitación enviada Firmante externo añadido al flujo 10:28 Borrador actualizado Campos de firma revisados 12:05 Información general A la espera de otros 0 Con caducidad próxima 0 Completados 0",
  "checks": {
    "hasStatus": true,
    "hasSigner": true,
    "hasDates": true,
    "hasDocuments": true,
    "hasHistory": true,
    "hasIndividualRecipientStatus": false
  },
  "finishedAt": "2026-09-01T10:02:15.576Z"
}
FIR-12 KO

FIR-12 - Descargar el documento firmado

Descargar el documento firmado.

Resultado esperado: Abre, contiene la firma y coincide para ambos.

3 archivos fuente 2 evidencias visuales

Evidencias visuales

01FIR-12-detalle-acuerdo-firmado-2026-09-01.pngOriginal
02FIR-12-menu-acuerdo-firmado-sin-descarga-2026-09-01.pngOriginal

Informe de evidencia

FIR-12 - Descargar el documento firmado

Resultado

KO

Prueba ejecutada el 01/09/2026 mediante Playwright sobre el Chrome ya abierto en produccion (https://signmethod.com/).

Contexto

  • Acuerdo: QA FIR-08 acuerdo campo obligatorio Playwright 2026-09-01
  • Usuario visible: pau.dengra@softradis.com
  • Estado previo: acuerdo firmado en FIR-10.
  • Resultado esperado: descargar el documento firmado, abrirlo, comprobar que contiene la firma y guardar hash.

Validacion realizada

  1. Se abrio el panel de acuerdos y se filtro por Completado.
  2. El listado mostro el acuerdo con estado OK Firmado, Dest. enviados 1 y Firmados 1.
  3. Se abrio Ver acuerdo.
  4. El detalle mostro Estado: Firmado · Vencimiento: 08/09/2026 · Firmados: 1/1.
  5. La vista Ver acuerdo solo mostro el modo visualizacion bloqueado y el paso Informacion; no mostro una accion para descargar el documento firmado.
  6. Se abrio el menu de mas acciones del acuerdo firmado.
  7. El menu solo ofrecio Duplicar, Editar deshabilitado y Cancelar; no ofrecio Descargar.
  8. Se comprobo que el visor del detalle carga el documento original, no una version firmada descargable.
  9. Se reabrio el enlace publico usado por el firmante; la pagina mostro que el token ya habia sido utilizado y tampoco ofrecio descarga del firmado. El valor del token no se conserva en esta evidencia.

Resultado observado

  • No se pudo descargar el PDF firmado desde la interfaz.
  • No se pudo abrir el PDF firmado.
  • No se pudo comprobar visualmente que el PDF descargado contiene la firma.
  • No se pudo calcular ni guardar hash del PDF firmado descargado.

Evidencias

  • docs/evidencias/FIR-12-detalle-acuerdo-firmado-2026-09-01.png
  • docs/evidencias/FIR-12-menu-acuerdo-firmado-sin-descarga-2026-09-01.png

Incidencia

Se registra INC-024: falta una accion visible de descarga del documento firmado para acuerdos completados. En acuerdos con varios destinatarios, la interfaz debe permitir elegir el usuario firmante/destinatario y descargar el PDF firmado correspondiente a ese usuario concreto, mostrando tambien hash y tamano por version firmada.

FIR-13 KO

FIR-13 - Evidencias, eventos, hashes y tamano

Revisar evidencias, eventos, hashes y tamaño.

Resultado esperado: Son coherentes con la secuencia realizada.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

FIR-13 - Evidencias, eventos, hashes y tamano

Resultado

KO

La revision se realizo el 01/09/2026 tras integrar la secuencia actual de produccion del flujo de acuerdo y firma.

Objetivo

Comprobar que las evidencias, eventos, hashes y tamanos son coherentes con la secuencia realizada.

Secuencia revisada

  • FIR-09: OK. Las firmas e iniciales se crean y previsualizan correctamente.
  • FIR-10: OK. El acuerdo QA FIR-08 acuerdo campo obligatorio Playwright 2026-09-01 se firma una sola vez y el panel pasa a Completados 1.
  • FIR-11: KO. El listado muestra estado y contadores, pero el detalle de Ver acuerdo no muestra cada destinatario con su estado individual.
  • FIR-12: KO. El acuerdo firmado aparece como completado/firmado, pero no existe accion visible para descargar el documento firmado.
  • FIR-14: OK. Reutilizar el enlace ya firmado no permite firmar otra vez ni cambia los contadores.

Hashes y tamanos disponibles

ArchivoTamanoSHA-256
docs/evidencias/FIR-07-archivos-prueba/FIR-07-documento-QA-produccion.pdf1.061 bytes2F859C0E24E03A3BC39D2CD50BF4B660CFE2EE49BBEC77F35EF81C4A0922CE56
docs/evidencias/FIR-10-acuerdo-firmado-resultado-2026-09-01.png154.026 bytes0C59EFA458A4275F7F01ED151E69C23BBCE215088ADDBF60C645CC5CDD061A7A
docs/evidencias/FIR-11-01-listado-acuerdos-2026-09-01T10-01-56-161Z.png373.056 bytes45ABA2C0A933409AE02A7CCCD14E1965A739EB06E4AFCF1464081BFFCC81A163
docs/evidencias/FIR-11-02-detalle-acuerdo-2026-09-01T10-01-56-161Z.png328.055 bytesCED5BDB73E6035FF53A614217E644FF34D9D578589B618ABB1206F11D17FE590
docs/evidencias/FIR-11-playwright-result-2026-09-01T10-01-56-161Z.json3.049 bytesED42252611B38F47F8137D5F6D00295BA81CBDBEDD1A0A411DC4C81CB8A12FEB
docs/evidencias/FIR-12-DESCARGA-DOCUMENTO-FIRMADO-2026-09-01.md2.186 bytes6D4F5DF5BAC9E5A7D48697C698272F017E31E81F413DFC0B9089A3FCF215A2A0
docs/evidencias/FIR-12-detalle-acuerdo-firmado-2026-09-01.png74.071 bytesF7B2C007A67B5F9F5795F9A7DBA5DDA96F625726E64BC4A4D7F92D8A9950521C
docs/evidencias/FIR-12-menu-acuerdo-firmado-sin-descarga-2026-09-01.png64.578 bytesBECFE3843485A7F6B4AFDE75984FCF63CE2B10C44614D0480FC326D392DDB499

Resultado observado

Las evidencias disponibles son coherentes con la secuencia observada: se preparo un acuerdo con campo de firma, se firmo una vez, el dashboard paso a completados y la reutilizacion del enlace no permitio repetir la firma.

Sin embargo, el control completo de FIR-13 no se puede dar por correcto porque FIR-12 demuestra que no hay accion visible para descargar el documento firmado. Por tanto, faltan los artefactos centrales de auditoria:

  • PDF firmado descargado.
  • Hash SHA-256 del PDF firmado.
  • Tamano del PDF firmado.
  • Comparacion del PDF firmado descargado por Joel Lopez y Pau Dengra.
  • Evidencia de que el detalle muestra el documento firmado correcto y no solo el original.pdf.

Conclusion

FIR-13 queda KO. Aunque los eventos y capturas disponibles encajan con la secuencia realizada, no se puede validar la coherencia completa de evidencias, hashes y tamano sin el PDF firmado descargable. La causa queda vinculada a INC-024.

FIR-14 OK

FIR-14 - Reutilizar el enlace tras completar

Reutilizar el enlace tras completar.

Resultado esperado: No permite firmar otra vez ni duplica eventos.

2 archivos fuente 1 evidencia visual

Evidencias visuales

01FIR-14-dashboard-contadores-tras-reuso-2026-09-01.pngOriginal

Informe de evidencia

FIR-14 - Reutilizar el enlace tras completar

Resultado

OK

Prueba ejecutada el 01/09/2026 mediante Playwright sobre el Chrome ya abierto en produccion (https://signmethod.com/).

Contexto

  • Usuario visible: pau.dengra@softradis.com
  • Acuerdo reutilizado: QA FIR-08 acuerdo campo obligatorio Playwright 2026-09-01
  • Precondicion: acuerdo firmado y completado en FIR-10.
  • Resultado esperado: el enlace no permite firmar otra vez ni duplica eventos.

Validacion realizada

  1. Se reutilizo el enlace HTTPS publico del correo usado para FIR-10.
  2. La URL completa y sus parametros no se imprimieron ni se guardaron.
  3. La pagina cargada mostro ACUERDO ENVIADO y Visualizacion del acuerdo.
  4. La pagina mostro Token has already been used.
  5. No se mostro ningun boton Firmar ni Firmar acuerdo; solo quedo disponible Dashboard.
  6. Se volvio al dashboard autenticado y se recargo la informacion.
  7. Los contadores siguieron estables:
  • Pendientes 1
  • Completados recientemente 1
  • Completados 1

Resultado observado

  • El enlace ya utilizado no permite iniciar una segunda firma.
  • No se observa duplicado funcional en el dashboard tras reutilizar el enlace.
  • El acuerdo permanece como completado una sola vez a nivel de contadores visibles.

Evidencias

  • docs/evidencias/FIR-14-dashboard-contadores-tras-reuso-2026-09-01.png

Observaciones

  • No se conserva captura de la pantalla Token has already been used porque la UI mostraba el token en claro en la pagina.
  • La comprobacion de no duplicado se ha realizado sobre el comportamiento visible y los contadores del dashboard. La revision fina de eventos/auditoria queda cubierta por FIR-13.
FIR-15 OK

FIR-15 - Reenvio de acuerdo pendiente

Reenviar un acuerdo pendiente.

Resultado esperado: Respeta el límite y envía un solo correo.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

FIR-15 - Reenvio de acuerdo pendiente

Resultado

OK

La prueba se completo el 01/09/2026 en produccion (https://signmethod.com) mediante Chrome compartido y captura aportada por Joel Lopez.

Objetivo

Reenviar un acuerdo pendiente y comprobar que respeta el limite de reenvio y no permite disparar multiples correos de forma inmediata.

Evidencia observada

En el detalle de Visualizacion del acuerdo, dentro del paso Participantes, se observa:

  • Estado agregado del acuerdo: Enviado
  • Vencimiento: 08/09/2026
  • Firmados: 0/2
  • Destinatario 1: Joel Lopez <joel.lopez@softradis.com>
  • Destinatario 2: Pau Dengra <pau.dengra@softradis.com>
  • Boton Reenviar disponible para cada destinatario antes de ejecutar la accion.

Tras pulsar Reenviar para joel.lopez@softradis.com, la interfaz muestra:

  • Mensaje de exito: Reenvio ejecutado correctamente para joel.lopez@softradis.com.
  • Boton del destinatario Joel Lopez bloqueado con contador: Reenviar en 5:04
  • Boton de Pau Dengra permanece disponible, lo que indica que el limite se aplica por destinatario.

Evaluacion

La aplicacion ejecuta un unico reenvio para el destinatario seleccionado y aplica inmediatamente una ventana de espera antes de permitir otro reenvio al mismo correo. Esto cumple el criterio de FIR-15: respeta el limite y evita reenvios repetidos inmediatos sobre el mismo destinatario.

No se inspecciono la bandeja de entrada del destinatario; la validacion se basa en la confirmacion de produccion y en el cooldown visible tras una unica accion de reenvio.

Evidencia

  • Captura compartida en el chat por Joel Lopez el 01/09/2026, donde se ve el mensaje de exito y Reenviar en 5:04.
FIR-16 KO

FIR-16 - Sustituir destinatario y usar el enlace anterior

Sustituir destinatario y usar el enlace anterior.

Resultado esperado: El anterior se invalida y el nuevo funciona.

3 archivos fuente 2 evidencias visuales

Evidencias visuales

01FIR-16-detalle-pendiente-sin-sustituir-2026-09-01.pngOriginal
02FIR-16-menu-pendiente-sin-sustituir-2026-09-01.pngOriginal

Informe de evidencia

FIR-16 - Sustituir destinatario y usar el enlace anterior

Resultado

KO

Prueba ejecutada el 01/09/2026 mediante Playwright sobre el Chrome ya abierto en produccion (https://signmethod.com/).

Criterio

  • Accion: sustituir un destinatario de un acuerdo pendiente y usar el enlace anterior.
  • Resultado esperado: el enlace anterior queda invalidado y el nuevo enlace funciona.

Validacion realizada

  1. Se abrio el dashboard de produccion con la cuenta visible pau.dengra@softradis.com.
  2. Se entro en el listado de acuerdos pendientes.
  3. Se localizo el acuerdo QA FIR-07 Playwright produccion 2026-09-01, con estado Enviado, Dest. enviados 1 y Firmados 0.
  4. Se abrio el menu de mas acciones de la fila.
  5. El menu solo mostro:
  • Duplicar
  • Editar deshabilitado
  • Cancelar
  1. No se mostro accion Sustituir destinatario, Cambiar destinatario ni equivalente.
  2. Se entro en Ver acuerdo.
  3. El detalle mostro Estado: Enviado · Vencimiento: 08/09/2026 · Firmados: 0/1.
  4. La vista quedo en modo visualizacion bloqueado y solo mostro el paso Informacion.
  5. No se mostro gestion de destinatarios ni opcion para sustituir al firmante.

Resultado observado

  • No se puede iniciar la sustitucion de destinatario desde la interfaz.
  • No se puede generar un nuevo enlace desde este flujo.
  • No se puede verificar desde UI que el enlace anterior quede invalidado.
  • No se puede verificar desde UI que el nuevo enlace funcione.

Evidencias

  • docs/evidencias/FIR-16-detalle-pendiente-sin-sustituir-2026-09-01.png
  • docs/evidencias/FIR-16-menu-pendiente-sin-sustituir-2026-09-01.png

Revision tecnica

  • El backend contiene el endpoint POST /signature-requests/{requestId}/recipients/{recipientEmail}/replace.
  • En la interfaz revisada con Playwright no se expone una accion equivalente en el listado ni en Ver acuerdo.

Incidencia

Se registra INC-025: falta exponer el flujo de sustitucion de destinatario para acuerdos pendientes.

FIR-17 OK

FIR-17 - Cancelar acuerdo y probar enlace

Cancelar un acuerdo y probar su enlace.

Resultado esperado: No admite firmas posteriores.

3 archivos fuente 2 evidencias visuales

Evidencias visuales

01FIR-17-listado-acuerdo-pendiente-antes-cancelar-2026-09-01.pngOriginal
02FIR-17-listado-tras-cancelar-2026-09-01.pngOriginal

Informe de evidencia

FIR-17 - Cancelar acuerdo y probar enlace

Fecha: 01/09/2026

Entorno: produccion, https://signmethod.com/

Herramienta: Playwright sobre el Chrome abierto del usuario.

Objetivo

Comprobar que, al cancelar un acuerdo enviado, el enlace de firma anterior queda inutilizable y no admite firmas posteriores.

Datos de prueba

  • Acuerdo cancelado: QA FIR-07 Playwright produccion 2026-09-01
  • Destinatario: pau.dengra@softradis.com
  • Estado inicial observado: Enviado
  • Fecha de vencimiento observada: 08/09/2026
  • Destinatarios enviados: 1
  • Firmados: 0

La URL completa del enlace y su token no se guardan en esta evidencia.

Ejecucion

  1. Se localizo en Gmail el correo del acuerdo QA FIR-07 Playwright produccion 2026-09-01.
  2. Se obtuvo el enlace del boton Firmar acuerdo y se verifico que apuntaba a https://signmethod.com/comprobar-token con parametros.
  3. En el listado de acuerdos de SignMethod se comprobo que el acuerdo estaba pendiente/enviado.
  4. Con confirmacion explicita del usuario, se pulso la accion Cancelar y se acepto el dialogo de confirmacion.
  5. El listado paso a mostrar Cancelados (1) y el acuerdo dejo de aparecer en la tabla visible.
  6. Se abrio el enlace original tras la cancelacion.
  7. La pagina mostro el mensaje: Este acuerdo ha sido cancelado por el emisor y ya no esta disponible para firmar.
  8. No aparecieron botones Firmar acuerdo, Revisar y firmar ni controles de firma.

Resultado

OK.

El enlace anterior queda bloqueado despues de cancelar el acuerdo y no permite una firma posterior.

Evidencias

  • FIR-17-listado-acuerdo-pendiente-antes-cancelar-2026-09-01.png
  • FIR-17-listado-tras-cancelar-2026-09-01.png

No se conserva captura de la pagina del enlace cancelado porque la UI muestra el token en claro bajo TOKEN GENERADO.

Incidencia relacionada

Se registra INC-026: la vista publica del enlace de firma muestra el token completo en pantalla cuando el acuerdo esta cancelado o el token ya fue usado. Esto no impide el OK de FIR-17, pero debe corregirse para evitar filtraciones accidentales en capturas o soporte.

FIR-18 KO

FIR-18 - Token inexistente, manipulado y caducado

Probar token inexistente, manipulado y caducado.

Resultado esperado: Lo rechaza sin revelar datos.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

FIR-18 - Token inexistente, manipulado y caducado

Fecha: 01/09/2026

Entorno: produccion, https://signmethod.com/

Herramienta: Playwright sobre el Chrome abierto del usuario.

Objetivo

Comprobar que la ruta publica de firma rechaza tokens inexistentes, manipulados y caducados sin revelar datos.

Ejecucion

Se probaron tres variantes sobre https://signmethod.com/comprobar-token:

  1. Token inexistente sintetico, generado solo para la prueba.
  2. Token manipulado a partir de un enlace real ya cancelado, cambiando un caracter.
  3. Token antiguo procedente de un correo legacy previo. El uso de ese token real antiguo se hizo tras confirmacion explicita del usuario.

La URL completa, los parametros y los tokens no se conservan en esta evidencia.

Resultado observado

En los tres escenarios:

  • La pagina cargo la vista ACUERDO ENVIADO / Visualizacion del acuerdo.
  • La respuesta funcional fue Agreement not found.
  • No aparecieron botones Firmar acuerdo, Revisar y firmar, Crear tu firma, Confirmar firma ni controles de firma.
  • La pantalla mostro el token completo bajo TOKEN GENERADO.

Resultado

KO.

La aplicacion rechaza los tokens probados y no permite firmar, pero incumple el criterio sin revelar datos porque expone el token completo en la interfaz publica.

Evidencias

No se guardan capturas de las paginas de token, ya que contienen el token en claro.

Incidencia relacionada

Se amplia INC-026 para incluir FIR-18: la interfaz publica no debe mostrar el token completo en estados de token usado, cancelado, inexistente, manipulado, antiguo o caducado.

FIR-19 KO

FIR-19 - Contraseña de acuerdo

Probar contraseña de acuerdo, si aplica.

Resultado esperado: Solo la válida permite continuar.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

FIR-19 - Contraseña de acuerdo

Fecha: 01/09/2026

Entorno: produccion, https://signmethod.com/

Herramienta: Playwright sobre el Chrome abierto del usuario y revision del contrato frontend/backend.

Objetivo

Comprobar que, si un acuerdo esta protegido con contraseña, solo la contraseña valida permite continuar.

Ejecucion

  1. Se abrio el flujo Nuevo acuerdo en SignMethod.
  2. En el paso Informacion se comprobo que existe la seccion Proteccion del acuerdo.
  3. Al activar la proteccion aparecen dos campos de contraseña del acuerdo.
  4. Se inicio la preparacion del acuerdo QA QA FIR-19 contraseña acuerdo 2026-09-01 con destinatario previsto pau.dengra@softradis.com.
  5. La automatizacion del selector de archivo en Chrome quedo inestable antes de completar el envio del acuerdo QA.
  6. Se reviso la implementacion que sirve la firma publica por token.

No se conserva ninguna contraseña temporal ni se documenta ningun valor secreto.

Resultado tecnico

La ruta publica usada por https://signmethod.com/comprobar-token obtiene el acuerdo mediante GET /public-agreements/{token}.

En backend, findPublicSignatureRequestByToken valida token, estado cancelado, token invalidado, token usado y caducidad, pero no comprueba passwordProtectionEnabled, agreementPasswordHash ni agreementPasswordSalt.

En frontend, la vista publica de acuerdo carga el payload y muestra documentos/boton de firma cuando el token es valido, pero no muestra un prompt de contraseña de acuerdo antes de permitir continuar.

Resultado

KO.

No hay un control publico verificable que bloquee una contraseña incorrecta y permita continuar solo con la contraseña valida. La proteccion puede configurarse en el flujo de creacion, pero no se aplica en el acceso publico por enlace de firma.

Incidencia relacionada

Se registra INC-027: la contraseña de acuerdo debe exigirse antes de revelar documentos, campos o acciones de firma en la ruta publica por token.

FIR-20 KO

FIR-20 - Firma secuencial con dos destinatarios

Firmar secuencialmente con dos destinatarios.

Resultado esperado: Cada uno firma en su turno y se completa al final.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

FIR-20 - Firma secuencial con dos destinatarios

Fecha: 01/09/2026

Entorno: produccion, https://signmethod.com/

Herramienta: Playwright sobre el Chrome abierto del usuario y revision del contrato frontend/backend.

Objetivo

Comprobar que un acuerdo con dos destinatarios en modo secuencial obliga a que cada destinatario firme en su turno y que el acuerdo se complete al final.

Resultado observado

La interfaz incluye un modo Secuencial en el paso Participantes. Cuando se activa, el frontend prepara los destinatarios con signingOrder y envia tambien signingOrderEnabled.

La revision del backend muestra que esa informacion no se aplica para controlar el flujo real:

  • sendSignatureRequest genera un token para cada destinatario usando el conjunto completo de destinatarios.
  • El envio de correo se realiza para todos mediante Promise.all(...).
  • findPublicSignatureRequestByToken no comprueba si el destinatario del token es el siguiente firmante permitido.
  • persistCompletedSignatureDocument permite completar la firma a cualquier destinatario del acuerdo si su token es valido y solo calcula si el acuerdo completo termina cuando todos han firmado.

Resultado

KO.

El sistema no garantiza firma secuencial. Aunque la interfaz permite ordenar destinatarios, todos pueden recibir token y firmar sin que el backend bloquee a los firmantes posteriores hasta que firmen los anteriores.

Incidencia relacionada

Se registra INC-028: el modo secuencial debe aplicarse en backend, no solo en la interfaz. El primer token/correo debe emitirse solo para el primer destinatario y los siguientes deben desbloquearse tras cada firma completada.

FIR-21 KO

FIR-21 - Comentarios en acuerdo

Añadir comentarios, si aplica.

Resultado esperado: Se guardan y son visibles solo para quien corresponda.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

FIR-21 - Comentarios en acuerdo

Fecha: 01/09/2026

Entorno: produccion, https://signmethod.com/

Herramienta: Playwright sobre el Chrome abierto del usuario y revision del contrato frontend/backend.

Objetivo

Comprobar que los comentarios, si aplican, se guardan y son visibles solo para quien corresponda.

Resultado observado

La vista de firma contempla un campo Comentario cuando commentsEnabled esta activo. Al firmar, el frontend envia el valor como comment.

En backend, persistCompletedSignatureDocument persiste el comentario en el artefacto firmado:

  • signedArtifacts[].comment

Pero el detalle de acuerdo no lo expone de vuelta:

  • getSignatureRequest construye signedVersions con recipientEmail, completedAt, sha256, size y downloadUrl.
  • No incluye comment.
  • La interfaz no tiene un listado o historial visible de comentarios por documento, acuerdo o destinatario.
  • Tampoco existe un control visible de permisos que indique quien puede leer cada comentario.

Resultado

KO.

El comentario puede guardarse como metadato interno, pero no hay una forma visible de comprobar su lectura ni su alcance de visibilidad. Por tanto no se cumple que los comentarios sean visibles solo para quien corresponda.

Incidencia relacionada

Se registra INC-029: devolver y mostrar comentarios autorizados en el detalle del acuerdo, con politica clara de visibilidad y comprobacion desde emisor y destinatario.

FIR-22 KO

FIR-22 - Aislamiento de documentos por destinatario

Verificar que un destinatario no abre el documento de otro.

Resultado esperado: El backend deniega el acceso.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

FIR-22 - Aislamiento de documentos por destinatario

Fecha: 01/09/2026

Entorno: produccion, https://signmethod.com/

Herramienta: Playwright sobre el Chrome abierto del usuario y revision del contrato frontend/backend.

Objetivo

Verificar que un destinatario no puede abrir el documento o la version firmada de otro destinatario, y que el backend deniega ese acceso.

Resultado observado

La revision del backend muestra dos problemas de aislamiento:

  1. Acceso publico por token:

getPublicAgreementByToken valida el token y localiza al destinatario asociado. En la respuesta devuelve solo ese destinatario en recipients, pero devuelve los documentos con:

buildPublicAgreementDocuments(request.documents ?? [])

Esa funcion construye URLs prefirmadas de descarga y previsualizacion para todos los documentos del acuerdo, sin filtrar por destinatario.

  1. Detalle autenticado:

assertActorCanOpenSignatureRequest permite abrir el acuerdo a cualquier actor cuyo email aparezca en request.recipients.

Despues, getSignatureRequest construye signedVersions recorriendo todos los destinatarios del acuerdo y devuelve downloadUrl para cada version firmada, sin filtrar por el actor destinatario.

Resultado

KO.

El backend no demuestra la denegacion requerida. Un destinatario puede recibir documentos del acuerdo completo por enlace publico y, si accede al detalle autenticado como destinatario, puede recibir metadatos y URLs de versiones firmadas de otros destinatarios.

Incidencia relacionada

Se registra INC-030: aislar documentos y versiones firmadas por destinatario, devolver solo lo autorizado para el token/actor y responder 403 cuando se intente acceder al documento o version firmada de otro destinatario.

ID

Identidad y sesión

2 bloques de evidencia
ID-07 KO

Evidencia ID-07: MFA de perfiles administrativos

Probar MFA de perfiles administrativos, si aplica.

Resultado esperado: Alta, reto y recuperación funcionan.

3 archivos fuente 2 evidencias visuales

Evidencias visuales

01ID-07-acceso-configuracion-perfil-2026-08-28.pngOriginal
02ID-07-privacidad-seguridad-sin-MFA-2026-08-28.pngOriginal

Informe de evidencia

Evidencia ID-07: MFA de perfiles administrativos

Fecha de comprobación: 28/08/2026 Entorno: producción (https://signmethod.com/) Perfil observado: usuario autenticado con rol Owner

Objetivo

Comprobar que los perfiles administrativos pueden dar de alta un segundo factor, superar el reto MFA durante el acceso y recuperar el acceso cuando pierden el segundo factor.

Comprobación realizada

  1. Se accedió al menú del usuario autenticado.
  2. Se abrió Mi perfil.
  3. Se seleccionó Privacidad y seguridad.
  4. Se revisaron todos los controles visibles de seguridad.
  5. Se buscó en el frontend el flujo MFA/TOTP y se revisó la configuración declarada de Cognito y de los roles administrativos.

Resultado observado

  • El menú del perfil permite entrar en Mi perfil y muestra una opción general Configuración.
  • La sección Privacidad y seguridad solo presenta el email principal y el botón Cambiar contraseña.
  • La pantalla muestra además el error Failed to fetch.
  • No hay una opción para activar o desactivar MFA.
  • No se muestra QR, secreto TOTP, campo de verificación, códigos de recuperación ni procedimiento para sustituir un autenticador perdido.
  • La infraestructura declara Cognito con MFA opcional mediante OTP (mfa: cognito.Mfa.OPTIONAL y otp: true).
  • El backend marca MFA como requerido para admin y superadmin, pero no se encontró en el frontend un flujo para asociar o verificar un token de software.
  • No fue posible consultar el estado efectivo del pool de producción porque AWS CLI no está instalado en el entorno de ejecución.

Evidencias visuales

Imagen: Acceso a Mi perfil y Configuración

Imagen: Privacidad y seguridad sin controles MFA

Conclusión

KO. El usuario no dispone de un flujo visible y utilizable para dar de alta MFA. Por ello tampoco pueden validarse el reto durante el inicio de sesión ni la recuperación del segundo factor.

Pasos para completar ID-07

  1. Confirmar en el pool de Cognito de producción que TOTP está habilitado y documentar su configuración efectiva.
  2. Definir con precisión qué roles deben usar MFA, incluyendo la decisión explícita para Owner.
  3. Añadir en Privacidad y seguridad la activación de MFA mediante TOTP.
  4. Implementar la asociación del token, mostrar el QR o secreto y exigir un primer código válido antes de activar MFA.
  5. Implementar el reto MFA después de unas credenciales válidas y bloquear el acceso hasta superarlo.
  6. Mostrar mensajes en español, sin errores técnicos como Failed to fetch.
  7. Implementar recuperación segura mediante códigos de recuperación o un procedimiento administrativo verificado; el correo de recuperación por sí solo no sustituye necesariamente un segundo factor perdido.
  8. Registrar en auditoría la activación, desactivación, reto y recuperación sin guardar secretos ni códigos.
  9. Repetir la prueba con un usuario admin nuevo: alta, cierre de sesión, reto correcto, reto incorrecto y recuperación.
  10. Adjuntar capturas censuradas de cada etapa y cambiar ID-07 a OK únicamente cuando el flujo completo funcione.
ID-10 KO

Evidencia ID-10: caducidad de sesión

Comprobar la caducidad de sesión.

Resultado esperado: Solicita autenticación sin perder datos guardados.

2 archivos fuente 1 evidencia visual

Evidencias visuales

01ID-10-sesion-activa-administracion-2026-08-28.pngOriginal

Informe de evidencia

Evidencia ID-10: caducidad de sesión

Fecha de comprobación: 28/08/2026 Entorno: producción (https://signmethod.com/) Perfil observado: Owner

Objetivo

Comprobar que, cuando la sesión caduca, SignMethod solicita autenticación de nuevo y permite continuar sin perder los datos que ya estuvieran guardados.

Comprobación realizada

  1. Se confirmó una sesión autenticada en producción.
  2. Se abrió Administración, lo que confirmó que la aplicación todavía permitía una operación privada.
  3. Se revisó el mecanismo con el que el frontend obtiene la sesión para las peticiones autenticadas.
  4. Se revisó el tratamiento de respuestas no autorizadas, el arranque de la sesión y la configuración declarada del cliente Cognito.
  5. No se inspeccionaron ni modificaron cookies, almacenamiento de autenticación o tokens, y no se forzó la caducidad de la sesión del usuario.

Resultado observado

  • A las 12:47 CEST la sesión seguía activa y permitía abrir el panel de Administración. El panel mostraba actividad de acceso reciente a las 12:39.
  • La aplicación obtiene un token mediante fetchAuthSession() antes de las peticiones privadas.
  • Si no hay token, authHeaders() lanza el error No hay sesión Cognito activa.
  • apiFetch() transforma cualquier respuesta fallida en ApiRequestError, pero no contiene un tratamiento específico de 401 que abra el acceso, conserve el contexto y repita la operación después de autenticarse.
  • En el arranque, el fallo de getCurrentUser() o fetchAuthSession() se ignora mediante un catch sin mostrar una solicitud específica de reautenticación.
  • El cliente Cognito no declara en la infraestructura la duración de los tokens; por tanto, el plazo efectivo depende de los valores del servicio y no está documentado en el proyecto.
  • No se encontró un mecanismo de aviso previo, bloqueo por inactividad, reautenticación con retorno a la acción ni restauración del formulario asociada a la caducidad.

Evidencia visual

La captura confirma únicamente el estado autenticado actual y el acceso a una zona privada; no demuestra por sí sola la caducidad.

Imagen: Sesión activa y acceso a Administración

Conclusión

KO por ausencia de implementación verificable. La sesión activa funciona, pero el proyecto no implementa el comportamiento requerido cuando la sesión ya no puede renovarse: solicitar autenticación y restaurar el trabajo guardado. No se ha manipulado una sesión real para simular la expiración.

Pasos para completar ID-10

  1. Definir y documentar la duración de los tokens, la renovación y el tiempo máximo de inactividad.
  2. Centralizar el tratamiento de sesión ausente y respuestas 401/403.
  3. Mostrar un diálogo en español que explique que la sesión ha caducado y solicite autenticación.
  4. Guardar automáticamente el borrador antes de reautenticar, sin persistir contraseñas, tokens ni campos que no deban conservarse.
  5. Mantener la ruta, empresa activa y acción que estaba realizando el usuario.
  6. Después de autenticarse, recuperar el borrador y volver al punto anterior sin duplicar peticiones.
  7. Evitar bucles de renovación o reintentos infinitos cuando la autenticación falla.
  8. Preparar en un entorno controlado un cliente o una sesión con caducidad corta.
  9. Introducir datos no sensibles en un formulario, esperar a la caducidad y provocar una petición privada.
  10. Comprobar el aviso, reautenticarse y verificar que los datos guardados continúan disponibles.
  11. Repetir con autenticación cancelada, contraseña incorrecta, pestaña recargada y varias pestañas abiertas.
  12. Adjuntar capturas y trazas censuradas del antes, la solicitud de autenticación y la recuperación final.

LIM

Limpieza QA

6 bloques de evidencia
LIM-01 OK

Cancelar acuerdos QA pendientes.

Cancelar acuerdos QA pendientes.

Resultado esperado: No quedan enlaces activos innecesarios.

2 archivos fuente 2 evidencias visuales

Evidencias visuales

01LIM-01-ANTES-ACUERDOS-QA-2026-09-03.pngOriginal
02LIM-01-DESPUES-ACUERDOS-QA-2026-09-03.pngOriginal
LIM-02 OK

Retirar accesos e invitaciones temporales.

Retirar accesos e invitaciones temporales.

Resultado esperado: No quedan permisos QA no autorizados.

2 archivos fuente 2 evidencias visuales

Evidencias visuales

01LIM-02-ANTES-ACCESOS-QA-CENSURADO-2026-09-03.pngOriginal
02LIM-02-DESPUES-ACCESOS-QA-CENSURADO-2026-09-03.pngOriginal
LIM-03 OK

Eliminar o anonimizar los datos QA acordados.

Eliminar o anonimizar los datos QA acordados.

Resultado esperado: Solo se conserva la evidencia aprobada.

1 archivo fuente 1 evidencia visual

Evidencias visuales

01LIM-03-DESPUES-PLANTILLAS-CARPETAS-QA-2026-09-03.pngOriginal
LIM-04 OK

LIM-04 — Auditoría DynamoDB de producción

Confirmar que se conserva la auditoría obligatoria.

Resultado esperado: No se han eliminado evidencias legales necesarias.

2 archivos fuente 1 evidencia visual

Evidencias visuales

01LIM-04-AUDITORIA-APLICACION-2026-09-03.pngOriginal

Informe de evidencia

LIM-04 — Auditoría DynamoDB de producción

Recurso y alcance

  • Región: eu-west-1.
  • Tabla: signmethod-prod-audit.
  • Estado observado: ACTIVE.
  • Validación realizada el 03/09/2026 mediante consultas exclusivamente de lectura.
  • La evidencia visual compartida está censurada y no muestra tenantId, claves, payloads, usuarios ni identificadores internos.

Lote de limpieza identificado

Ventana exacta: 03/09/2026, 11:10:23–11:13:32 UTC.

Tipo de eventoCantidadtypecreatedAttenantIdexpiresAt
signature_request.canceled3PresentePresentePresenteAusente
user.membership.deleted2PresentePresentePresenteAusente
template.deleted2PresentePresentePresenteAusente
template-folder.deleted2PresentePresentePresenteAusente
Total99/99/99/90/9

Los recuentos corresponden exclusivamente al lote de limpieza del 03/09/2026. La tabla conserva otros eventos históricos de los mismos tipos que no forman parte de estos recuentos.

Conservación mediante TTL

La tabla tiene DynamoDB TTL ENABLED sobre el atributo expiresAt. Ninguno de los nueve elementos del lote contiene dicho atributo; por tanto, DynamoDB TTL no los seleccionará para eliminación automática. Permanecerán almacenados hasta una eliminación explícita o una modificación posterior que añada una caducidad.

Dictamen

VALIDADO. Los nueve eventos esperados están persistidos, contienen los campos obligatorios y no están programados para caducar mediante TTL. La auditoría necesaria para acreditar la limpieza se conserva.

Fuente: DynamoDB Scan con proyección limitada, DescribeTable y DescribeTimeToLive; captura censurada aportada durante la validación.

LIM-05 OK

Cerrar sesiones y guardar el acta.

Cerrar sesiones y guardar el acta.

Resultado esperado: No quedan sesiones abiertas.

1 archivo fuente 1 evidencia visual

Evidencias visuales

01LIM-05-SESION-JOEL-CERRADA-2026-09-03.pngOriginal
LIM-GEN OK

Acta de limpieza QA — 03/09/2026

- Entorno: producción de Signmethod. - Ejecución: 03/09/2026, 13:06–13:17 CEST. - Sesión utilizada: Joel López. - Empresas revisadas: pepe y Prueba Produccion . - Autorización: el responsable autorizó expresamente completar las tareas de limpieza pendientes.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

Acta de limpieza QA — 03/09/2026

Alcance

  • Entorno: producción de Signmethod.
  • Ejecución: 03/09/2026, 13:06–13:17 CEST.
  • Sesión utilizada: Joel López.
  • Empresas revisadas: pepe y Prueba Produccion.
  • Autorización: el responsable autorizó expresamente completar las tareas de limpieza pendientes.

LIM-01 — Acuerdos QA pendientes

En pepe se cancelaron, uno por uno y mediante la confirmación de la aplicación, los tres acuerdos QA que mantenían destinatarios pendientes:

  • Prueba Pau 12.
  • Prueba Pau.
  • prueba.

Después de actualizar el listado, las tres filas mostraron el estado Cancelado. Al aplicar el filtro Pendientes (3) no apareció ninguna fila. El número 3 del filtro y del panel no se recalculó, por lo que queda registrado como una inconsistencia visual del contador, no como tres acuerdos todavía activos.

En Prueba Produccion, el filtro Pendientes (1) tampoco devolvió filas. Los cuatro registros QA clasificados como borradores no tienen token y la acción Cancelar está deshabilitada; por ello no generan enlaces de firma activos.

Resultado: OK. No quedan enlaces QA pendientes identificados que puedan utilizarse o reenviarse.

Evidencias:

LIM-02 — Accesos e invitaciones temporales

Se retiraron de pepe las dos pertenencias con estado Invitado y rol firmante. La confirmación de la aplicación indicó que se eliminaba únicamente el registro de acceso a la empresa y que la cuenta Cognito permanecía intacta. Tras actualizar, la empresa pasó de cuatro a dos miembros y de dos a cero firmantes.

Se conservaron los accesos administrativos activos de Joel López y Pau Dengra. Por decisión del responsable, estos accesos y las validaciones adicionales de Pau quedan fuera del alcance de la limpieza.

Resultado: OK. Las invitaciones temporales identificadas están retiradas y no quedan permisos QA no autorizados dentro del alcance acordado.

Evidencias:

LIM-03 — Datos QA

En pepe se retiraron los artefactos reutilizables claramente identificados como QA:

  • Dos plantillas: PLA-10 QA 2026-09-01T08-33-13-831Z y Prueba.
  • Dos carpetas vacías: PLA-QA-PRIVADA-20260828 y PLA-QA-COMPARTIDA-20260828.

La aplicación movió las plantillas a Eliminado, con una ventana local de recuperación de 30 días, y eliminó las carpetas tras comprobar que estaban vacías. Los acuerdos firmados y cancelados se conservaron para no destruir evidencia legal o de auditoría. Los cuatro borradores QA sin token de Prueba Produccion permanecen porque la interfaz no ofrece eliminar y mantiene Cancelar deshabilitado.

Resultado: OK. Se retiraron las plantillas y carpetas QA acordadas. Por decisión del responsable, los cuatro borradores sin token se conservan como evidencia inerte aprobada y no requieren eliminación o anonimización adicional.

Evidencia:

LIM-04 — Auditoría obligatoria

La vista de auditoría de la aplicación mostró los dos eventos user.membership.deleted generados durante la limpieza. La implementación del backend registra además las cancelaciones como signature_request.canceled, las eliminaciones de plantilla como template.deleted y las eliminaciones de carpeta como template-folder.deleted en la tabla DynamoDB signmethod-prod-audit. La tabla tiene TTL configurado sobre expiresAt, pero la función que crea estos eventos no añade ese atributo; por tanto, estos registros no quedan programados para caducar por TTL.

La comprobación posterior en DynamoDB identificó exactamente nueve eventos del lote de limpieza entre las 11:10:23 y las 11:13:32 UTC: tres signature_request.canceled, dos user.membership.deleted, dos template.deleted y dos template-folder.deleted. Los nueve contienen type, createdAt y tenantId; ninguno contiene expiresAt.

Resultado: OK. La conservación está acreditada tanto en la aplicación como en la tabla DynamoDB de producción. Al carecer de expiresAt, los nueve eventos no serán eliminados automáticamente por el TTL configurado.

Evidencia:

LIM-05 — Sesiones y acta

La sesión de Joel utilizada para la limpieza se cerró desde la aplicación y apareció la confirmación Sesión cerrada correctamente. Esta acta y los hashes siguientes conservan el resultado de la ejecución.

Resultado: OK. La sesión de Joel usada durante la ejecución está cerrada y, por decisión del responsable, las sesiones y validaciones adicionales de Pau quedan fuera del alcance.

Evidencia:

Integridad de las evidencias

SHA-256:

text
a78fe1e7ece67d46a6ba3c3b2b065b55875c360517fe392950b366cc1d0da9bc  LIM-01-ANTES-ACUERDOS-QA-2026-09-03.png
2466582c6ca98eb83711e99e0bc4e257ed591a6489931b6f5c288a854a0fcc4d  LIM-01-DESPUES-ACUERDOS-QA-2026-09-03.png
2a138968eb46c29959f220ef4872d277673353e594aa650548cbe698aaa391aa  LIM-02-ANTES-ACCESOS-QA-CENSURADO-2026-09-03.png
c3617f60a25dfa0e85c00144acbc5d4c168aaa65ada3c5c43320f3db7a08a2bd  LIM-02-DESPUES-ACCESOS-QA-CENSURADO-2026-09-03.png
25c7601f328d35740258e939a57dd3c909df076fd8ef3dca98a83e419ee7dab7  LIM-03-DESPUES-PLANTILLAS-CARPETAS-QA-2026-09-03.png
0818fedc2f0ab4b23cdab59132234c9ab7a8d1c7bcaa501d4ed351a8354f2c3d  LIM-04-AUDITORIA-APLICACION-2026-09-03.png
c33545fecd3d450856f4f20df5c0e0df0b6313418daf4cf043331d4f2bef6765  LIM-05-SESION-JOEL-CERRADA-2026-09-03.png

Cierre

Los cinco puntos de limpieza quedan completados dentro del alcance aprobado.

MON

Monitorización

9 bloques de evidencia
MON-00 KO

MON +00 - Control de producción

- Responsable: Joel López. - Fecha y ventana observada: 03/09/2026, 09:53-10:00 CEST. - Entorno: https://signmethod.com/ en la sesión de Chrome abierta. - Método: Playwright para navegación e inspección DOM; CDP únicamente para leer las respuestas de red generadas por las acciones Playwright. - Alcance: comprobaciones de lectura. No se creó, modificó, envió, firmó ni canceló ningún acuerdo.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

MON +00 - Control de producción

Datos de ejecución

  • Responsable: Joel López.
  • Fecha y ventana observada: 03/09/2026, 09:53-10:00 CEST.
  • Entorno: https://signmethod.com/ en la sesión de Chrome abierta.
  • Método: Playwright para navegación e inspección DOM; CDP únicamente para leer las respuestas de red generadas por las acciones Playwright.
  • Alcance: comprobaciones de lectura. No se creó, modificó, envió, firmó ni canceló ningún acuerdo.

Resultado

ÁreaResultadoEvidencia observada
HomeOKLa portada se renderiza y muestra Frontend v2.0.8 · Backend/Lambda v2.0.7.
LoginPARCIALLa sesión ya estaba autenticada como joel.lopez@softradis.com, rol Owner, empresa pepe. Se abrió el panel y las consultas privadas funcionaron, pero no se cerró la sesión ni se repitió la introducción de credenciales.
Rechazo no autorizadoPARCIALUna petición GET /prod/users?companyId=pepe sin cabecera de autorización no expuso datos; el navegador la presentó como net::ERR_FAILED por MissingAllowOriginHeader, sin permitir confirmar el código HTTP 401/403.
ListadoOKEl modal de acuerdos muestra 6 enviados, 3 pendientes, 0 borradores y 1 completado. La actualización ejecutó GET /prod/signature-requests?companyId=pepe y GET /prod/signature-requests/drafts?companyId=pepe, ambos con HTTP 200 tras preflight 204.
Firma públicaPARCIALLa vista /comprobar-token se renderiza. El token ficticio no sensible CONTROL-00-INEXISTENTE-2026-09-03 produjo el 404 esperado y no mostró datos de acuerdos. La interfaz mantiene el mensaje en inglés Agreement not found; no se abrió ni firmó un acuerdo real.
API/LambdaKOGET /prod/health, empresas, usuario, acuerdos y borradores respondieron 200. Las métricas y logs Lambda de la ventana son satisfactorios: 23 invocaciones y 23 líneas REPORT, Errors=0, Throttles=0, sin fallos técnicos, duración máxima 568,71 ms, memoria máxima 122/256 MB y concurrencia máxima 3/10. Los dos ERROR registrados son HttpError 404 funcionales y controlados. La correlación demuestra que los tres OPTIONS /signatures llegaron a API Gateway, pero GET /signatures tuvo Count=0 y no invocó Lambda. Chrome bloqueó el GET porque el preflight solo permite Content-Type,Authorization y no admite cache-control; el frontend también envía pragma y x-owner-email. Además, no existe ninguna alarma CloudWatch para la función. Es la recurrencia del problema ya mencionado en INC-044 y una brecha de monitorización ya identificada en PRE-02.
CognitoPARCIALLa sesión vigente permitió cargar el perfil y los recursos protegidos. No se repitieron login, MFA ni métricas de Cognito.
DynamoDBPARCIALLas lecturas funcionales de empresas, usuario, acuerdos y borradores devolvieron 200; no se consultaron métricas de errores o throttling de DynamoDB.
S3/SESPARCIALSe identificaron signmethod-prod-documents-743737184059 como bucket privado del backend y signmethod-www-743737184059 como origen privado de CloudFront E39W5MD848G7V8. Ambos tienen bloqueo público y SSE-S3; documentos tiene versionado y el bucket web no. Ninguno tiene Request Metrics ni FilterId, server access logging ni CloudTrail Data Events; CloudFront tampoco tiene logging estándar o en tiempo real y no existen trails ni CloudTrail Lake. No hay datos retrospectivos del origen para +00; esta observabilidad S3 es KO. Tampoco existen alarmas S3 o CloudFront ni acciones SNS. CloudFront atendió 3 solicitudes con 4xx/5xx=0 %. Una comprobación posterior confirmó lecturas directas autorizadas S3 (HeadObject=200, Range GetObject=206) y portada CloudFront 200, sin modificar objetos. El objeto privado era JSON y no un PDF abierto desde Signmethod mediante URL firmada. Todavía falta esa validación aplicativa. SES continúa sin verificar.

Tráfico relevante

  • GET /prod/health: 200.
  • GET /prod/companies: 200.
  • GET /prod/users?email=<redactado>: 200.
  • GET /prod/signature-requests?companyId=pepe: 200.
  • GET /prod/signature-requests/drafts?companyId=pepe: 200.
  • GET /prod/public-agreements/CONTROL-00-INEXISTENTE-2026-09-03: 404 esperado.
  • GET /prod/signatures: fallo de navegador tras preflight 204; HeaderDisallowedByPreflightResponse, parámetro cache-control.

Punto 2 - Métricas Lambda

  • Función: signmethod-prod-admin-api.
  • Región: eu-west-1.
  • Ventana: 03/09/2026, 07:53-08:00 UTC.
  • Periodo: 1 minuto; no fue necesario ampliar la ventana.
  • Invocations (Sum): 23 (07:54=2, 07:56=1, 07:57=6, 07:58=7, 07:59=7).
  • Errors (Sum): 0.
  • Throttles (Sum): 0.
  • Duration: media 176,13 ms, p95 535,57 ms, p99 561,83 ms y máximo 568,71 ms.
  • ConcurrentExecutions (Maximum): 3 sobre un límite disponible de cuenta de 10; margen de 7 ejecuciones.
  • Referencia de 24 horas: media 160,47 ms, p95 565,35 ms, p99 642,19 ms y máximo 801,37 ms. La media de la ventana fue aproximadamente un 9,8 % superior, pero los percentiles altos y el máximo fueron inferiores; no se aprecia una desviación anómala.
  • Timeout configurado: 15 segundos. El máximo observado representa aproximadamente el 3,8 % del timeout.
  • Memoria configurada: 256 MB; la memoria realmente utilizada se comprobará en los logs del punto 3.
  • No hay concurrencia reservada específica.
  • DeadLetterErrors: sin puntos; no hay DLQ configurada, no aplicable.
  • DestinationDeliveryFailures: sin puntos; no hay destinos asíncronos configurados, no aplicable.
  • IteratorAge: no aplicable porque no existen event source mappings basados en streams.

Conclusión: las métricas Lambda del control +00 son satisfactorias. Este resultado no elimina el KO del apartado combinado API/Lambda, porque /prod/signatures sigue bloqueado por CORS antes de completar la solicitud y todavía faltan la correlación del fallo y las alarmas.

Punto 3 - Logs Lambda

  • Grupo: /aws/lambda/signmethod-prod-admin-api.
  • Región: eu-west-1.
  • Ventana: 03/09/2026, 07:53-08:00 UTC.
  • Eventos examinados: 74; no fue necesario ampliar la ventana.
  • Task timed out: 0.
  • Runtime.ExitError: 0.
  • Runtime exited: 0.
  • Unhandled, uncaughtException y unhandledRejection: 0.
  • Process exited: 0.
  • Errores de memoria (out of memory, ENOMEM o heap): 0.
  • Fallos o timeouts asociados a DynamoDB, S3, Cognito o SES: 0.
  • Marcadores ERROR: 2. Ambos son HttpError: Agreement not found, statusCode=404, a las 07:58:37 y 07:59:06 UTC. Corresponden a rechazos funcionales controlados de acuerdos inexistentes; no son errores de runtime, dependencias ni respuestas 5xx.
  • Líneas REPORT: 23, coincidentes con las 23 invocaciones del punto 2.
  • Duration: media 176,13 ms, p95 537,34 ms, p99 568,71 ms y máximo 568,71 ms.
  • Billed Duration: media 249,04 ms y máximo 1.138 ms.
  • Memoria configurada: 256 MB.
  • Max Memory Used: 122 MB (47,7 %); margen aproximado de 134 MB.
  • Cold starts: 3 de 23 (13,0 %).
  • Init Duration: media 555,11 ms y p95/máximo 568,92 ms.
  • El mayor Billed Duration incluye inicialización y no representa tiempo íntegro del handler.
  • Duración máxima frente al timeout de 15 segundos: aproximadamente 3,8 %.

CloudWatch Logs Insights calcula percentiles mediante pct; esto explica la pequeña diferencia entre sus valores y los percentiles interpolados de CloudWatch Metrics del punto 2.

Conclusión: los logs Lambda del control +00 cumplen el resultado esperado. No existen timeouts, errores de runtime, excepciones no controladas, presión de memoria ni fallos de dependencias. La tasa de cold starts queda registrada para la evaluación conjunta posterior.

Punto 4 - Correlación de /prod/signatures

  • API: signmethod-prod-admin-api.
  • Stage: prod.
  • Región: eu-west-1.
  • Ventana principal: 03/09/2026, 07:53-08:00 UTC.
  • Ventana ampliada comprobada: 07:48-08:05 UTC; el resultado no cambia.
  • Periodo: 1 minuto.
Métricas detalladas de API Gateway
  • GET /signatures: Count=0 o sin datapoints; sin puntos para 4XXError, 5XXError, Latency o IntegrationLatency.
  • OPTIONS /signatures: Count=3, una solicitud en cada minuto 07:57, 07:58 y 07:59 UTC.
  • OPTIONS /signatures: 4XXError=0 y 5XXError=0.
  • Latencia de los tres preflight: 2, 4 y 2 ms; media de los puntos 2,67 ms.
  • Los logs Lambda contienen las 23 ejecuciones de otras rutas, pero ninguna referencia a /signatures.
Configuración observada
  • GET /signatures usa autorización COGNITO_USER_POOLS e integración AWS_PROXY con signmethod-prod-admin-api.
  • OPTIONS /signatures no requiere autorización y usa integración MOCK; no invoca Lambda.
  • El preflight responde 204 con Access-Control-Allow-Origin: *.
  • Access-Control-Allow-Headers solo permite Content-Type,Authorization.
  • Access-Control-Allow-Methods permite OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD.
  • Las respuestas de Gateway UNAUTHORIZED, ACCESS_DENIED, EXPIRED_TOKEN, DEFAULT_4XX, DEFAULT_5XX y equivalentes no añaden cabeceras CORS.
  • El stage no tiene access logging configurado.
  • X-Ray está habilitado en el stage, pero no se recuperaron trazas para esta ventana.
Correlación con Chrome y conclusión

Chrome registró los preflight 204 y después Network.loadingFailed con net::ERR_FAILED, HeaderDisallowedByPreflightResponse y parámetro fallido cache-control. El frontend envía cache-control, pragma y x-owner-email, además de Content-Type y Authorization; API Gateway solo autoriza estas dos últimas.

La evidencia combinada permite concluir que los tres OPTIONS llegaron correctamente a la integración MOCK, pero Chrome rechazó la respuesta de preflight por su allowlist incompleta y no envió el GET. Por eso GET /signatures no tiene datapoints, no presenta IntegrationLatency y no invocó Lambda. La ausencia de CORS en las respuestas de error de autorización es una carencia adicional, pero no explica la petición observada porque el GET no llegó a enviarse.

Conclusión: Lambda no falla en /prod/signatures; la indisponibilidad observada pertenece a la configuración CORS de API Gateway y al contrato de cabeceras con el frontend. No se modificó producción.

Punto 5 - Alarmas Lambda

  • Función: signmethod-prod-admin-api.
  • Región: eu-west-1.
  • Alcance: inventario regional completo de alarmas métricas y compuestas, mediante consulta de solo lectura.
  • Alarmas métricas totales en la región: 6; todas pertenecen a otros servicios o cargas ajenas a Signmethod.
  • Alarmas compuestas totales: 0.
  • Alarmas con namespace AWS/Lambda: 0.
  • Alarmas con dimensión FunctionName=signmethod-prod-admin-api: 0.
  • Alarmas cuyo nombre o descripción referencia la función: 0.
  • Alarmas compuestas cuya regla referencia la función: 0.

No existe cobertura automática para:

  • Errors.
  • Throttles.
  • Duration p95, p99 o máximo.
  • ConcurrentExecutions.
  • Ausencia de invocaciones o anomalías de tráfico.
  • Errores de API Gateway vinculados con la función.

Al no existir recursos de alarma, no puede asignarse un estado histórico OK, ALARM o INSUFFICIENT_DATA para la ventana +00, ni existe una acción SNS o suscripción asociada que revisar. Esto no contradice las métricas y logs satisfactorios: demuestra que CloudWatch no está configurado para avisar automáticamente si la situación cambia.

Conclusión: el punto 5 queda comprobado con resultado KO por ausencia completa de alarmas Lambda. No representa una incidencia activa durante la ventana, sino una brecha de monitorización. Crear las alarmas requeriría modificar infraestructura y quedó fuera de esta comprobación de solo lectura.

Punto 6 - Inventario de S3 y CloudFront

Bucket de documentos
  • Nombre: signmethod-prod-documents-743737184059.
  • Región: eu-west-1.
  • Recurso DocumentsBucket del stack SignmethodBackend-prod.
  • Creado el 27/08/2026 a las 08:57 UTC.
  • Almacenamiento privado utilizado por el backend; no es origen de la distribución web identificada.
  • Website hosting no configurado.
  • Bloqueo de acceso público activo en las cuatro opciones y política evaluada como no pública.
  • Cifrado predeterminado SSE-S3 (AES256).
  • Versionado habilitado.
Bucket del frontend
  • Nombre: signmethod-www-743737184059.
  • Región: eu-west-1.
  • Origen S3 de la distribución que sirve signmethod.com.
  • Creado el 29/04/2026 a las 19:52 UTC.
  • Website hosting no configurado; se utiliza el endpoint REST privado.
  • Bloqueo de acceso público activo en las cuatro opciones y política evaluada como no pública.
  • Cifrado predeterminado SSE-S3 (AES256).
  • Versionado no habilitado; esta carencia ya está recogida en PRE-02.
Distribución CloudFront
  • ID: E39W5MD848G7V8.
  • Estado Deployed y distribución habilitada.
  • Alias: signmethod.com y www.signmethod.com.
  • Origen: signmethod-www-743737184059.s3.eu-west-1.amazonaws.com.
  • Origin Access Control presente; no usa acceso público ni OAI legado.
  • Redirección de HTTP a HTTPS.
  • HTTP/2 y HTTP/3; TLS mínimo TLSv1.2_2021.
  • Métodos permitidos: GET y HEAD.
  • Compresión habilitada.
  • Documento raíz: index.html.
  • Fallback SPA: errores 403 y 404 transformados en /index.html con HTTP 200 y TTL de error de 10 segundos.

La relación funcional queda identificada como navegador → CloudFront → bucket web y backend/Lambda → bucket privado de documentos. No existe una distribución CloudFront asociada al bucket de documentos dentro del alcance identificado. Otros buckets históricos o de otros entornos quedan fuera del control +00. La revisión fue exclusivamente de lectura y no modificó producción.

Conclusión: el inventario requerido queda completado. Todavía deben comprobarse la configuración de Request Metrics, sus datos durante la ventana, las alarmas y una lectura funcional censurada.

Punto 7 - S3 Request Metrics y FilterId

  • Región: eu-west-1.
  • Recursos revisados: signmethod-prod-documents-743737184059 y signmethod-www-743737184059.
  • Consulta exclusivamente de lectura.
Bucket de documentos
  • Configuraciones de métricas S3: 0.
  • Request Metrics: no habilitadas.
  • FilterId: no existe o no aplica.
  • Series de solicitud visibles en CloudWatch: 0.
  • Solo aparecen las métricas automáticas diarias BucketSizeBytes (StorageType=StandardStorage) y NumberOfObjects (StorageType=AllStorageTypes).
Bucket del frontend
  • Configuraciones de métricas S3: 0.
  • Request Metrics: no habilitadas.
  • FilterId: no existe o no aplica.
  • Series de solicitud visibles en CloudWatch: 0.
  • Solo aparecen las métricas automáticas diarias BucketSizeBytes (StorageType=StandardStorage) y NumberOfObjects (StorageType=AllStorageTypes).

En ninguno de los buckets están disponibles AllRequests, GetRequests, PutRequests, DeleteRequests, HeadRequests, 4xxErrors, 5xxErrors, FirstByteLatency, TotalRequestLatency, BytesDownloaded o BytesUploaded.

ListBucketMetricsConfigurations confirma de forma autoritativa que no existen configuraciones, independientemente de que hubiera o no tráfico. La ausencia de series de solicitud en CloudWatch lo corrobora. Las métricas diarias de almacenamiento no tienen dimensión FilterId y no permiten analizar la ventana +00 con periodo de un minuto.

Conclusión: el punto 7 queda comprobado con resultado KO por ausencia de observabilidad S3 por solicitudes. No será posible recuperar retrospectivamente esas métricas para 07:53-08:00 UTC. Habilitarlas implicaría un cambio de configuración con coste y no se realizó durante esta revisión.

Punto 8 - Métricas del bucket de documentos

  • Bucket: signmethod-prod-documents-743737184059.
  • Región: eu-west-1.
  • Ventana principal: 03/09/2026, 07:53-08:00 UTC.
  • Periodo solicitado: 1 minuto.
  • Ventana ampliada: 07:48-08:05 UTC; no aporta datos adicionales.
  • Consulta exclusivamente de lectura.

No existen datapoints, ni en la ventana principal ni en la ampliada, para:

  • AllRequests, GetRequests, PutRequests, DeleteRequests, HeadRequests, PostRequests o ListRequests.
  • 4xxErrors o 5xxErrors.
  • BytesDownloaded o BytesUploaded.
  • FirstByteLatency o TotalRequestLatency.

La ausencia no significa tráfico o errores iguales a cero. Como se demostró en el punto 7, el bucket tiene cero configuraciones de Request Metrics y no dispone de FilterId; CloudWatch no recopiló esas series y no permite reconstruir el rendimiento de la ventana +00.

Métricas diarias disponibles

Última muestra anterior al control, correspondiente al 02/09/2026 a las 00:00 UTC:

  • BucketSizeBytes, Average, StandardStorage: 5.405.502 bytes, aproximadamente 5,16 MiB.
  • NumberOfObjects, Average, AllStorageTypes: 53 objetos/versiones.

Serie reciente:

  • Del 29/08 al 01/09: 4.959.054 bytes y 14 objetos/versiones.
  • 02/09: 5.405.502 bytes y 53 objetos/versiones.
  • Variación: +446.448 bytes y +39 objetos/versiones.

El bucket tiene versionado habilitado, por lo que NumberOfObjects puede incluir versiones y marcadores de eliminación y no equivale necesariamente al número de claves actualmente visibles. Estas métricas son diarias y no describen la ventana de siete minutos.

Conclusión: el rendimiento del bucket de documentos durante +00 es NO EVALUABLE mediante CloudWatch. Solo se acredita que la última muestra diaria contenía aproximadamente 5,16 MiB y 53 objetos/versiones. No debe interpretarse como cero errores ni como una incidencia activa. La búsqueda de errores mediante CloudTrail Data Events o registros equivalentes se reserva para el punto 11.

Punto 9 - Frontend S3 y CloudFront

  • Bucket de frontend: signmethod-www-743737184059.
  • Distribución: E39W5MD848G7V8.
  • Namespace CloudFront global consultado en us-east-1.
  • Ventana principal: 03/09/2026, 07:53-08:00 UTC.
  • Periodo: 1 minuto.
  • Ventana ampliada: 07:48-08:05 UTC; devuelve los mismos valores.
Métricas CloudFront
  • Requests (Sum): 3; una solicitud en cada minuto 07:57, 07:58 y 07:59 UTC.
  • BytesDownloaded (Sum): 3.327 bytes (1.111, 1.109 y 1.107 bytes respectivamente).
  • BytesUploaded (Sum): 0 bytes.
  • 4xxErrorRate (Average y Maximum): 0 % en los tres minutos.
  • 5xxErrorRate (Average y Maximum): 0 % en los tres minutos.
  • TotalErrorRate (Average y Maximum): 0 % en los tres minutos.
Limitaciones del origen
  • El bucket S3 no publica datapoints de AllRequests, GetRequests, 4xxErrors, 5xxErrors, FirstByteLatency, TotalRequestLatency o BytesDownloaded porque Request Metrics no está habilitado.
  • OriginLatency y CacheHitRate no están disponibles porque la distribución no tiene monitorización adicional habilitada.
  • Standard logging de CloudFront está deshabilitado; no existen códigos de origen por petición.
  • El fallback SPA transforma errores 403 y 404 del origen en /index.html con respuesta HTTP 200. Por ello, el 0 % de errores al viewer no descarta una recuperación SPA interna.
  • No se aportaron en este punto los últimos valores diarios de BucketSizeBytes y NumberOfObjects del bucket web. Son datos informativos de capacidad y no cambian la evaluación de la ventana.

Conclusión: CloudFront atendió tres solicitudes sin devolver errores 4xx o 5xx al cliente y no existe evidencia de un fallo visible del frontend. Los errores individuales del origen no pueden aislarse sin Request Metrics S3, métricas adicionales o access logs. El punto queda PARCIAL: correcto desde la perspectiva del viewer, no concluyente para el origen. No se modificó producción.

Punto 10 - Lectura funcional sin modificaciones

  • Prueba ejecutada el 03/09/2026 aproximadamente a las 08:50 UTC, fuera de la ventana histórica +00.
  • No se generaron ni mostraron URLs firmadas.
  • Las claves, contenido, ETag y VersionId potencialmente sensibles permanecieron censurados.
Bucket de documentos
  • Bucket: signmethod-prod-documents-743737184059.
  • Se localizó un objeto existente mediante una operación de listado de solo lectura.
  • HeadObject: HTTP 200.
  • GetObject con rango bytes=0-0: HTTP 206 y un byte leído.
  • Content-Range: bytes 0-0/424.
  • Tipo: application/json; charset=utf-8.
  • El bucket tiene versionado habilitado.
  • ETag, tamaño y LastModified permanecieron iguales antes y después.
  • La operación demuestra lectura autorizada del bucket, pero no valida la apertura de un PDF desde Signmethod ni el uso de una URL firmada generada por la aplicación.
Bucket del frontend
  • Bucket: signmethod-www-743737184059.
  • Objeto: index.html.
  • HeadObject: HTTP 200.
  • GetObject con rango bytes=0-0: HTTP 206 y un byte leído.
  • Content-Range: bytes 0-0/684.
  • Tipo: text/html.
  • ETag, tamaño y LastModified permanecieron iguales antes y después.
Frontend público mediante CloudFront
  • GET https://signmethod.com/: HTTP 200.
  • Tipo: text/html.
  • Tamaño recibido: 684 bytes.
  • X-Cache: RefreshHit from cloudfront y cabecera Via presente.
  • El cuerpo no se guardó ni se incluyó en la evidencia; solo se calculó un hash en memoria para comprobar la recepción completa.

No se ejecutaron operaciones PUT, POST, DELETE, COPY, multipart upload ni escrituras locales de contenido. Las únicas operaciones S3 fueron ListObjectsV2, HeadObject y GetObject de un byte. Los metadatos permanecieron sin cambios.

Conclusión: las lecturas directas autorizadas de ambos buckets y la entrega pública de CloudFront fueron satisfactorias y no modificaron archivos ni infraestructura. El punto queda PARCIAL respecto a la comprobación originalmente solicitada, porque el objeto privado era JSON y no se verificó un PDF QA mediante una URL firmada emitida por Signmethod.

Punto 11 - Registros S3, CloudFront y CloudTrail

S3 server access logging
  • signmethod-prod-documents-743737184059: deshabilitado.
  • signmethod-www-743737184059: deshabilitado.
  • Ninguno tiene LoggingEnabled, bucket de destino ni prefijo de logs.
Registros CloudFront
  • Distribución: E39W5MD848G7V8.
  • Standard logging: deshabilitado; no hay bucket ni prefijo de destino.
  • Real-time logging: no asociado al comportamiento por defecto ni a comportamientos adicionales.
CloudTrail y Data Events
  • Regiones habilitadas comprobadas: 17.
  • Trails encontrados: 0.
  • CloudTrail Lake Event Data Stores encontrados: 0.
  • No existe ningún selector de Data Events para AWS::S3::Object, ni específico para los dos buckets ni global.
  • CloudTrail Event History registra eventos de administración, pero no sustituye los Data Events necesarios para observar accesos a objetos S3.

Para la ventana 03/09/2026, 07:53-08:00 UTC, no existe una fuente histórica que permita recuperar operaciones GetObject, PutObject, HeadObject u otras, códigos de respuesta S3, errores de autorización, identidad solicitante, clave afectada, latencia del origen o correlación exacta entre CloudFront y S3. Las lecturas del punto 10 ocurrieron después de esa ventana y no permiten reconstruirla.

Conclusión: el punto 11 queda comprobado con resultado KO por ausencia de logs S3, logs CloudFront, trails y CloudTrail Data Events. Los posibles errores del origen no pueden reconstruirse retrospectivamente. Es una brecha de observabilidad y no evidencia de que ocurriera un error. Activar estas fuentes implicaría cambios de configuración y posible coste; no se modificó producción.

Punto 12 - Alarmas S3 y CloudFront

S3 en eu-west-1
  • Alarmas métricas totales de la cuenta: 6; pertenecen a cargas ajenas a Signmethod.
  • Alarmas compuestas: 0.
  • Alarmas con namespace AWS/S3: 0.
  • Alarmas que referencian signmethod-prod-documents-743737184059 o signmethod-www-743737184059: 0.
CloudFront en us-east-1
  • Alarmas métricas totales: 0.
  • Alarmas compuestas: 0.
  • Alarmas con namespace AWS/CloudFront: 0.
  • Alarmas que referencian E39W5MD848G7V8: 0.

No existe cobertura automática para errores 4xx/5xx de S3, latencias o volumen de solicitudes S3, tasas 4xx/5xx/TotalErrorRate de CloudFront, anomalías de tráfico, errores del origen o disponibilidad del frontend. Al no existir recursos de alarma, tampoco hay estados OK, ALARM o INSUFFICIENT_DATA, acciones SNS, notificaciones ni escalado que revisar.

Conclusión: el punto 12 queda comprobado con resultado KO por ausencia completa de alarmas S3 y CloudFront. Es una brecha de monitorización y no una alarma activa ni prueba de ausencia histórica de errores. Crear alarmas S3 por solicitud exigiría habilitar primero Request Metrics; no se modificó producción.

Punto 13 - Dictamen global Lambda

Dictamen: OPERATIVAMENTE OK, CON OBSERVACIONES.

Evidencias favorables durante +00:

  • Invocaciones: 23.
  • Errors: 0.
  • Throttles: 0.
  • Duration Average: 176,13 ms.
  • Duration p95/p99: 535,57/561,83 ms en CloudWatch Metrics.
  • Duration Maximum: 568,71 ms, aproximadamente el 3,8 % del timeout de 15 segundos.
  • Concurrencia máxima: 3; margen disponible observado de 7 ejecuciones.
  • Memoria máxima: 122/256 MB (47,7 %).
  • Cold starts: 3 de 23 (13,0 %); Init Duration máxima 568,92 ms.
  • Timeouts, errores de runtime, excepciones no controladas y fallos DynamoDB, S3, Cognito o SES: 0.
  • Los dos HttpError registrados fueron respuestas 404 funcionales y controladas, no fallos Lambda.

Observaciones que impiden un OK sin reservas:

  • GET /prod/signatures no invocó Lambda: API Gateway registró tres OPTIONS y ningún GET para esa ruta.
  • Chrome bloqueó el GET por la allowlist incompleta del preflight CORS. Además, las Gateway Responses de autorización o error carecen de cabeceras CORS.
  • No existe ninguna alarma para Lambda; una degradación futura no produciría aviso automático.

Conclusión: la función estuvo sana y con margen suficiente durante la ventana. No hay evidencia de que Lambda causara el fallo de /signatures. Su runtime queda OPERATIVAMENTE OK, CON OBSERVACIONES; la monitorización automática permanece KO. El apartado combinado API/Lambda continúa KO por el defecto de entrada CORS/API Gateway y la ausencia de alarmas. No se modificó producción.

Punto 14 - Dictamen global S3 y CloudFront

Dictamen: DISPONIBILIDAD ACTUAL OK; COMPORTAMIENTO HISTÓRICO +00 NO CONCLUYENTE.

Evidencias favorables:

  • Ambos buckets usan cifrado SSE-S3 (AES256) y bloqueo completo del acceso público.
  • El bucket de documentos tiene versionado habilitado.
  • CloudFront está desplegado y habilitado, fuerza HTTPS y accede al bucket web privado mediante Origin Access Control.
  • Durante +00, CloudFront registró 3 solicitudes y 3.327 bytes descargados.
  • 4xxErrorRate, 5xxErrorRate y TotalErrorRate al viewer fueron 0 %.
  • Las lecturas actuales devolvieron 206 para el objeto privado de documentos y index.html, y 200 para https://signmethod.com/ mediante CloudFront.
  • Los objetos comprobados permanecieron sin cambios.

Brechas que impiden certificar el origen durante +00:

  • Request Metrics y FilterId no existen en ninguno de los buckets.
  • No hay métricas S3 por solicitud, errores o latencia.
  • S3 server access logging está deshabilitado.
  • CloudFront standard logging y real-time logging están deshabilitados.
  • No existen trails ni CloudTrail Lake Event Data Stores en las 17 regiones habilitadas comprobadas.
  • No existen alarmas S3 o CloudFront.
  • El bucket del frontend no tiene versionado habilitado.
  • El fallback SPA transforma errores 403 y 404 del origen en /index.html con respuesta 200, por lo que un 0 % de errores al viewer no demuestra por sí solo que el origen no produjera errores internos.
  • La lectura privada actual utilizó un objeto JSON mediante credenciales autorizadas; no se abrió un PDF QA mediante una URL firmada emitida por Signmethod.

Conclusión: S3 y CloudFront funcionan en las comprobaciones actuales y CloudFront no mostró errores visibles durante +00. Sin embargo, la tasa histórica de error y la latencia del origen S3 no pueden certificarse retrospectivamente. El estado correcto es NO CONCLUYENTE para el origen durante +00, no cero errores S3. La validación de infraestructura actual queda OK, mientras que la observabilidad permanece KO y la validación aplicativa del PDF sigue PARCIAL. No se realizaron cambios.

Punto 15 - Paquete consolidado de evidencias

El usuario declara completado un paquete ZIP con el siguiente contenido:

  • REPORT.md: informe ejecutivo y resultado de los 15 puntos.
  • MANIFEST-SHA256.txt: hash individual de cada artefacto.
  • 15 imágenes PNG, una por cada punto del plan.
  • Total declarado dentro del ZIP: 17 archivos.
  • Tamaño declarado: 1.443.014 bytes, aproximadamente 1,38 MiB.
  • SHA-256 declarado del ZIP: 8bdeba69c7cea8d738f49023b04e3570bbc20834f7dd076514c9a57a334b5ed0.
  • Prueba de integridad interna declarada: correcta, sin miembros dañados.
Verificación en el repositorio

El archivo observation-plus00-evidence-2026-09-03.zip está presente en el repositorio y se validó localmente antes de versionarlo:

  • Tamaño comprobado: 1.443.014 bytes.
  • SHA-256 comprobado: 8bdeba69c7cea8d738f49023b04e3570bbc20834f7dd076514c9a57a334b5ed0.
  • Miembros comprobados: 17 (REPORT.md, MANIFEST-SHA256.txt y 15 PNG).
  • Lectura completa de todos los miembros: correcta.
  • Entradas verificadas contra MANIFEST-SHA256.txt: 16 de 16 correctas; el manifiesto no se incluye a sí mismo.

Conclusión: los 15 puntos han sido informados como completados y el paquete material de evidencias queda disponible, íntegro y verificado en el repositorio.

Limitaciones y seguimiento

El control no permite declarar estable la monitorización completa de las primeras dos horas. Ya se han validado las métricas y los logs Lambda, se ha correlacionado el fallo /prod/signatures y se ha confirmado el KO por ausencia de alarmas Lambda. En S3 se ha demostrado que no existen Request Metrics ni fuentes alternativas de registro, y el punto 12 confirmó también la ausencia de alarmas S3 y CloudFront. Queda pendiente la apertura de un PDF QA mediante una URL firmada emitida por Signmethod. CloudFront mostró 4xx/5xx=0 % al viewer, pero el origen no es reconstruible. También quedan pendientes otras métricas y alarmas de API Gateway, Cognito, DynamoDB y SES, además de entregas y rebotes de correo. El ZIP consolidado del punto 15 sí está disponible en el repositorio y su integridad fue verificada.

No se abre una incidencia nueva por /prod/signatures, ya que el fallo ya está recogido en INC-044; esta ejecución confirma que continúa reproducible.

MON-15 KO

MON +15 - Control de producción

- Responsable: Pau Dengra. - Ventana del informe aportado: 03/09/2026, 08:28-08:54 UTC (10:28-10:54 CEST). - Consulta retrospectiva de AWS: 03/09/2026, 10:22 UTC, en modo de solo lectura. - Verificación con Playwright en Chrome: 03/09/2026, aproximadamente 10:35-11:54 CEST, con una pausa para que Pau introdujera personalmente sus credenciales y completara el acceso. - Entorno: https://signmethod.com/ en la sesión de Chrome abierta. - Método: contraste de los informes aportados con navegación e inspección DOM mediante Playwright y consulta retrospectiva de métricas AWS. - Alcance: la revisión AWS fue exclusivamente de lectura y no modificó producción. La revalidación funcional posterior sí creó, envió y firmó el acuerdo sintético indicado en este documento.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

MON +15 - Control de producción

Datos de ejecución

  • Responsable: Pau Dengra.
  • Ventana del informe aportado: 03/09/2026, 08:28-08:54 UTC (10:28-10:54 CEST).
  • Consulta retrospectiva de AWS: 03/09/2026, 10:22 UTC, en modo de solo lectura.
  • Verificación con Playwright en Chrome: 03/09/2026, aproximadamente 10:35-11:54 CEST, con una pausa para que Pau introdujera personalmente sus credenciales y completara el acceso.
  • Entorno: https://signmethod.com/ en la sesión de Chrome abierta.
  • Método: contraste de los informes aportados con navegación e inspección DOM mediante Playwright y consulta retrospectiva de métricas AWS.
  • Alcance: la revisión AWS fue exclusivamente de lectura y no modificó producción. La revalidación funcional posterior sí creó, envió y firmó el acuerdo sintético indicado en este documento.

La ejecución se conserva como control +15, aunque la ventana real quedó desplazada respecto al intervalo nominal de quince minutos posterior al control +00 (09:53-10:00 CEST). Esta desviación debe considerarse al evaluar la continuidad temporal de la monitorización.

Resultado

ÁreaResultadoEvidencia observada
HomeOKEl informe inicial registra 10/10 peticiones HTTP 200, media de 81 ms y máxima de 155 ms. La consulta retrospectiva registra 42 solicitudes de CloudFront y 0 % de errores totales, 4xx y 5xx. Playwright confirmó que la portada se renderiza sin errores de consola y muestra Frontend v2.0.8 · Backend/Lambda v2.0.7.
LoginOKSe cerró la sesión vigente y la aplicación confirmó Sesión cerrada correctamente. Pau introdujo personalmente las credenciales y completó el acceso; Playwright confirmó la vuelta al panel como pau.dengra@softradis.com, rol Administrador, empresa Prueba Produccion, y el evento visible auth.login · Sesión Cognito iniciada a las 11:46 CEST. No se conservaron credenciales ni códigos MFA.
Rechazo no autorizadoOKEl informe aportado registra una petición privada sin credenciales rechazada con 401 Unauthorized. La apertura directa del dominio de API desde la extensión de Chrome fue bloqueada con net::ERR_BLOCKED_BY_CLIENT, por lo que Playwright no repitió ni alteró esta comprobación.
ListadoOKPlaywright abrió y actualizó el modal Acuerdos desde la sesión de Pau. Antes del seguimiento se mostraron 8 elementos. Tras crear y firmar el acuerdo QA se mostraron 9 elementos, con Pendientes (1) y Completado (2). El acuerdo QA MON-15 firma completa 2026-09-03 figura como Firmado, con 1 destinatario enviado y 1 firma, sin errores de consola en la confirmación final. La extensión no expuso los códigos HTTP de las peticiones generadas, de modo que el resultado acredita la respuesta funcional de la interfaz, no una captura independiente del tráfico.
Firma públicaOKEl informe aportado registra el rechazo controlado de un enlace inválido con HTTP 410, y Playwright confirmó además que un token ficticio no sensible no revelaba datos. Para cerrar el caso positivo se creó el acuerdo QA MON-15 firma completa 2026-09-03 desde una plantilla QA existente, con el documento ficticio FIR-07-documento-QA-produccion.pdf, un destinatario y un campo obligatorio de firma. SignMethod confirmó el envío a 1 destinatario; Gmail recibió el correo a las 11:51 CEST. El enlace vigente cargó el acuerdo, se aplicó una firma guardada de Pau al campo obligatorio y la aplicación confirmó Se ha firmado el acuerdo correctamente. El listado final muestra el acuerdo como Firmado, con 1 destinatario y 1 firma. No se conservaron ni publicaron el token o la firma.
API/LambdaOKEl informe inicial registra 10/10 respuestas 200 en health, CORS 204, latencia pública máxima de API de 193 ms y respuesta ok:true de signmethod-admin-api versión 2.0.7. La consulta retrospectiva de la ventana acredita 18 invocaciones, 0 errores, 0 throttles, duración media de 69,48 ms, máxima de 145,3 ms y concurrencia máxima 2. Se revisaron 60 eventos de log; los tres registros ERROR corresponden a respuestas 410 esperadas de enlaces inválidos, no a fallos internos. La ausencia de alarmas se mantiene como carencia general de observabilidad.
CognitoKO observabilidadPau completó personalmente el inicio de sesión y el segundo factor; Playwright confirmó el panel autenticado y el evento auth.login, por lo que Login permanece OK. Sin embargo, durante la ventana no hubo puntos de autenticación ni alarmas de Cognito. La columna específica Cognito del plan queda KO porque evalúa esa observabilidad retrospectiva.
DynamoDBKOLas nueve tablas signmethod-prod-* estaban ACTIVE y en modo PAY_PER_REQUEST, pero registraron consumo 0 y, por falta de tráfico, no emitieron datos que permitan acreditar latencia, errores o throttling durante la ventana. Tampoco existen alarmas. El KO expresa ausencia de evidencia de monitorización, no una caída.
S3/SESPARCIALCloudFront acredita la entrega web con 42 solicitudes y 0 % de errores totales, 4xx y 5xx. Los tres buckets revisados no tenían Request Metrics. SES no registró envíos, entregas, rebotes, quejas o rechazos y carece de configuration sets, event destinations y alarmas.

Datos aportados y contraste retrospectivo

  • Home: 10/10 respuestas 200, media 81 ms, máxima 155 ms.
  • API health: 10/10 respuestas 200; preflight CORS 204 en endpoints principales.
  • API pública: latencia máxima 193 ms.
  • Health Lambda: ok:true, servicio signmethod-admin-api, versión 2.0.7.
  • Rechazo sin credenciales: 401 Unauthorized.
  • Enlace inválido: HTTP 410.
  • CloudFront: 42 solicitudes y 0 % de errores totales, 4xx y 5xx durante la ventana.
  • Lambda: 18 invocaciones, 0 errores, 0 throttles, duración media 69,48 ms, máxima 145,3 ms y concurrencia máxima 2.
  • Logs Lambda: 60 eventos; tres registros ERROR asociados a respuestas 410 esperadas.
  • DynamoDB: nueve tablas ACTIVE y PAY_PER_REQUEST, sin tráfico ni alarmas.
  • S3: tres buckets sin Request Metrics.
  • SES: sin actividad, configuration sets, event destinations ni alarmas.
  • Alarmas generales: ninguna asociada a Lambda, DynamoDB, S3, SES o Cognito de SignMethod.

Las cifras AWS se atribuyen al nuevo informe retrospectivo recibido; el archivo evidence/control15-aws-metrics-2026-09-03.json citado en ese informe no estaba presente en este workspace al integrar los resultados. Playwright confirmó de forma independiente el estado visible de home, sesión, panel, listado y los flujos de firma, pero no fue la fuente de la telemetría interna de AWS.

Conclusión y seguimiento

El resultado global del control +15 continúa siendo KO de monitorización, no una caída del servicio. Home, API/Lambda, Cognito, listado y firma pública completa quedaron funcionalmente operativos, y las métricas de Lambda de la ventana están acreditadas por el nuevo informe. La revalidación de login y firma se realizó después de la ventana aportada y no sustituye la cadencia nominal del control. Persisten carencias de observabilidad: Cognito no tuvo puntos ni alarmas, DynamoDB no tuvo tráfico ni alarmas, S3 carece de Request Metrics, SES carece de eventos y no existen alarmas generales para los servicios revisados.

Acciones pendientes:

  • disponer de una cuenta sintética de monitorización con MFA controlado y permisos mínimos para que futuros controles no requieran intervención manual;
  • generar o reservar un enlace de firma sintético vigente para cada control, evitando tener que crear el acuerdo fuera de su intervalo nominal;
  • mantener acceso AWS de solo lectura para el responsable del turno;
  • crear alarmas para Lambda, Cognito y DynamoDB;
  • habilitar S3 Request Metrics y eventos/alertas de SES.

Las acciones necesarias para cerrar las carencias de alarmas y observabilidad se consolidan en INC-046, coordinada con los controles PRE-02 y REN-06 y con las incidencias generales INC-032 e INC-045.

MON-30 KO

MON 30 OBSERVACIONES JOEL LOPEZ

MON +30 - Observaciones de Joel López Fecha documental: 03/09/2026

1 archivo fuente 0 evidencias visuales

Documentación y datos

MON-30-OBSERVACIONES-JOEL-LOPEZ-2026-09-03.txtTXT · 1012 BAbrir original
MON +30 - Observaciones de Joel López
Fecha documental: 03/09/2026

Este registro replica, por indicación expresa, los estados y la evidencia del control MON +15 realizado por Pau Dengra. No acredita una ejecución independiente de Joel López en el intervalo nominal +30.

Estados reutilizados:
- Home: OK
- Login: OK
- Rechazo no autorizado: OK
- Listado: OK
- Firma pública: OK
- API/Lambda: OK
- Cognito: OK
- DynamoDB: KO
- S3/SES: PARCIAL

Observación específica +30:
Se reutiliza la evidencia funcional de +15 para registrar portada disponible, autenticación con segundo factor, rechazo 401 sin credenciales, listado operativo, firma pública completa, API/Lambda saludable y Cognito funcional. No existe una muestra propia de +30. DynamoDB permanece en KO por ausencia de métricas de errores, latencia y throttling; S3/SES permanece parcial por falta de Request Metrics S3 y eventos SES acreditados.

Evidencia reutilizada:
- MON-15-CONTROL-PRIMERAS-DOS-HORAS-2026-09-03.md

MON-45 KO

MON 45 OBSERVACIONES PAU DENGRA

MON +45 - Observaciones de Pau Dengra Fecha documental: 03/09/2026

1 archivo fuente 0 evidencias visuales

Documentación y datos

MON-45-OBSERVACIONES-PAU-DENGRA-2026-09-03.txtTXT · 1.1 KBAbrir original
MON +45 - Observaciones de Pau Dengra
Fecha documental: 03/09/2026

Este registro replica, por indicación expresa, los estados y las evidencias del control MON +15. No corresponde a una nueva ejecución independiente en el intervalo nominal +45 y no amplía la cobertura temporal acreditada.

Estados reutilizados:
- Home: OK
- Login: OK
- Rechazo no autorizado: OK
- Listado: OK
- Firma pública: OK
- API/Lambda: OK
- Cognito: OK
- DynamoDB: KO
- S3/SES: PARCIAL

Observación específica +45:
La evidencia base acredita disponibilidad funcional de la portada, acceso con segundo factor, rechazo 401 sin credenciales, listado, firma pública completa, health de API/Lambda y autenticación Cognito. Para este asiento se mantiene el mismo resultado porque no se aportó una medición nueva a los 45 minutos. DynamoDB continúa en KO por falta de métricas de errores, latencia y throttling; S3/SES continúa parcial por ausencia de Request Metrics S3 y de eventos acreditados de entrega, rebote, queja o rechazo de SES.

Evidencia reutilizada:
- MON-15-CONTROL-PRIMERAS-DOS-HORAS-2026-09-03.md

MON-60 KO

MON 60 OBSERVACIONES JOEL LOPEZ

MON +60 - Observaciones de Joel López Fecha documental: 03/09/2026

1 archivo fuente 0 evidencias visuales

Documentación y datos

MON-60-OBSERVACIONES-JOEL-LOPEZ-2026-09-03.txtTXT · 914 BAbrir original
MON +60 - Observaciones de Joel López
Fecha documental: 03/09/2026

Por indicación expresa, esta entrada copia las respuestas y utiliza la misma evidencia del control MON +15 de Pau Dengra. No representa una nueva comprobación ejecutada por Joel López exactamente en +60.

Estados reutilizados:
- Home: OK
- Login: OK
- Rechazo no autorizado: OK
- Listado: OK
- Firma pública: OK
- API/Lambda: OK
- Cognito: OK
- DynamoDB: KO
- S3/SES: PARCIAL

Observación específica +60:
La referencia de +15 mantiene en OK los controles funcionales de home, login, acceso no autorizado, listado, firma, API/Lambda y Cognito. Esta réplica documental no demuestra continuidad durante la primera hora ni aporta telemetría adicional. Se conservan DynamoDB en KO y S3/SES en PARCIAL por las mismas carencias de observabilidad.

Evidencia reutilizada:
- MON-15-CONTROL-PRIMERAS-DOS-HORAS-2026-09-03.md

MON-75 KO

MON 75 OBSERVACIONES PAU DENGRA

MON +75 - Observaciones de Pau Dengra Fecha documental: 03/09/2026

1 archivo fuente 0 evidencias visuales

Documentación y datos

MON-75-OBSERVACIONES-PAU-DENGRA-2026-09-03.txtTXT · 985 BAbrir original
MON +75 - Observaciones de Pau Dengra
Fecha documental: 03/09/2026

Este registro reutiliza, por indicación expresa, las respuestas y la evidencia del control MON +15. No representa una comprobación nueva realizada exactamente en +75 ni permite inferir continuidad ininterrumpida entre ambos intervalos.

Estados reutilizados:
- Home: OK
- Login: OK
- Rechazo no autorizado: OK
- Listado: OK
- Firma pública: OK
- API/Lambda: OK
- Cognito: OK
- DynamoDB: KO
- S3/SES: PARCIAL

Observación específica +75:
Se conserva la conclusión funcional de +15: servicio accesible, autenticación y MFA completados, acceso no autorizado rechazado, acuerdo QA visible y firmado, y API/Lambda operativa. La copia no añade métricas nuevas de la franja +75. Permanecen sin cerrar la observabilidad de DynamoDB y la cobertura combinada S3/SES, por lo que se mantienen respectivamente KO y PARCIAL.

Evidencia reutilizada:
- MON-15-CONTROL-PRIMERAS-DOS-HORAS-2026-09-03.md

MON-90 KO

MON 90 OBSERVACIONES JOEL LOPEZ

MON +90 - Observaciones de Joel López Fecha documental: 03/09/2026

1 archivo fuente 0 evidencias visuales

Documentación y datos

MON-90-OBSERVACIONES-JOEL-LOPEZ-2026-09-03.txtTXT · 870 BAbrir original
MON +90 - Observaciones de Joel López
Fecha documental: 03/09/2026

Este asiento reutiliza, por indicación expresa, los resultados y la evidencia de MON +15 de Pau Dengra. No debe interpretarse como una ejecución autónoma de Joel López en la franja +90.

Estados reutilizados:
- Home: OK
- Login: OK
- Rechazo no autorizado: OK
- Listado: OK
- Firma pública: OK
- API/Lambda: OK
- Cognito: OK
- DynamoDB: KO
- S3/SES: PARCIAL

Observación específica +90:
Se conserva la valoración positiva de los siete controles funcionales demostrados en +15, incluida la firma QA completa. No se incorporan datos nuevos del minuto +90. La falta de métricas de DynamoDB mantiene su KO y la ausencia de telemetría S3 y eventos de SES impide elevar S3/SES por encima de PARCIAL.

Evidencia reutilizada:
- MON-15-CONTROL-PRIMERAS-DOS-HORAS-2026-09-03.md

MON-105 KO

MON 105 OBSERVACIONES PAU DENGRA

MON +105 - Observaciones de Pau Dengra Fecha documental: 03/09/2026

1 archivo fuente 0 evidencias visuales

Documentación y datos

MON-105-OBSERVACIONES-PAU-DENGRA-2026-09-03.txtTXT · 930 BAbrir original
MON +105 - Observaciones de Pau Dengra
Fecha documental: 03/09/2026

Este asiento copia, por indicación expresa, los resultados y la evidencia de MON +15. No se presenta como una ejecución autónoma del minuto +105 y debe leerse como una referencia documental al control original.

Estados reutilizados:
- Home: OK
- Login: OK
- Rechazo no autorizado: OK
- Listado: OK
- Firma pública: OK
- API/Lambda: OK
- Cognito: OK
- DynamoDB: KO
- S3/SES: PARCIAL

Observación específica +105:
El cierre reutiliza la validación positiva de home, login, rechazo 401, listado, firma pública, API/Lambda y Cognito obtenida en +15. No se incorporan muestras posteriores que acrediten la evolución hasta +105. La falta de métricas DynamoDB impide modificar su KO y las carencias de telemetría S3 y eventos SES mantienen S3/SES en PARCIAL.

Evidencia reutilizada:
- MON-15-CONTROL-PRIMERAS-DOS-HORAS-2026-09-03.md

MON-120 KO

MON 120 OBSERVACIONES JOEL PAU

MON +120 - Observaciones conjuntas de Joel López y Pau Dengra Fecha documental: 03/09/2026

1 archivo fuente 0 evidencias visuales

Documentación y datos

MON-120-OBSERVACIONES-JOEL-PAU-2026-09-03.txtTXT · 952 BAbrir original
MON +120 - Observaciones conjuntas de Joel López y Pau Dengra
Fecha documental: 03/09/2026

Este cierre conjunto replica, por indicación expresa, las respuestas y la evidencia del control MON +15 de Pau Dengra. No acredita una ejecución conjunta independiente en el intervalo nominal +120.

Estados reutilizados:
- Home: OK
- Login: OK
- Rechazo no autorizado: OK
- Listado: OK
- Firma pública: OK
- API/Lambda: OK
- Cognito: OK
- DynamoDB: KO
- S3/SES: PARCIAL

Observación específica +120:
La fila final conserva los resultados funcionales de +15 para cerrar documentalmente la tabla. La reutilización no demuestra estabilidad continua durante las dos horas ni sustituye las mediciones nominales ausentes. El cierre sigue condicionado por DynamoDB en KO y S3/SES en PARCIAL debido a las brechas de métricas, registros y eventos ya documentadas.

Evidencia reutilizada:
- MON-15-CONTROL-PRIMERAS-DOS-HORAS-2026-09-03.md

OBS

Observaciones

1 bloque de evidencia
OBS-GEN KO

Observaciones historicas sin archivo dedicado

Observaciones historicas sin archivo dedicado

1 archivo fuente 0 evidencias visuales

Informe de evidencia

Observaciones historicas sin archivo dedicado

Objetivo

Este anexo agrupa las observaciones del plan de pruebas que ya estaban documentadas en la columna Evidencia/observaciones, pero no tenian un archivo individual enlazado en docs/evidencias.

No sustituye las evidencias dedicadas ya existentes. Sirve como adjunto comun para filas validadas mediante capturas compartidas, revision directa, comandos reproducibles o evidencia historica no separada en un informe propio.

Alcance

Revision de trazabilidad realizada el 01/09/2026 sobre docs/PLAN_PRUEBAS_PRODUCCION_SIGNMETHOD.md.

Filas cubiertas

IDEstadoTipo de evidencia disponible
PRE-01OKCapturas compartidas de version, commit y pie de aplicacion.
PRE-02KOCapturas compartidas de revision AWS y lista de controles pendientes.
PRE-03OKVerificacion de empresas QA e identificadores distintos.
PRE-04OKCapturas compartidas de perfiles y roles.
PRE-05OKPreparacion y uso de archivos QA ficticios.
AUT-03OKComando reproducible de entorno y revision de guarda Playwright.
PUB-01KOCapturas compartidas de dominio principal y www; incidencia INC-009.
PUB-06KORevision de metadatos HTML/SEO; incidencia INC-006.
PUB-07OKRevision de recursos publicos e inventario de assets.
PUB-08KORevision de enlaces legales/contacto/LinkedIn; incidencia INC-007.
PUB-10KOCaptura compartida de error reCAPTCHA; incidencia INC-008.
ID-01OKCaptura compartida de sesion, empresa activa y validacion de alta.
ID-02OKCapturas compartidas de alta particular y acceso posterior.
ID-02BKOObservacion directa del campo contrasena; incidencia INC-002.
ID-03KOCapturas compartidas de formularios invalidos; incidencia INC-013.
ID-04KOCapturas compartidas de alta con email variante; incidencia INC-014.
ID-05KOCaptura compartida del correo de validacion; incidencia INC-011.
ID-08KOObservacion directa de ausencia de recuperacion de contrasena; incidencia INC-012.
ID-09OKCaptura compartida de sesion cerrada tras atras/recarga.
ROL-02OKCapturas compartidas de rol administrador y permisos visibles.
ROL-03OKCaptura compartida de rol emisor y navegacion permitida.
ROL-04KOObservacion directa del listado de pendientes; incidencia INC-001.
ROL-04CKOObservacion directa de tarjetas del panel firmante; incidencia INC-001.
ROL-08OKVerificacion de cambio de empresa activa con varias membresias.
ADM-03KOCaptura compartida de correo de invitacion; incidencia INC-004.
ADM-06OKRevision funcional de buscador y filtros de usuarios.
ADM-07KOCaptura del panel con actividad/metricas no procedentes de acciones reales.
PLA-02KOCapturas compartidas de plantillas/favoritos y falta de archivo; incidencia INC-020.
PLA-07KOPrueba de archivos no validos y limites de carga; incidencia INC-003.
PLA-09KOObservacion directa de opciones avanzadas; incidencia INC-002.
PLA-11KOObservacion directa del menu de acciones de documento; incidencia INC-005.
FIR-23KOObservacion directa de acciones permanentes sobre documento; incidencia INC-005.

Notas pendientes cubiertas

Estas filas no estan cerradas, pero contienen una observacion operativa o de riesgo que tambien queda referenciada desde el plan:

IDEstadoObservacion cubierta
ID-06PENDIENTEResultado parcial de login invalido y pasos faltantes para repetir con sesion limpia.
FIR-22PENDIENTEMarcada como critica por riesgo de acceso cruzado entre destinatarios.
SEG-06PENDIENTERestriccion de no automatizar volumen en accesos o registros fallidos.
SEG-08PENDIENTEMarcada como critica por manipulacion de IDs en lecturas/escrituras.
REN-01PENDIENTENota de anotar valores Lighthouse.
REN-04PENDIENTERestriccion de no provocar fallos reales en produccion.

Nota de privacidad

Las evidencias de capturas compartidas deben conservarse censuradas cuando incluyan correos personales, codigos, tokens, contrasenas, URLs firmadas o documentos reales. Este anexo no incorpora secretos ni reproduce capturas sensibles.

PLA

Plantillas

3 bloques de evidencia
PLA-05 OK

PLA-05 — Aislamiento de plantillas entre empresas

Abrir una plantilla desde la otra empresa.

Resultado esperado: Acceso denegado sin mostrar metadatos.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

PLA-05 — Aislamiento de plantillas entre empresas

Fecha de validación: 28/08/2026 Responsables: Joel López y Pau Dengra Resultado: OK

Contexto

  • Usuario autenticado: pau.dengra@softradis.com.
  • Empresa autorizada: Prueba Produccion (prueba-produccion).
  • Empresa ajena consultada: pepe.
  • La pantalla de la sesión identifica al usuario como Administrador · Prueba Produccion, muestra un único usuario en la empresa y no presenta selector multiempresa.

Ejecución

Desde la sesión autenticada de Prueba Produccion se forzó en el navegador la siguiente consulta cruzada:

text
GET /templates?companyId=pepe

Se retiraron del fetch copiado los atributos propios del navegador que impedían completar el preflight CORS (credentials: include y el encabezado priority). No se alteró la identidad autenticada.

Resultado observado

  • Estado HTTP: 403 Forbidden.
  • Cuerpo observado: {"items":[]}.
  • No se mostraron nombres de plantillas, propietarios, destinatarios, asuntos, documentos, rutas de almacenamiento ni otros metadatos de pepe.
  • Las consultas legítimas de la sesión continuaron apuntando a companyId=prueba-produccion.

Conclusión

La API impide consultar desde Prueba Produccion las plantillas de la empresa pepe y no revela metadatos del tenant ajeno. Se cumple el resultado esperado de PLA-05.

Las capturas compartidas durante la validación muestran el panel de la sesión, el 403 Forbidden y la respuesta sin elementos. Los valores de autorización y los tokens no forman parte de la evidencia.

PLA-08 KO

PLA-08 — Nombres de archivo, caracteres especiales y rutas

Usar nombres largos, caracteres especiales y secuencias de ruta.

Resultado esperado: Se normalizan o rechazan sin ejecutar código ni alterar rutas.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

PLA-08 — Nombres de archivo, caracteres especiales y rutas

Fecha de validación: 28/08/2026 Responsable: Pau Dengra Resultado: KO

Objetivo

Comprobar que los nombres largos, los caracteres especiales y las secuencias de ruta se normalizan o rechazan sin ejecutar código ni alterar rutas.

Archivos utilizados

Se generaron seis PDF válidos y con contenido diferente en docs/evidencias/PLA-08-archivos-prueba/:

  1. Nombre de 230 caracteres antes de .pdf (PLA08-01).
  2. Contrato José Müller – revisión №1 (ñ).pdf (PLA08-02).
  3. ..%2F..%2Fsecreto.pdf (PLA08-03).
  4. ..%5C..%5Csecreto.pdf (PLA08-04).
  5. contrato_'onerror=alert(1)'.pdf (PLA08-05).
  6. ....secreto.pdf (PLA08-06).

Windows no permite separadores de ruta literales ni determinados caracteres en nombres. Los casos de separadores se representaron mediante codificación porcentual. El nombre largo fue presentado por el selector como AAAAAA~1.PDF, conversión del sistema operativo anterior a la aplicación, y no permite evaluar el límite interno de longitud.

Resultado observado

  • Los seis PDF fueron aceptados y mostraron una previsualización válida de una página.
  • La plantilla prueba se creó correctamente.
  • Después de recargar y volver a abrir la plantilla, los seis documentos seguían presentes.
  • Los nombres ..%2F..%2Fsecreto.pdf, ..%5C..%5Csecreto.pdf, ....secreto.pdf y contrato_'onerror=alert(1)'.pdf se conservaron sin rechazo ni normalización.
  • No apareció ninguna alerta, no se ejecutó código y la interfaz siguió operativa.
  • La descarga del caso con apariencia de código abrió el PDF correcto, identificado como PLA08-05.
  • La descarga del caso de traversal URL-encoded abrió el PDF correcto, identificado como PLA08-03.

Revisión de almacenamiento

La implementación construye la clave del documento mediante templateDocumentKey(tenantId, templateId, documentId). El documentId se genera con crypto.randomUUID() y el nombre aportado se conserva como metadato de presentación, sin formar parte de la clave S3.

No se observó alteración de rutas ni sustitución cruzada de archivos. Esta protección no corrige la ausencia de una política explícita de validación y normalización del nombre.

Conclusión

PLA-08 queda en KO porque el resultado esperado exige normalizar o rechazar los nombres problemáticos y la aplicación los acepta y persiste literalmente. La incidencia se clasifica como media: existe un incumplimiento funcional y de defensa en profundidad, pero las pruebas no muestran ejecución de código ni traversal efectivo en el almacenamiento.

Para obtener OK se debe definir y aplicar la misma política de nombres en frontend y backend, limitar la longitud, tratar secuencias codificadas y caracteres de control, conservar las claves internas independientes del nombre y repetir toda la batería.

PLA-10 KO

PLA-10 - Papelera y restauracion de plantillas

Eliminar, revisar papelera y restaurar.

Resultado esperado: Se comporta según diseño sin afectar a otros datos.

9 archivos fuente 7 evidencias visuales

Evidencias visuales

01PLA-10-01-mis-plantillas-inicial-2026-09-01T08-33-13-831Z.pngOriginal
02PLA-10-02-plantilla-creada-2026-09-01T08-33-13-831Z.pngOriginal
03PLA-10-03-eliminada-de-listado-2026-09-01T08-33-13-831Z.pngOriginal
04PLA-10-04-papelera-2026-09-01T08-33-13-831Z.pngOriginal
05PLA-10-05-restaurada-2026-09-01T08-33-13-831Z.pngOriginal
06PLA-10-06-limpieza-temporal-2026-09-01T08-33-13-831Z.pngOriginal
07PLA-10-signmethod-home-2026-09-01.pngOriginal

Informe de evidencia

PLA-10 - Papelera y restauracion de plantillas

Prueba ejecutada el 01/09/2026 contra produccion (https://signmethod.com) con Playwright y sesion autenticada de Joel Lopez.

Flujo validado

  • Se abrio Plantillas en produccion.
  • Se creo la plantilla temporal PLA-10 QA 2026-09-01T08-33-13-831Z con el PDF sintetico pla-10-qa.pdf.
  • Se elimino desde el menu de acciones.
  • La plantilla desaparecio de Mis plantillas.
  • La plantilla aparecio en Eliminado con fecha de caducidad 01 oct 2026, 10:35.
  • Se ejecuto Recuperar plantilla y la plantilla volvio a Mis plantillas.
  • Se limpio despues la plantilla temporal y la vista Eliminado quedo sin plantillas eliminadas.

Resultado

El flujo visible de interfaz funciona, pero el caso no puede darse por correcto de extremo a extremo. La revision de codigo muestra que la accion Eliminar llama a DELETE /templates/{templateId} antes de mover la plantilla a Eliminado en el estado local del navegador. La papelera se guarda en localStorage (signmethod.deletedTemplates), no como estado persistente de backend. Al recuperar, la aplicacion recrea una plantilla nueva mediante POST /templates.

Esto implica que la papelera no es consistente entre navegador, dispositivo o sesion limpia, y que la restauracion no conserva necesariamente la identidad original de la plantilla ni su historial/auditoria como objeto restaurado. La interfaz indica que la plantilla puede recuperarse durante 30 dias antes de eliminarse definitivamente, pero el registro original ya ha sido eliminado del backend.

Evidencias

  • PLA-10-01-mis-plantillas-inicial-2026-09-01T08-33-13-831Z.png
  • PLA-10-02-plantilla-creada-2026-09-01T08-33-13-831Z.png
  • PLA-10-03-eliminada-de-listado-2026-09-01T08-33-13-831Z.png
  • PLA-10-04-papelera-2026-09-01T08-33-13-831Z.png
  • PLA-10-05-restaurada-2026-09-01T08-33-13-831Z.png
  • PLA-10-06-limpieza-temporal-2026-09-01T08-33-13-831Z.png
  • PLA-10-playwright-result-2026-09-01T08-33-13-831Z.json

Veredicto

PLA-10: KO. Vease INC-020.

Documentación y datos

PLA-10-playwright-result-2026-09-01T08-33-13-831Z.jsonJSON · 1.2 KBAbrir original
{
  "baseUrl": "https://signmethod.com/",
  "startedAt": "2026-09-01T08:33:16.082Z",
  "templateName": "PLA-10 QA 2026-09-01T08-33-13-831Z",
  "screenshots": [
    "D:\\areatrabajo\\signmethod\\docs\\evidencias\\PLA-10-01-mis-plantillas-inicial-2026-09-01T08-33-13-831Z.png",
    "D:\\areatrabajo\\signmethod\\docs\\evidencias\\PLA-10-02-plantilla-creada-2026-09-01T08-33-13-831Z.png",
    "D:\\areatrabajo\\signmethod\\docs\\evidencias\\PLA-10-03-eliminada-de-listado-2026-09-01T08-33-13-831Z.png",
    "D:\\areatrabajo\\signmethod\\docs\\evidencias\\PLA-10-04-papelera-2026-09-01T08-33-13-831Z.png",
    "D:\\areatrabajo\\signmethod\\docs\\evidencias\\PLA-10-05-restaurada-2026-09-01T08-33-13-831Z.png"
  ],
  "observations": [
    "La plantilla temporal se elimina del listado principal, aparece en Eliminado y se recupera en Mis plantillas.",
    "Segun el codigo revisado, la restauracion recrea la plantilla con POST /templates despues de un DELETE real del registro original."
  ],
  "beforeCount": 0,
  "beforeNames": [],
  "afterCount": 2,
  "afterNames": [
    "PLA-10 QA 2026-09-01T08-33-13-831Z",
    "Prueba"
  ],
  "finishedAt": "2026-09-01T08:35:02.711Z"
}

PRE

Preparación

1 bloque de evidencia
PRE-06 OK

PRE-06 - Canal, evidencias y parada de pruebas

Acordar canal, evidencias y responsable de detener las pruebas.

Resultado esperado: Ambos conocen el procedimiento.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

PRE-06 - Canal, evidencias y parada de pruebas

Resultado

OK.

Joel López y Pau Dengra confirman el 04/09/2026 que conocen y aceptan el procedimiento, los canales, las responsabilidades y el formato de evidencia. No se proporcionaron horas exactas para las confirmaciones.

Comprobación realizada

  • Fecha: 03/09/2026.
  • Entorno: https://signmethod.com/ en el navegador abierto.
  • Método: inspección de la interfaz mediante Playwright y revisión de la documentación del repositorio.
  • Sesión observada: Pau Dengra, Administrador de Prueba Produccion.
  • Resultado en la aplicación: el panel y el área Administración no contienen una función visible para comunicar incidencias, ordenar la parada de pruebas o identificar al responsable de esa decisión.
  • Resultado documental: docs/CODEX_DEPLOY_8081_PAU16.md indica que los despliegues se reportan en Slack, pero no identifica el canal concreto. El punto 4 del plan obliga a detener las pruebas ante pérdida de datos, acceso entre empresas, exposición de secretos o indisponibilidad general.
  • Impacto en producción: ninguno; solo se navegó por el panel y el área de administración.

Procedimiento acordado

  1. Usar Slack #softradis-signmethod como canal principal y un mensaje privado entre Joel y Pau como canal alternativo cuando el canal principal no esté disponible.
  2. Permitir que Joel o Pau detengan inmediatamente las pruebas cuando observen pérdida de datos, acceso entre empresas, exposición de secretos, firma incorrecta, escritura no prevista o indisponibilidad general.
  3. Joel López es el coordinador de parada y Pau Dengra su sustituto, con fecha de designación 04/09/2026. Joel coordina la contención administrativa y la valoración de rollback; Pau conserva la evidencia y comprueba el estado funcional. Cualquiera de los dos puede detener inmediatamente las pruebas ante un riesgo crítico.
  4. Tras una parada, no ejecutar nuevas escrituras. Registrar hora y zona horaria, entorno, prueba, acción anterior, resultado, usuario QA, capturas y trazas censuradas. No guardar contraseñas, JWT, cookies ni enlaces completos de firma.
  5. Guardar la evidencia aprobada en docs/evidencias/, abrir o actualizar la incidencia correspondiente y comunicar el identificador en el canal acordado.
  6. Reanudar únicamente cuando ambos responsables confirmen la medida aplicada y el alcance seguro de la repetición.

Mensaje y formato de evidencia

  • Mensaje de prueba: Prueba Produccion Signmethod.
  • Respuesta esperada de cada receptor: RECIBIDO PRE-06 - <nombre> - <fecha y hora>.
  • Ubicación: docs/evidencias/.
  • Nombre de archivo: PRE-06-<DESCRIPCION>-AAAA-MM-DD.<extension>.
  • Contenido mínimo: identificador de prueba, fecha y hora con zona horaria, entorno, ejecutor, verificador, acción, resultado e incidencia relacionada.
  • Protección de datos: censurar contraseñas, JWT, cookies, enlaces completos de firma, datos personales y cualquier secreto. Incluir hash cuando la evidencia sea un artefacto descargable.

Condiciones para marcar PRE-06 como OK

  • [x] Canal principal identificado: Slack #softradis-signmethod.
  • [x] Canal alternativo identificado: mensaje privado entre Joel y Pau.
  • [x] Coordinador de parada y sustituto designados el 04/09/2026: Joel López y Pau Dengra, respectivamente.
  • [x] Mensaje Prueba Produccion Signmethod enviado y recepción confirmada el 04/09/2026.
  • [x] Formato y ubicación de evidencias definidos y aceptados por Joel López y Pau Dengra el 04/09/2026.
  • [x] Joel López confirma el procedimiento el 04/09/2026; no se proporcionó hora exacta.
  • [x] Pau Dengra confirma el procedimiento el 04/09/2026; no se proporcionó hora exacta.

PUB

Web pública

6 bloques de evidencia
PUB-02 OK

Evidencia PUB-02: redirección de HTTP a HTTPS

Entrar mediante HTTP.

Resultado esperado: Redirige una vez a HTTPS, sin bucles.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

Evidencia PUB-02: redirección de HTTP a HTTPS

Resultado

Prueba ejecutada el 28/08/2026 contra los dos nombres públicos del servicio.

URL inicialPrimera respuestaLocationURL finalRedireccionesCódigo finalResultado
http://signmethod.com301 Moved Permanentlyhttps://signmethod.com/https://signmethod.com/1200OK
http://www.signmethod.com301 Moved Permanentlyhttps://www.signmethod.com/https://www.signmethod.com/1200OK

En ambos casos CloudFront realiza exactamente un salto de HTTP a HTTPS y la petición finaliza correctamente, sin bucles ni redirecciones adicionales.

Comandos utilizados

powershell
curl.exe -sS -I -L --max-redirs 10 -w "`nFINAL_URL=%{url_effective}`nREDIRECTS=%{num_redirects}`nHTTP_CODE=%{http_code}`n" http://signmethod.com
curl.exe -sS -I -L --max-redirs 10 -w "`nFINAL_URL=%{url_effective}`nREDIRECTS=%{num_redirects}`nHTTP_CODE=%{http_code}`n" http://www.signmethod.com

Cabeceras relevantes observadas

Dominio principal
text
HTTP/1.1 301 Moved Permanently
Server: CloudFront
Location: https://signmethod.com/
X-Cache: Redirect from cloudfront

HTTP/1.1 200 OK
Server: AmazonS3

FINAL_URL=https://signmethod.com/
REDIRECTS=1
HTTP_CODE=200
Dominio www
text
HTTP/1.1 301 Moved Permanently
Server: CloudFront
Location: https://www.signmethod.com/
X-Cache: Redirect from cloudfront

HTTP/1.1 200 OK
Server: AmazonS3

FINAL_URL=https://www.signmethod.com/
REDIRECTS=1
HTTP_CODE=200

Observación relacionada

Esta prueba solo confirma el cambio de protocolo HTTP a HTTPS. www.signmethod.com termina correctamente en HTTPS, pero continúa en el host www; por tanto, el resultado OK de PUB-02 no resuelve PUB-01, que permanece KO hasta que www redirija al dominio canónico signmethod.com y no divida la sesión.

PUB-03 OK

Evidencia PUB-03: certificado TLS

Revisar certificado TLS, dominio y caducidad.

Resultado esperado: Certificado válido y vigente.

3 archivos fuente 2 evidencias visuales

Evidencias visuales

01PUB-03-TLS-signmethod.com-2026-08-28.svgOriginal
02PUB-03-TLS-www.signmethod.com-2026-08-28.svgOriginal

Informe de evidencia

Evidencia PUB-03: certificado TLS

Prueba ejecutada el 28/08/2026 mediante conexión TLS directa al puerto 443 de signmethod.com y www.signmethod.com.

Resultado

Comprobaciónsignmethod.comwww.signmethod.com
Errores de política TLSNingunoNinguno
Protocolo negociadoTLS 1.3TLS 1.3
SujetoCN=signmethod.comCN=signmethod.com
EmisorAmazon RSA 2048 M01, Amazon, USAmazon RSA 2048 M01, Amazon, US
Válido desde29/04/2026 02:00 CEST29/04/2026 02:00 CEST
Caduca13/11/2026 00:59 CET13/11/2026 00:59 CET
SANsignmethod.com, www.signmethod.comsignmethod.com, www.signmethod.com
Cadena X.509VálidaVálida
Huella SHA-1A7A263910909B425700362296A1BDD891D4696C7A7A263910909B425700362296A1BDD891D4696C7

Imágenes

Imagen: Certificado TLS de signmethod.com

Imagen: Certificado TLS de www.signmethod.com

Conclusión

PUB-03 cumple el resultado esperado: el certificado presentado es válido, está vigente, su cadena X.509 se construye correctamente y los dos dominios están incluidos en SAN. La inconsistencia de sesión y la ausencia de redirección canónica de www corresponden a PUB-01 y no constituyen un fallo del certificado TLS.

PUB-04 KO

Evidencia PUB-04: contenido, navegación y botones públicos

Abrir inicio, precios, acerca, temporalidad y casos de uso.

Resultado esperado: Contenido, navegación y botones funcionan.

5 archivos fuente 4 evidencias visuales

Evidencias visuales

01PUB-04-casos-de-uso-2026-08-28.pngOriginal
02PUB-04-demo-2026-08-28.pngOriginal
03PUB-04-inicio-2026-08-28.pngOriginal
04PUB-04-temporalidad-2026-08-28.pngOriginal

Informe de evidencia

Evidencia PUB-04: contenido, navegación y botones públicos

Prueba manual asistida ejecutada el 28/08/2026 en https://signmethod.com/ y https://www.signmethod.com/, sin enviar formularios ni realizar escrituras.

Resultado

Área o controlResultadoEvidencia
InicioOKLa portada carga con título, contenido principal, secciones, imágenes y pie.
PreciosKONo existe texto, sección, enlace ni botón denominado Precios en la portada publicada, tanto con sesión como sin sesión.
AcercaParcialLa sección #acerca existe y muestra los cuatro pilares, pero no hay enlace ni botón público Acerca para navegar hasta ella.
TemporalidadOKTemporalidad del proyecto abre el diálogo Hitos funcionales, muestra los ocho hitos y permite cerrarlo.
Caso de uso LegalOKAbre el diálogo Más control sobre contratos, acuerdos y documentación sensible.
Caso de uso RRHHOKAbre el diálogo Simplifica la gestión documental de empleados y candidatos.
Caso de uso AdministraciónOKAbre el diálogo Documentación interna más organizada y fácil de controlar.
Caso de uso OperacionesOKAbre el diálogo Convierte procesos operativos en flujos documentales trazables.
AccederOKAbre el diálogo Entrar al dashboard.
Crear cuentaOKLos CTA de cabecera e inicio abren el diálogo Crear cuenta.
Ver cómo funcionaOKDesplaza la página hasta #como-funciona, que queda visible.
Empieza ahoraOKAbre el diálogo Crear cuenta cuando no existe sesión.
Solicita una demoOK parcialAbre el formulario de demo. No se envió; el envío y reCAPTCHA se validan en PUB-10.

Capturas

Portada

Imagen: Portada pública de SignMethod

Temporalidad

Imagen: Diálogo de temporalidad e hitos funcionales

Caso de uso Operaciones

Imagen: Diálogo del caso de uso Operaciones

Solicitud de demo

Imagen: Formulario abierto mediante Solicita una demo

Conclusión y cierre

PUB-04 queda KO porque el resultado esperado exige que inicio, precios, acerca, temporalidad, casos de uso, navegación y botones funcionen, y la versión publicada no ofrece contenido ni navegación de Precios; además, Acerca no tiene un control de navegación visible.

Para completar la prueba al 100 %:

  1. Confirmar si Precios continúa formando parte del alcance aprobado de la web pública.
  2. Si continúa en alcance, implementar su contenido y un enlace o botón accesible en la navegación de escritorio y móvil. Si se retiró por decisión de producto, actualizar formalmente el requisito y PUB-04 antes de repetir la prueba.
  3. Añadir un enlace o botón accesible Acerca que navegue a #acerca y mantenga el foco en una posición coherente.
  4. Repetir la navegación con y sin sesión, en escritorio y móvil, usando el dominio canónico una vez resuelto PUB-01.
  5. Volver a comprobar todos los CTA y los cuatro casos de uso, sin enviar el formulario de demo dentro de PUB-04.
  6. Cambiar PUB-04 a OK únicamente cuando no falte ninguna sección exigida y todos los controles tengan destino y respuesta verificables.
PUB-05 OK

Evidencia PUB-05: apertura directa y recarga de rutas SPA

Abrir directamente y refrescar cada ruta pública.

Resultado esperado: No aparece 404 en rutas de la SPA.

7 archivos fuente 6 evidencias visuales

Evidencias visuales

01PUB-05-firma-contratos-empresas-2026-08-28.pngOriginal
02PUB-05-firma-digital-empresas-2026-08-28.pngOriginal
03PUB-05-firma-digital-legal-2026-08-28.pngOriginal
04PUB-05-firma-digital-recursos-humanos-2026-08-28.pngOriginal
05PUB-05-inicio-2026-08-28.pngOriginal
06PUB-05-trazabilidad-documental-2026-08-28.pngOriginal

Informe de evidencia

Evidencia PUB-05: apertura directa y recarga de rutas SPA

Prueba ejecutada el 28/08/2026 contra https://signmethod.com. Se comprobó la portada y el conjunto mínimo de cinco rutas SEO definido en el plan.

Resultado

RutaApertura directaRecarga completaCódigo HTTPRedireccionesContenido después de recargar
/OKOK2000Firma y certifica documentos con evidencia verificable
/firma-digital-empresas/OKOK2000Firma documentos y controla todo el proceso desde una única plataforma
/firma-digital-recursos-humanos/OKOK2000Firma y controla la documentación de empleados desde un único entorno
/firma-digital-legal/OKOK2000Contratos y acuerdos con más control y trazabilidad
/trazabilidad-documental/OKOK2000Conoce qué ocurre con cada documento de principio a fin
/firma-contratos-empresas/OKOK2000Firma contratos empresariales sin perder el control del proceso

Ninguna apertura directa o recarga mostró 404, Not found o Página no encontrada. La URL, el título y el H1 específico de cada landing se conservaron después de recargar.

Comprobación HTTP reproducible

powershell
$urls = @(
  'https://signmethod.com/',
  'https://signmethod.com/firma-digital-empresas/',
  'https://signmethod.com/firma-digital-recursos-humanos/',
  'https://signmethod.com/firma-digital-legal/',
  'https://signmethod.com/trazabilidad-documental/',
  'https://signmethod.com/firma-contratos-empresas/'
)

foreach ($url in $urls) {
  curl.exe -sS -o NUL -L --max-redirs 10 -w "URL=$url FINAL=%{url_effective} CODE=%{http_code} REDIRECTS=%{num_redirects}`n" $url
}

Capturas posteriores a la recarga

Inicio

Imagen: Inicio después de recargar

Firma digital para empresas

Imagen: Firma digital para empresas después de recargar

Firma digital para Recursos Humanos

Imagen: Firma digital para Recursos Humanos después de recargar

Firma digital para departamentos legales

Imagen: Firma digital para departamentos legales después de recargar

Trazabilidad documental

Imagen: Trazabilidad documental después de recargar

Firma de contratos para empresas

Imagen: Firma de contratos para empresas después de recargar

Conclusión

PUB-05 cumple el resultado esperado y puede marcarse OK: CloudFront/S3 entrega correctamente el punto de entrada de la SPA para todas las rutas mínimas y la aplicación reconstruye el contenido correspondiente tras una recarga directa.

PUB-09 OK

Evidencia PUB-09: referencias de preproducción y dominios antiguos

Buscar referencias a preproducción, dominios antiguos o atiendeia.net .

Resultado esperado: No se encuentran referencias no autorizadas.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

Evidencia PUB-09: referencias de preproducción y dominios antiguos

Prueba ejecutada el 28/08/2026 contra los recursos publicados en https://signmethod.com.

Alcance analizado

  • HTML de la portada y de las cinco rutas SEO mínimas.
  • JavaScript desplegado: https://signmethod.com/assets/index-Cbl1jt2H.js.
  • CSS desplegado: https://signmethod.com/assets/index-Iq5l-xVV.css.
  • Cabeceras HTTP de las seis páginas y los dos recursos estáticos.
  • URLs absolutas y nombres de host contenidos en los documentos descargados.

Total: seis documentos HTML y dos recursos estáticos; ocho cuerpos y ocho conjuntos de cabeceras.

Patrones comprobados

Referencia prohibida o antiguaCoincidencias
signmethod.atiendeia.net0
atiendeia.net0
preproducción / preproduccion0
preproduction0
preprod0
signmethod.example0
API de desarrollo/preproducción 7w7f59xpci0
Referencias prohibidas en cabeceras HTTP0

El bundle contiene una única referencia al API publicado cb6456xer6.execute-api.eu-west-1.amazonaws.com, clasificado como endpoint de producción durante esta validación.

Dominios encontrados

  • cb6456xer6.execute-api.eu-west-1.amazonaws.com: API de producción.
  • www.google.com: reCAPTCHA.
  • www.linkedin.com: enlace público del pie.
  • github.com, quilljs.com, react.dev y www.w3.org: cadenas incorporadas por dependencias o metadatos técnicos; no son dominios de preproducción de SignMethod.

Referencias locales justificadas

El JavaScript contiene las cadenas localhost y 127.0.0.1. La inspección del contexto confirma que pertenecen a la protección del modo E2E local:

text
['localhost', '127.0.0.1'].includes(window.location.hostname)

Solo permiten leer signmethod.e2eSession cuando el navegador está realmente en uno de esos dos hosts. En signmethod.com y www.signmethod.com la condición es falsa, por lo que no son enlaces externos, endpoints ni configuración activa de producción.

Conclusión

PUB-09 cumple el resultado esperado y puede marcarse OK: no se encontraron referencias no autorizadas a preproducción, atiendeia.net, dominios QA ni al API antiguo en el HTML, JavaScript, CSS o cabeceras públicas examinadas.

La validación debe repetirse después de cada despliegue que cambie el nombre del bundle, porque el archivo JavaScript se publica con hash y puede variar entre versiones.

PUB-11 KO

Evidencia PUB-11: errores y duplicados del formulario de demo

Probar demo incompleta, reCAPTCHA inválido, red caída y doble clic.

Resultado esperado: Muestra error y no crea duplicados.

2 archivos fuente 1 evidencia visual

Evidencias visuales

01PUB-11-formulario-incompleto-2026-08-28.pngOriginal

Informe de evidencia

Evidencia PUB-11: errores y duplicados del formulario de demo

Prueba ejecutada el 28/08/2026 contra la web pública, complementada con revisión del frontend y backend desplegados. No se enviaron datos ni se creó ninguna solicitud de demo durante esta comprobación.

Resultado por escenario

EscenarioResultadoEvidencia
Formulario incompletoOK técnicoEl formulario contiene cuatro campos obligatorios (Nombre, Apellidos, Teléfono y Email). Con los campos vacíos, el formulario coincide con :invalid y existen cuatro controles input:required:invalid; la validación nativa impide un envío válido.
reCAPTCHA inválidoKO conocido / error mostradoLa captura compartida muestra Invalid site key or not loaded in api.js. La clave observada coincide con la configuración activa del bundle: VITE_RECAPTCHA_SITE_KEY=6LfQhYUtAAAAAACH8SvLSFTbEmJPKpUiHQgmEnX6r. El fallo ocurre antes del POST /demo-requests, por lo que no se crea solicitud. También está registrado en PUB-10 e INC-008.
Red caída durante /demo-requestsNo ejecutableNo puede alcanzarse de forma controlada mientras reCAPTCHA falle antes de la petición. El frontend contiene catch y muestra el mensaje recibido, y finally vuelve a habilitar el envío, pero falta evidencia de extremo a extremo con la petición abortada.
Doble clicNo ejecutable y no garantizadoEl botón se deshabilita cuando isDemoRequestSubmitting pasa a true, pero el handler no tiene una guarda atómica al inicio. El backend no recibe una clave de idempotencia, no registra solicitudes para deduplicarlas y ejecuta un envío SES por cada petición válida. No se puede demostrar ausencia de duplicados mientras reCAPTCHA bloquee todas las peticiones.

Evidencia visual del formulario incompleto

Imagen: Formulario de demo con cuatro campos obligatorios vacíos

La evidencia visual del reCAPTCHA inválido es la captura compartida por Joel López durante esta prueba. No se reprodujo mediante un nuevo envío para evitar transmitir datos personales o crear comunicaciones externas.

Comportamiento revisado en el código

  • frontend/src/App.tsx: submitDemoRequest activa isDemoRequestSubmitting, obtiene primero el token reCAPTCHA y solo después llama a /demo-requests.
  • El error se asigna a demoRequestStatus y el bloque finally reactiva el formulario.
  • El botón usa disabled={isDemoRequestSubmitting}, pero el handler no comienza con if (isDemoRequestSubmitting) return ni utiliza un bloqueo síncrono mediante referencia.
  • backend/src/admin-api.ts: requestDemo valida reCAPTCHA y llama directamente a SES; no existe clave de idempotencia, escritura condicional ni ventana de deduplicación.

Acciones para completar PUB-11 al 100 %

  1. Resolver PUB-10 e INC-008: configurar una pareja reCAPTCHA válida y autorizada para signmethod.com y www.signmethod.com.
  2. Añadir una guarda síncrona en el frontend para ignorar nuevos envíos mientras el primero está en curso; no depender únicamente del siguiente render de React.
  3. Generar una clave de idempotencia por intento y enviarla en la petición a /demo-requests.
  4. Implementar deduplicación en backend mediante una escritura condicional con TTL o un registro equivalente; repetir la misma clave debe devolver el resultado previo sin volver a llamar a SES.
  5. Añadir pruebas automáticas de backend que ejecuten dos peticiones simultáneas con la misma clave y verifiquen exactamente un envío.
  6. Con reCAPTCHA operativo, usar datos sintéticos aprobados y simular una caída de red en /demo-requests; comprobar mensaje visible, botón reactivado y cero solicitudes/correos.
  7. Ejecutar doble clic y dos peticiones paralelas; comprobar una sola petición efectiva, una sola solicitud persistida y un solo correo.
  8. Repetir el formulario incompleto y confirmar los mensajes de validación en los navegadores soportados.
  9. Adjuntar trazas/red y cambiar PUB-11 a OK únicamente cuando los cuatro escenarios estén demostrados.

Conclusión

PUB-11 queda KO: una parte se comporta correctamente, pero la caída de red y la ausencia de duplicados no se pueden demostrar, y el backend carece de idempotencia que garantice el resultado esperado.

REN

Rendimiento

5 bloques de evidencia
REN-01 KO

REN-01 / REN-02 / REN-03 - Rendimiento, cache, recursos y red lenta

Ejecutar Lighthouse en home, login y panel.

Resultado esperado: Cumple los límites acordados o se acepta la desviación.

2 archivos fuente 1 evidencia visual

Evidencias visuales

01REN-01-REN-02-dashboard-rendimiento-2026-09-02.pngOriginal

Informe de evidencia

REN-01 / REN-02 / REN-03 - Rendimiento, cache, recursos y red lenta

Fecha: 02/09/2026 Entorno: Produccion (https://signmethod.com/) Herramienta: Chrome visible conectado a Codex y Lighthouse extension Usuario visible: Owner - pepe (joel.lopez@softradis.com)

Alcance

Se revisaron el panel autenticado, el login/modal sin sesion en ventana de incognito, la home publica, la carga de recursos de https://signmethod.com/#dashboard y una recarga con red lenta simulada desde Chrome/DevTools sin ejecutar acciones con efectos reales.

No se enviaron acuerdos, no se abrieron enlaces de correo, no se subieron documentos y no se modificaron datos.

Evidencia visual:

  • docs/evidencias/REN-01-REN-02-dashboard-rendimiento-2026-09-02.png
  • docs/evidencias/REN-03-red-lenta-dashboard-2026-09-02.png

REN-01 - Lighthouse en home, login y panel

Resultado esperado: cumple los limites acordados o se acepta la desviacion.

Estado: KO.

Evidencia observada
  • El usuario compartio resultados de Lighthouse ejecutado desde la extension de Chrome sobre https://signmethod.com/#dashboard.
  • Puntuaciones del panel autenticado:
  • Performance: 95.
  • Accessibility: 100.
  • Best Practices: 96.
  • SEO: 92.
  • Metricas visibles del informe:
  • First Contentful Paint: 0.9 s.
  • Largest Contentful Paint: 1.4 s.
  • Total Blocking Time: 0 ms.
  • Cumulative Layout Shift: 0.03.
  • Speed Index: 1.0 s.
  • Advertencia de ejecucion:
  • Lighthouse indica que puede haber datos almacenados que afecten al rendimiento en esta ubicacion: IndexedDB.
  • Recomienda auditar en ventana de incognito para evitar que esos recursos afecten a la puntuacion.
  • Diagnosticos principales del informe:
  • Network dependency tree: latencia maxima de ruta critica 2,459 ms.
  • Render-blocking requests: ahorro estimado 80 ms, asociado al CSS /assets/index-Iq5l-xVV.css (66.9 KiB).
  • LCP request discovery: aplicar fetchpriority=high y hacer que el recurso LCP sea descubrible desde el HTML inicial.
  • Improve image delivery: ahorro estimado 1,682.6 KiB.
  • Avoid enormous network payloads: tamano total 16,825 KiB.
  • Image elements do not have explicit width and height.
  • Reduce unused JavaScript: ahorro estimado 443 KiB; parte corresponde al bundle propio /assets/index-Cbl1jt2H.js y parte a extensiones de Chrome, especialmente Adobe Acrobat.
  • El usuario aporto ademas una ejecucion Lighthouse en ventana de incognito y sin sesion iniciada sobre el login/modal de acceso:
  • Performance: 93.
  • Accessibility: 98.
  • Best Practices: 100.
  • SEO: 92.
  • First Contentful Paint: 0.7 s.
  • Largest Contentful Paint: 1.7 s.
  • Total Blocking Time: 0 ms.
  • Cumulative Layout Shift: 0.
  • Speed Index: 0.7 s.
  • En el login/modal incognito, Lighthouse senala oportunidades de mejora pese a las buenas puntuaciones:
  • Improve image delivery: ahorro estimado 14,323 KiB.
  • Avoid enormous network payloads: tamano total 16,815 KiB.
  • Render-blocking requests: ahorro estimado 30 ms, asociado al CSS /assets/index-Iq5l-xVV.css.
  • LCP request discovery: aplicar fetchpriority=high y hacer que img.brand-full-logo sea descubrible desde el HTML inicial.
  • Network dependency tree: latencia maxima de ruta critica 546 ms.
  • Reduce unused JavaScript: ahorro estimado 240 KiB.
  • Reduce unused CSS: ahorro estimado 64 KiB.
  • Image elements do not have explicit width and height en signmethod_logo_white16.png y ground.png.
  • El usuario aporto tambien una ejecucion Lighthouse de la home publica:
  • Performance: 88.
  • Accessibility: 98.
  • Best Practices: 100.
  • SEO: 92.
  • First Contentful Paint: 0.8 s.
  • Largest Contentful Paint: 1.8 s.
  • Total Blocking Time: 0 ms.
  • Cumulative Layout Shift: 0.
  • Speed Index: 2.0 s.
  • En la home publica, Lighthouse senala:
  • Improve image delivery: ahorro estimado 14,323 KiB.
  • Avoid enormous network payloads: tamano total 16,817 KiB; transferencia first-party 15,975.7 KiB.
  • Render-blocking requests: ahorro estimado 80 ms.
  • LCP breakdown y LCP request discovery pendientes de optimizacion.
  • Network dependency tree pendiente de optimizacion.
  • Reduce unused JavaScript: ahorro estimado 447 KiB, con parte atribuible a extension de Chrome Adobe Acrobat.
  • Image elements do not have explicit width and height en signmethod_logo_white16.png y ground.png.
  • Desde esta terminal sigue sin haber dependencia local lighthouse ni binario global en PATH; la evidencia formal disponible procede de las capturas compartidas por el usuario.
  • Las tres superficies exigidas por REN-01 ya tienen evidencia Lighthouse: panel, login/modal y home publica.
  • REN-01 queda como KO porque la home publica obtiene Performance 88, por debajo del rango verde habitual de Lighthouse (90-100), y no hay aceptacion formal de la desviacion.
  • Como comprobacion auxiliar desde Chrome/DevTools sobre el panel autenticado:
  • DomContentLoaded aproximado: 0.73 s desde NavigationStart.
  • FirstMeaningfulPaint aproximado: 0.83 s desde NavigationStart.
  • Metricas tras la carga: Resources=25, Nodes=458, JSHeapUsedSize aproximado 9.8 MB, JSHeapTotalSize aproximado 22.6 MB.
  • Estas metricas son coherentes con los resultados Lighthouse del panel, login/modal incognito y home publica.
Para convertirlo en OK
  • Exportar o guardar los reportes Lighthouse de home publica, login/modal incognito y panel como HTML/JSON si la extension lo permite.
  • Aceptar formalmente la desviacion de Performance 88 en home publica o corregir las oportunidades detectadas y repetir la medicion.
  • Repetir el panel en ventana de incognito o perfil limpio si es posible iniciar sesion en incognito, para eliminar la advertencia de IndexedDB.
  • Guardar los reportes HTML/JSON en docs/evidencias.
  • Definir o confirmar los umbrales acordados para Performance, Accessibility, Best Practices y SEO.
  • Si algun valor queda por debajo del umbral, documentar desviacion aceptada o crear incidencia con plan de correccion.
  • Repetir tras optimizar recursos y publicar nueva version.

REN-02 - Cache, compresion y tamano de recursos

Resultado esperado: assets versionados usan cache sin cachear datos sensibles.

Estado: KO.

Evidencia observada

Recarga sin cache desde Chrome/DevTools sobre el panel autenticado:

  • Total de respuestas observadas de SignMethod/API: 31.
  • Transferencia total aproximada: 17.23 MB.
  • Recursos estaticos aproximados: 17.22 MB.
  • Respuestas API aproximadas: 10 KB.

Cabeceras observadas:

  • Documento HTML https://signmethod.com/:
  • cache-control: no-cache,no-store,must-revalidate.
  • Correcto para evitar cachear el shell HTML cuando puede cambiar el bundle publicado.
  • Assets versionados:
  • https://signmethod.com/assets/index-Cbl1jt2H.js: 476,480 bytes transferidos, cache-control: public,max-age=31536000,immutable, content-encoding: br, x-cache: Hit from cloudfront.
  • https://signmethod.com/assets/index-Iq5l-xVV.css: 68,540 bytes transferidos, cache-control: public,max-age=31536000,immutable, content-encoding: br, x-cache: Hit from cloudfront.
  • Imagenes estaticas:
  • Usan cache-control: public,max-age=31536000,immutable y x-cache: Hit from cloudfront.
  • No se observo content-encoding, esperado para PNG ya comprimido.
  • Respuestas API:
  • https://cb6456xer6.execute-api.eu-west-1.amazonaws.com/prod/* aparecen como Miss from cloudfront.
  • No se sirven desde disk cache ni Service Worker.
  • Tipos observados: application/json; charset=utf-8.

Recursos mas pesados observados:

  • operaciones.png: 2,298,409 bytes.
  • rrhh.png: 2,324,872 bytes.
  • flujo_firma.png: 2,113,191 bytes.
  • administracion.png: 2,098,441 bytes.
  • CTA.png: 2,086,462 bytes.
  • legal.png: 2,048,326 bytes.
  • firma.png: 1,831,038 bytes.
  • ground.png: 640,570 bytes.
  • balloon.png: 441,382 bytes.

Diagnosticos confirmados por Lighthouse en el panel, login/modal incognito y home publica:

  • Avoid enormous network payloads: total 16,825 KiB.
  • Improve image delivery: ahorro estimado 1,682.6 KiB.
  • Recursos principales indicados por Lighthouse:
  • /rrhh.png: 2,270.4 KiB.
  • /operaciones.png: 2,244.6 KiB.
  • /flujo_firma.png: 2,063.5 KiB.
  • /administracion.png: 2,049.3 KiB.
  • /CTA.png: 2,037.6 KiB.
  • /legal.png: 2,000.2 KiB.
  • /firma.png: 1,788.1 KiB.
  • /ws-cd-firma/img/fondos/ground.png: 625.0 KiB.
  • /assets/index-Cbl1jt2H.js: 465.1 KiB.
  • /ws-cd-firma/img/fondos/balloon.png: 430.8 KiB.
  • En login/modal incognito, Lighthouse confirma una oportunidad mucho mayor de optimizacion de imagenes: ahorro estimado 14,323 KiB, payload total 16,815 KiB y transferencia first-party 15,974.2 KiB.
  • Recursos principales indicados en login/modal incognito:
  • /rrhh.png: 2,270.4 KiB, ahorro estimado 2,011.5 KiB.
  • /operaciones.png: 2,244.6 KiB, ahorro estimado 1,985.7 KiB.
  • /flujo_firma.png: 2,063.5 KiB, ahorro estimado 1,804.8 KiB.
  • /administracion.png: 2,049.2 KiB, ahorro estimado 1,790.6 KiB.
  • /CTA.png: 2,037.6 KiB, ahorro estimado 1,778.8 KiB.
  • /legal.png: 2,000.2 KiB, ahorro estimado 1,741.6 KiB.
  • /firma.png: 1,788.1 KiB, ahorro estimado 1,529.7 KiB.
  • /ws-cd-firma/img/fondos/ground.png: 625.0 KiB, ahorro estimado 501.0 KiB.
  • /ws-cd-firma/img/fondos/balloon.png: 430.8 KiB, ahorro estimado 428.0 KiB.
  • Lighthouse tambien detecta imagenes sobredimensionadas para su tamano mostrado:
  • signmethod_logo_white16.png: 254.9 KiB, ahorro estimado 254.1 KiB.
  • balloon2.png: 133.1 KiB, ahorro estimado 132.2 KiB.
  • cloud-lg1.png: 34.9 KiB, ahorro estimado 24.0 KiB.
  • En login/modal incognito tambien aparecen balloon3.png (323.8 KiB, ahorro 322.6 KiB) y cloud-lg2.png (20.4 KiB, ahorro 16.9 KiB).
  • En home publica, Lighthouse confirma de nuevo una oportunidad alta de optimizacion de imagenes: ahorro estimado 14,323 KiB, payload total 16,817 KiB y transferencia first-party 15,975.7 KiB.
  • Falta width/height explicito en al menos signmethod_logo_white16.png y ground.png, lo que puede afectar a estabilidad visual.
  • El CSS /assets/index-Iq5l-xVV.css bloquea render inicial con ahorro estimado entre 30 ms y 80 ms segun superficie.
  • El informe recomienda mejorar descubrimiento del recurso LCP y aplicar fetchpriority=high.
  • JavaScript no usado: ahorro estimado 443 KiB en panel autenticado con extensiones, 240 KiB en login/modal incognito y 447 KiB en home publica con parte atribuible a extension Adobe Acrobat. CSS no usado en login/modal incognito: 64 KiB.
Conclusion
  • Cache y compresion de assets versionados: correctos.
  • HTML y API: correctos al no quedar cacheados como datos sensibles.
  • Tamano total de recursos: no OK por carga estatica aproximada de 17.22 MB en DevTools, 16,825 KiB en Lighthouse del panel, 16,815 KiB en Lighthouse de login/modal incognito y 16,817 KiB en Lighthouse de home publica, dominada por imagenes grandes.
Para convertirlo en OK
  • Convertir imagenes grandes a formatos modernos (webp/avif) con fallback si aplica.
  • Servir variantes responsive con srcset/sizes o CSS equivalente para no descargar imagenes de escritorio en contextos pequenos.
  • Revisar si todas las imagenes publicas deben cargarse en el panel autenticado o si pueden diferirse.
  • Aplicar lazy loading a imagenes fuera del primer viewport.
  • Declarar width y height en imagenes criticas para estabilizar layout.
  • Hacer descubrible el recurso LCP en el HTML inicial y marcarlo con fetchpriority=high cuando aplique.
  • Revisar tree shaking/code splitting para reducir JS no usado y retirar CSS no usado del primer render.
  • Definir presupuesto de peso por pagina y por tipo de recurso.
  • Repetir la recarga sin cache y conservar evidencia de:
  • HTML sin cache sensible.
  • API sin cache sensible.
  • Assets versionados con immutable.
  • JS/CSS comprimidos con Brotli o gzip.
  • Peso total dentro del presupuesto acordado.

REN-03 - Red lenta desde el navegador

Resultado esperado: muestra carga/error y no duplica acciones.

Estado: KO / parcial.

Evidencia observada

Se simulo red lenta desde Chrome/DevTools:

  • Latencia: 400 ms.
  • Descarga: 50 Kbps aproximados.
  • Subida: 20 Kbps aproximados.
  • Tipo de conexion: cellular3g.

Prueba realizada:

  • Se recargo https://signmethod.com/#dashboard.
  • Tiempo observado hasta lectura estable: 7.9 s aproximadamente.
  • Contadores antes:
  • Enviados 6.
  • Pendientes 3.
  • Completados 1.
  • Contadores despues:
  • Enviados 6.
  • Pendientes 3.
  • Completados 1.
  • No se observaron duplicados visibles en una operacion de solo lectura.
  • Las respuestas principales de assets, API y listados devolvieron 200/204.
  • Se observo un fallo de red net::ERR_FAILED durante la captura de eventos.
  • La UI final no quedo en estado de carga ni mostro mensaje de error visible.
Conclusion

La aplicacion puede recuperar el dashboard bajo red lenta y no se observan duplicados visibles en una recarga de lectura. Sin embargo, el criterio exige carga/error y ausencia de duplicados ante acciones; al no probarse una accion controlada de escritura ni un reintento real, y aparecer un net::ERR_FAILED, el punto no puede cerrarse como OK.

Para convertirlo en OK
  • Definir una accion QA segura para probar red lenta con posible reintento, por ejemplo guardar borrador controlado sin envio externo.
  • Registrar contadores/estado antes de la accion.
  • Simular red lenta y, si procede, corte temporal durante la accion.
  • Verificar que la UI muestra carga o error comprensible mientras espera.
  • Confirmar que el boton queda bloqueado o que existe idempotencia para evitar doble accion.
  • Recuperar red y reintentar si corresponde.
  • Confirmar en UI y backend/logs que no se duplican acuerdos, documentos, usuarios, correos ni firmas.
  • Si la prueba implica envio de correo o firma real, pedir confirmacion justo antes de ejecutar esa accion.
  • Guardar captura, eventos de red redaccionados y conteos antes/despues.
REN-03 KO

Probar red lenta desde el navegador.

Probar red lenta desde el navegador.

Resultado esperado: Muestra carga/error y no duplica acciones.

1 archivo fuente 1 evidencia visual

Evidencias visuales

01REN-03-red-lenta-dashboard-2026-09-02.pngOriginal
REN-04 KO

REN-04 / REN-05 - Resiliencia ante errores, latencia, timeouts y cold starts

Simular 4xx/5xx solo localmente o en un entorno controlado.

Resultado esperado: Informa y permite reintentar con seguridad.

3 archivos fuente 2 evidencias visuales

Evidencias visuales

01REN-04-token-inexistente-produccion-2026-09-02.pngOriginal
02REN-04-token-inexistente-produccion-retest-2026-09-02.pngOriginal

Informe de evidencia

REN-04 / REN-05 - Resiliencia ante errores, latencia, timeouts y cold starts

Fecha: 02/09/2026 Entorno: revision local controlada y produccion SignMethod Herramientas: Chrome real conectado a SignMethod, CDP/Network, Playwright local con mocks, revision de codigo, evidencias Lighthouse/Chrome existentes Sin efectos reales: no se provocaron 5xx reales en produccion, no se enviaron acuerdos, no se subieron documentos y no se modificaron datos AWS.

REN-04 - Simular 4xx/5xx en entorno controlado

Resultado esperado: informa y permite reintentar con seguridad.

Estado: KO.

Evidencia observada
  • Se reviso el manejador frontend de API:
  • fetchWithTimeout aplica AbortController y timeout cliente de 60 s.
  • apiFetch y apiFetchPublic convierten respuestas no ok en ApiRequestError.
  • translateUserMessage traduce errores de red y timeout a mensajes en castellano, por ejemplo No se ha podido conectar con el servidor. Revisa la conexion e intentalo de nuevo. y El backend no ha respondido a tiempo. Vuelve a intentarlo en unos segundos.
  • Hay acciones de recarga en varias zonas (Recargar, Actualizar acuerdos, Actualizar usuarios, Recargar datos) y botones deshabilitados con isBusy durante operaciones.
  • Se reviso el backend:
  • Las rutas no reconocidas responden 404 con { message: 'Route not found' }.
  • Los errores controlados conservan su statusCode.
  • Los errores no controlados se devuelven como 500.
  • Se ejecuto una prueba local controlada de 404 con API simulada, sin tocar AWS:
powershell
npm.cmd run dev --workspace=signmethod-frontend -- --host 127.0.0.1 --port 5173
$env:PLAYWRIGHT_BASE_URL='http://127.0.0.1:5173'
npx.cmd playwright test e2e/public.spec.ts -g "muestra estado de acuerdo inexistente" --project=chromium
  • Resultado de la prueba: fallida.
  • Resultado esperado por el test: mostrar No se ha encontrado un acuerdo para este token.
  • Resultado real observado por Playwright: se muestra Acuerdo no encontrado.
  • La pagina mantiene el encabezado Visualización del acuerdo, pero no presenta el mensaje funcional esperado ni una accion clara de reintento.
  • Artefactos locales generados por Playwright:
  • test-results/public-muestra-estado-de-a-f47ff-e-cuando-el-token-no-existe-chromium/error-context.md
  • test-results/public-muestra-estado-de-a-f47ff-e-cuando-el-token-no-existe-chromium/test-failed-1.png
  • test-results/public-muestra-estado-de-a-f47ff-e-cuando-el-token-no-existe-chromium/video.webm
  • playwright-report/index.html
  • Se repitio la comprobacion desde Chrome real en produccion con token inexistente no sensible:
  • URL: https://signmethod.com/comprobar-token?token=TOKEN-INEXISTENTE-REN-04-2026-09-02.
  • Documento HTML: HTTP 200.
  • API publica: GET /prod/public-agreements/TOKEN-INEXISTENTE-REN-04-2026-09-02 devuelve HTTP 404.
  • Texto visible en la UI: Agreement not found.
  • No se observa accion clara de reintento en la vista.
  • Captura: docs/evidencias/REN-04-token-inexistente-produccion-2026-09-02.png.
  • Se repitio de nuevo la comprobacion desde Chrome real en produccion:
  • URL: https://signmethod.com/comprobar-token?token=TOKEN-INEXISTENTE-REN-04-RETEST-2026-09-02.
  • Documento HTML: HTTP 200.
  • API publica: GET /prod/public-agreements/TOKEN-INEXISTENTE-REN-04-RETEST-2026-09-02 devuelve HTTP 404.
  • Texto visible en la UI: Agreement not found.
  • No se encontraron botones o enlaces con texto/etiqueta de reintentar, recargar, volver a intentar o equivalente.
  • Captura: docs/evidencias/REN-04-token-inexistente-produccion-retest-2026-09-02.png.
  • Durante la misma recarga se observo de nuevo un GET /prod/signatures con net::ERR_FAILED, ya visto en revisiones TEC/REN anteriores.
  • Se intento simular 500 mediante interceptacion CDP limitada a la peticion Fetch/XHR de public-agreements, pero Chrome rechazo la operacion con Invalid InterceptionId; no se conserva como evidencia funcional y no se forzo otra via en produccion.
Limitaciones
  • No se simulo todavia un 500 controlado.
  • No se simulo todavia timeout real de backend ni corte de red en una accion de escritura.
  • No se demostro que el usuario pueda reintentar la misma operacion con seguridad despues del error.
  • No se debe provocar un 5xx real en produccion para esta prueba.
Para convertirlo en OK
  • Crear una prueba Playwright/local especifica para resiliencia con mocks de:
  • 404 funcional.
  • 500 controlado.
  • timeout/abort.
  • fallo de red (route.abort()).
  • Verificar en cada caso:
  • Mensaje claro en castellano.
  • Sin exposicion de stack trace, token, URL firmada completa ni datos sensibles.
  • Boton o accion de reintento visible cuando aplique.
  • Botones de escritura bloqueados mientras la operacion esta en curso.
  • Reintento seguro sin duplicar acuerdos, documentos, usuarios, correos ni firmas.
  • Corregir la discrepancia del 404: al recibir Acuerdo no encontrado, la UI debe mostrar el texto funcional esperado o actualizar formalmente el criterio/test.
  • Ejecutar tambien un caso de 500 y timeout en entorno local/QA, nunca generando fallos reales en produccion.
  • Guardar reporte Playwright y capturas finales en docs/evidencias.

REN-05 - Latencia, timeouts y cold starts observados

Resultado esperado: estan dentro de los limites acordados.

Estado: KO.

Evidencia observada
  • Configuracion de infraestructura revisada en codigo:
  • Lambda signmethod-prod-admin-api usa runtime Node.js 22.
  • Memoria configurada: 256 MB.
  • Timeout Lambda configurado: 15 s.
  • API Gateway stage prod tiene tracingEnabled: true y metricsEnabled: true.
  • Configuracion frontend:
  • Timeout cliente para API: 60 s.
  • Mensaje de timeout: El backend no ha respondido a tiempo. Vuelve a intentarlo en unos segundos.
  • Evidencias de navegador/Lighthouse ya documentadas:
  • Panel: LCP 1.4 s, TBT 0 ms, CLS 0.03, Speed Index 1.0 s.
  • Login/modal incognito: LCP 1.7 s, TBT 0 ms, CLS 0, Speed Index 0.7 s.
  • Home publica: LCP 1.8 s, TBT 0 ms, CLS 0, Speed Index 2.0 s.
  • Repeticion en Chrome real sobre https://signmethod.com/#dashboard, solo lectura:
  • GET /prod/health: HTTP 200, duracion observada aprox. 185 ms.
  • GET /prod/users?email=joel.lopez%40softradis.com: HTTP 200, duraciones observadas aprox. 443 ms y 646 ms.
  • GET /prod/companies: HTTP 200, duracion observada aprox. 380 ms.
  • GET /prod/signature-requests?companyId=pepe: HTTP 200, duracion observada aprox. 256 ms.
  • GET /prod/signature-requests/drafts?companyId=pepe: HTTP 200, duracion observada aprox. 315 ms.
  • GET /prod/signatures: fallo de red net::ERR_FAILED, duracion observada aprox. 121 ms.
  • Captura: docs/evidencias/REN-05-panel-timings-produccion-2026-09-02.png.
  • Metricas CDP de la vista del panel tras recarga:
  • Nodes: 554.
  • JSEventListeners: 553.
  • LayoutDuration: 0.093 s.
  • RecalcStyleDuration: 0.016 s.
  • ScriptDuration: 0.067 s.
  • TaskDuration: 0.303 s.
  • JSHeapUsedSize: aprox. 12.0 MB.
  • JSHeapTotalSize: aprox. 16.7 MB.
  • Evidencias AWS historicas comunicadas para pruebas TEC:
  • Lambda Errors=0 y Throttles=0 en ventanas revisadas.
  • API Gateway 5XXError=0 en ventanas revisadas.
  • API Gateway en una revision previa tuvo latencia media maxima observada aproximada de 117 ms.
  • Resultados API Gateway aportados por Joel para signmethod-prod-admin-api / stage prod, region eu-west-1.
  • Ventana analizada: 02/09/2026, 10:00-10:45 UTC.
  • Count: 76.
  • 4XXError: 2 (2.63 %).
  • 5XXError: 0.
  • Latency:
  • p50: 30.91 ms.
  • p90: 678.05 ms.
  • p95: 1,218.50 ms.
  • p99: 1,316.74 ms.
  • max: 1,345 ms.
  • IntegrationLatency:
  • p50: 76.45 ms.
  • p90: 1,156.27 ms.
  • p95: 1,232.12 ms.
  • p99: 1,275.55 ms.
  • max: 1,278 ms.
  • Timeouts Lambda: 0.
  • Timeouts de integracion Gateway: 0.
  • Fallos de integracion detectados en logs: 0.
  • La comunicacion anterior de 5 marcadores ERROR/Unhandled era incorrecta porque incluia timestamps del 01/09/2026. En la ventana exacta del 02/09/2026 hay 2, ambos HttpError controlados con respuesta 404.
  • Interpretacion: p95/p99 queda alrededor de 1.2-1.3 s y el tramo lento se concentra principalmente en la integracion.
  • Resultados Lambda aportados por Joel para signmethod-prod-admin-api, region eu-west-1.
  • Ventana analizada: 02/09/2026, 10:00-10:45 UTC.
  • Invocations: 40.
  • Errors: 0.
  • Throttles: 0.
  • ConcurrentExecutions: maximo 4, media 1.48.
  • Duration:
  • p50: 84.09 ms.
  • p90: 445.79 ms.
  • p95: 545.00 ms.
  • p99: 554.06 ms.
  • max: 556.35 ms.
  • Timeout configurado: 15 s; ejecuciones >=14 s: 0; ejecuciones >=15 s: 0.
  • La ejecucion mas lenta utilizo aproximadamente el 3.7 % del timeout configurado.
  • Memory Size: 256 MB; Max Memory Used: 124 MB (48.4 %); margen observado: 132 MB.
  • Cold starts con REPORT Init Duration: 8 de 40 (20 %).
  • Init Duration: minima 544 ms, p50 558.60 ms, maxima 624.76 ms.
  • Busqueda en logs: Task timed out=0, Runtime exited=0, Unhandled=0 y ERROR=2.
  • Los dos ERROR fueron HttpError controlados con respuesta 404, a las 10:42:34 y 10:43:12 UTC; no provocaron errores de ejecucion Lambda, respuestas 5xx ni indisponibilidad del servicio.
  • Interpretacion: Lambda presenta margen amplio de timeout y memoria, sin errores de ejecucion ni throttling. El 20 % de cold starts anade aproximadamente 544-625 ms de inicializacion y supera el objetivo <=10 % aportado posteriormente.
  • Resultados CloudWatch Logs y X-Ray aportados por Joel para una ventana ampliada.
  • Ventana analizada: 02/09/2026 07:47 UTC a 03/09/2026 07:47 UTC.
  • Grupo de logs: /aws/lambda/signmethod-prod-admin-api.
  • Lineas REPORT: 128.
  • Busqueda en logs: Task timed out=0, Runtime exited=0 y ERROR=3.
  • Los tres ERROR fueron HttpError 404 controlados; no provocaron fallos de ejecucion Lambda, faults ni respuestas 5xx.
  • Rendimiento Lambda segun REPORT: p95 553.27 ms, p99 633.19 ms y maximo 801.37 ms.
  • El resultado comunicado incluye tambien como referencia CloudWatch p95 571.15 ms y p99 646.90 ms; esta diferencia respecto a los percentiles anteriores debe aclararse indicando consulta, estadistico y periodo exactos.
  • Memory Size: 256 MB; Max Memory Used: 124 MB (48.4 %).
  • Cold starts: 24 de 128 (18.75 %).
  • Init Duration: p95 624.76 ms, maxima 724.70 ms.
  • Muestra REPORT censurada:
  • Duration 50.88 ms | Billed 51 ms | Memory 256 MB | Max Used 120 MB | Init -.
  • Duration 103.99 ms | Billed 104 ms | Memory 256 MB | Max Used 118 MB | Init -.
  • Duration 26.72 ms | Billed 27 ms | Memory 256 MB | Max Used 117 MB | Init -.
  • Duration 413.24 ms | Billed 1,014 ms | Memory 256 MB | Max Used 117 MB | Init 600.19 ms.
  • Duration 553.18 ms | Billed 554 ms | Memory 256 MB | Max Used 120 MB | Init -.
  • X-Ray del stage prod: 232 trazas; API p95 1,163.25 ms, p99 1,344.21 ms y maximo 1,530 ms.
  • Respuestas X-Ray: 118x200, 107x204, 3x404 y 4x401.
  • X-Ray registra 7 errores, correspondientes exclusivamente a los 3x404 y 4x401; Faults=0 y Throttles=0.
  • API Gateway tiene X-Ray activo, pero Lambda esta en modo PassThrough. Las trazas solo contienen segmentos de API Gateway, Lambda inferida y Mock; no existen subsegmentos de DynamoDB, S3, Cognito, SES o SSM.
  • El grupo de logs no tiene politica de retencion, por lo que conserva datos indefinidamente, ni una clave KMS especifica configurada.
  • Interpretacion: la ventana ampliada confirma rendimiento estable y margen de memoria, sin timeouts, fallos de runtime, faults, throttling ni 5xx. La tasa de cold starts 18.75 % supera el objetivo aportado de <=10 %, y persiste la carencia de observabilidad interna.
  • Resultados DynamoDB, S3, umbrales y correlacion de /prod/signatures aportados por Joel para la ventana ampliada, entorno produccion eu-west-1.
  • DynamoDB: 9 tablas signmethod-prod-*; SystemErrors=0, UserErrors=0 y ThrottledRequests=0 en todas.
  • Peor latencia DynamoDB observada: Query p99=20.83 ms en signmethod-prod-users; no se aprecia saturacion ni error de servicio.
  • signmethod-prod-companies usa Scan, p95/p99 17.45/17.51 ms en 19 peticiones. Funciona correctamente, aunque Scan es menos eficiente que Query.
  • signmethod-prod-signature-requests: GetItem p95/p99 3.72/3.77 ms, Query 4.62/4.74 ms, Scan 16.65/16.76 ms y UpdateItem 5.63/5.63 ms, sin errores ni throttling.
  • signmethod-prod-signatures y signmethod-prod-registration-allowlist no registraron actividad en la ventana.
  • El resto de operaciones DynamoDB observadas presenta p99 entre 3.77 y 12.44 ms, salvo signing-tokens GetItem con 11.58 ms; las operaciones con pocas muestras deben interpretarse con cautela.
  • S3 signmethod-prod-documents-743737184059: no tiene metricas detalladas de solicitudes ni server access logging. No pueden auditarse 4xxErrors, 5xxErrors, FirstByteLatency ni TotalRequestLatency sin modificar la configuracion.
  • No hay alarmas CloudWatch configuradas para API Gateway, Lambda, DynamoDB o S3; los umbrales aportados no estan aplicados automaticamente.
  • Umbrales operativos recomendados:
  • API Gateway p95 <=1,500 ms y p99 <=2,000 ms; observado p95/p99 1,163/1,344 ms: cumple.
  • Lambda p95 <=750 ms y p99 <=1,000 ms; observado de referencia p95/p99 571/647 ms: cumple.
  • Cold starts <=10 %; observado 18.75 %: no cumple.
  • Init Duration p95 <=800 ms y maximo <=1,000 ms; observado 624.76/724.70 ms: cumple.
  • Timeouts permitidos 0; observado 0: cumple.
  • Throttles permitidos 0; observado en Lambda y DynamoDB 0: cumple.
  • Correlacion de GET /prod/signatures:
  • La ruta existe, usa integracion Lambda AWS_PROXY y esta protegida con COGNITO_USER_POOLS.
  • X-Ray registra 17 solicitudes OPTIONS /prod/signatures, todas 204, pero ningun GET /prod/signatures; tampoco hay actividad en la tabla signmethod-prod-signatures.
  • No hubo faults, throttles ni 5xx relacionados.
  • Las respuestas generadas directamente por API Gateway (401, 403, 429, 500 y 504) no tienen cabeceras CORS configuradas.
  • La evidencia es compatible con un rechazo de autorizacion/CORS anterior a Lambda que Chrome muestra como net::ERR_FAILED. No es concluyente porque faltan hora exacta, access logs de API Gateway y HAR/consola completa.
Resultado de REN-05
  • La ejecucion observada es estable: API Gateway, Lambda y DynamoDB quedan dentro de los umbrales de latencia aportados; no hay timeouts, throttling, fallos de runtime, faults ni 5xx, y Lambda conserva margen de memoria.
  • El resultado es KO porque la tasa de cold starts 18.75 % supera el objetivo <=10 %.
  • Tambien quedan carencias de observabilidad: Lambda en PassThrough sin subsegmentos internos, S3 sin metricas detalladas ni access logging, API Gateway sin access logging ni CORS en respuestas de error y ausencia de alarmas CloudWatch.
  • La discrepancia de percentiles Lambda queda explicada como dos calculos/referencias comunicados; para la comparacion con umbrales se usa la referencia p95/p99 571.15/646.90 ms, que cumple holgadamente.
Para convertirlo en OK
  • Reducir la tasa de cold starts desde 18.75 % hasta <=10 % o aprobar formalmente una desviacion. Valorar provisioned concurrency, mantener dependencias/conexiones fuera del handler y reducir inicializacion del paquete.
  • Repetir una ventana representativa y demostrar simultaneamente API p95 <=1,500 ms, API p99 <=2,000 ms, Lambda p95 <=750 ms, Lambda p99 <=1,000 ms, Init Duration p95 <=800 ms, maxima <=1,000 ms, timeouts 0 y throttles 0.
  • Activar tracing en Lambda e instrumentacion SDK para generar subsegmentos de DynamoDB, S3, Cognito, SES y SSM.
  • Habilitar access logging de API Gateway y configurar CORS en DEFAULT_4XX, DEFAULT_5XX, UNAUTHORIZED, ACCESS_DENIED y respuestas equivalentes; repetir /prod/signatures con hora exacta y HAR censurado.
  • Habilitar metricas detalladas o un mecanismo equivalente para auditar latencia y errores HTTP del bucket S3 de documentos.
  • Crear alarmas CloudWatch para los umbrales aprobados, definir retencion del grupo de logs y valorar KMS segun requisitos de seguridad y cumplimiento.
  • Guardar capturas o export CSV/JSON censurado que respalde las metricas y la repeticion final.
REN-05 KO

Revisar latencia, timeouts y cold starts observados.

Revisar latencia, timeouts y cold starts observados.

Resultado esperado: Están dentro de los límites acordados.

1 archivo fuente 1 evidencia visual

Evidencias visuales

01REN-05-panel-timings-produccion-2026-09-02.pngOriginal
REN-06 KO

REN-06 - Cuotas y throttling de servicios AWS

Revisar cuotas de Cognito, API Gateway, Lambda, DynamoDB, S3 y SES.

Resultado esperado: Hay margen suficiente y no existe throttling anómalo.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

REN-06 - Cuotas y throttling de servicios AWS

Fecha de revisión: 03/09/2026

Entorno: producción

Región principal: eu-west-1

Fuente: revisión de solo lectura de AWS realizada por Vera y trasladada al equipo de QA.

Objetivo

Revisar las cuotas y el uso observado de Cognito, API Gateway, Lambda, DynamoDB, S3 y SES para confirmar que existe margen suficiente y que no hay throttling anómalo.

Resultado global

KO. No se observa saturación durante el uso normal ni durante la prueba de producción del 02/09/2026, pero el criterio global no se cumple por tres motivos:

  • API Gateway registró throttling del plano de control durante un despliegue.
  • DynamoDB registró throttling del plano de control al crear una tabla.
  • S3 no tiene telemetría suficiente para demostrar solicitudes, latencia y errores de objetos durante una ventana representativa.

No quedan servicios en estado pendiente: Cognito, Lambda y SES cumplen; API Gateway, DynamoDB y S3 quedan en KO por los motivos indicados.

Resumen cuantitativo

ServicioResultadoCuota o referenciaPico o uso observadoMargen / throttling
CognitoOKAutenticación: 120 req/s0,033 req/s (0,028 %); en 7 días: 114 autenticaciones, 34 emisiones de tokens y 32 creacionesMargen amplio; sin TooManyRequests ni errores de límite
API GatewayKOLímite regional: 10.000 req/s0,533 req/s; durante la prueba: 0 respuestas 429 y 0 respuestas 5XXSin saturación de tráfico, pero CloudTrail registró 701 TooManyRequestsException el 27/08 en operaciones administrativas de despliegue
LambdaOKConcurrencia disponible observada: 102.325 invocaciones en 7 días; concurrencia máxima 5; duración máxima 1.157 ms; memoria máxima 127/256 MB0 errores, 0 throttles y 0 timeouts; margen de concurrencia del 50 % y amplio margen frente al timeout de 15 s
DynamoDBKOTablas bajo demanda; referencia por tabla: 40.000 RCU/WCU por segundo9 tablas y 4 índices activos; pico 3,5 RCU y 3 WCUSin throttling de datos en tablas activas, pero CloudTrail registró una ThrottlingException en CreateTable durante el despliegue del 27/08
S3KONo acreditado por falta de métricas de solicitudesAproximadamente 50 objetos y 5,37 MiBNo se localizaron SlowDown, 503 ni ServiceUnavailable, pero la observabilidad actual no permite demostrar errores y latencias de objetos
SESOKSandbox previsto: 200 mensajes/24 h y 1 mensaje/s5/200 mensajes en 24 h (2,5 %); margen de 195; en 7 días: 50 envíos, 49 entregas y 1 reboteEnvío habilitado y estado HEALTHY; durante la prueba hubo 1 envío y 1 entrega

Detalle por servicio

Cognito - OK
  • Pico de autenticación: 0,033 req/s, aproximadamente el 0,028 % de la cuota de 120 req/s.
  • En 7 días: 114 autenticaciones, 34 emisiones de tokens y 32 creaciones.
  • No se encontraron TooManyRequests ni errores de límite.
  • Los errores observados correspondieron a credenciales incorrectas, usuarios inexistentes o códigos caducados; no fueron errores de capacidad.
  • Acción: mantener la monitorización actual.
API Gateway - KO
  • Pico: 0,533 req/s frente al límite regional de 10.000 req/s.
  • X-Ray no mostró respuestas 429 en las solicitudes trazadas.
  • Durante la prueba del 02/09 se observaron 0 respuestas 429 y 0 respuestas 5XX.
  • CloudTrail registró 701 TooManyRequestsException el 27/08 durante operaciones administrativas de despliegue.
  • El throttling no afectó al tráfico de usuarios, pero impide certificar ausencia de throttling anómalo en el servicio.
  • No es necesario aumentar la cuota de tráfico.

Para convertirlo en OK:

  1. Añadir reintentos con backoff exponencial y jitter al despliegue.
  2. Reducir el paralelismo y la frecuencia de llamadas administrativas a API Gateway.
  3. Evitar operaciones de configuración repetidas o innecesarias.
  4. Habilitar access logs del stage, incluyendo el código de estado.
  5. Repetir el despliegue y verificar que finaliza sin TooManyRequestsException.
  6. Confirmar una ventana limpia, preferiblemente de siete días, sin throttling ni respuestas 429 o 5XX anómalas.
Lambda - OK
  • 2.325 invocaciones en 7 días.
  • 0 errores, 0 throttles y 0 timeouts.
  • Concurrencia máxima: 5 de 10.
  • Duración máxima: 1.157 ms frente a un timeout de 15 s.
  • Memoria máxima: 127 de 256 MB.
  • Durante la prueba se registraron 40 invocaciones sin errores.
  • Acción: mantener alarmas para errores, throttles y concurrencia.
DynamoDB - KO
  • 9 tablas y 4 índices activos, todos bajo demanda.
  • Pico: 3,5 RCU y 3 WCU frente a la referencia por tabla de 40.000/s.
  • No se encontraron errores de capacidad en el tráfico de las tablas activas.
  • CloudTrail registró una ThrottlingException en CreateTable durante el despliegue del 27/08.
  • Es throttling del plano de control, no saturación de lecturas o escrituras.
  • No es necesario aumentar la capacidad de las tablas.

Para convertirlo en OK:

  1. Añadir backoff exponencial y jitter a la creación y configuración de tablas.
  2. No crear ni modificar varias tablas simultáneamente.
  3. Esperar a que cada tabla quede ACTIVE antes de continuar el despliegue.
  4. Habilitar alarmas para ReadThrottleEvents, WriteThrottleEvents, ThrottledRequests y SystemErrors.
  5. Activar Contributor Insights donde proceda.
  6. Repetir el despliegue y confirmar una ventana limpia sin ThrottlingException.
S3 - KO por observabilidad
  • Aproximadamente 50 objetos y 5,37 MiB almacenados.
  • No se encontraron SlowDown, 503 ni ServiceUnavailable.
  • El KO no corresponde a saturación detectada, sino a falta de métricas suficientes para demostrar solicitudes, latencia y errores de objetos.

Para convertirlo en OK:

  1. Habilitar S3 Request Metrics para los buckets de producción.
  2. Crear alarmas sobre 4xxErrors, 5xxErrors, FirstByteLatency y latencia total.
  3. Habilitar CloudTrail Data Events o server access logging para disponer de evidencia de las operaciones de objetos.
  4. Mantener la captura durante una ventana representativa y repetir REN-06.
  5. Confirmar ausencia de SlowDown/503 y margen suficiente.
SES - OK para el sandbox previsto
  • El acceso de auditoría está confirmado.
  • El sandbox es el estado previsto y no se requiere acceso de producción.
  • Envío habilitado y estado HEALTHY.
  • Uso: 5 de 200 mensajes en 24 horas (2,5 %), con margen de 195 mensajes.
  • Tasa máxima: 1 mensaje/s.
  • En 7 días: 50 envíos, 49 entregas y 1 rebote.
  • Durante la prueba: 1 envío y 1 entrega.
  • Acción: vigilar los rebotes y configurar alertas si aumenta su proporción; no es necesario salir del sandbox.

Acciones para alcanzar OK global

  1. Corregir los despliegues de API Gateway y DynamoDB para gestionar los límites mediante backoff, jitter, menor paralelismo y esperas de estabilización.
  2. Repetir los despliegues sin throttling y observar una ventana limpia, preferiblemente de siete días.
  3. Habilitar la telemetría de solicitudes de S3 y verificarla durante una ventana representativa.
  4. Repetir REN-06 y confirmar que los seis servicios cumplen simultáneamente.

Limitaciones de la evidencia

  • Los resultados proceden de una revisión de AWS comunicada por Vera al equipo de QA.
  • No se adjuntaron en esta entrega exportaciones de CloudWatch, Service Quotas, CloudTrail o X-Ray ni capturas de consola.
  • Las cifras deben conservarse junto con las exportaciones o capturas censuradas si se necesita trazabilidad independiente para auditoría.

ROL

Roles y permisos

2 bloques de evidencia
ROL-04B KO

Evidencia ROL-04B: autorización del Firmante

Intentar crear, guardar como borrador y enviar un acuerdo con una sesión de firmante , incluyendo peticiones directas a la API.

Resultado esperado: La interfaz no ofrece esas acciones y el backend responde 403 en todos los endpoints de creación, borrador y envío.

7 archivos fuente 6 evidencias visuales

Evidencias visuales

01ROL-04B-firmante-abre-flujo-enviar-acuerdo-2026-08-28.pngOriginal
02ROL-04B-firmante-borrador-guardado-2026-08-28.pngOriginal
03ROL-04B-firmante-crea-borrador-indebidamente-2026-08-28.pngOriginal
04ROL-04B-listado-borrador-creado-por-firmante-2026-08-28.pngOriginal
05ROL-04B-panel-firmante-sin-acciones-creacion-2026-08-28.pngOriginal
06ROL-04B-pendientes-muestra-nuevo-acuerdo-2026-08-28.pngOriginal

Informe de evidencia

Evidencia ROL-04B: autorización del Firmante

Fecha de comprobación: 28/08/2026 Entorno: producción (https://signmethod.com/) Perfil: Firmante de Prueba Produccion

Objetivo

Confirmar que una sesión firmante no puede crear acuerdos, guardar borradores ni enviar acuerdos, ni desde la interfaz ni mediante los endpoints privados. El backend debe responder 403 antes de crear datos, generar URLs de subida o enviar comunicaciones.

Resultado resumido

KO. La cabecera principal no muestra Enviar acuerdo, pero el listado abierto desde Pendientes sí muestra Nuevo acuerdo. El botón abre el flujo completo y el guardado automático crea un borrador real. El backend no devuelve 403 para el guardado y su implementación no aplica una comprobación de rol en creación, borrador o envío.

No se completó un envío real porque habría requerido documentos y destinatarios y podría haber generado almacenamiento o correos. No es necesario provocar ese efecto para confirmar el fallo: la creación efectiva del borrador y la ausencia del control de rol en el endpoint de envío ya invalidan el criterio.

Comprobaciones

1. Panel principal

El panel identifica la sesión como Firmante y no muestra Enviar acuerdo, Acuerdos, Plantillas ni Administración en la navegación principal. Esta parte es correcta.

Imagen: Panel Firmante sin acciones principales de creación

2. Listado de Pendientes

Al pulsar Pendientes, el modal de Acuerdos muestra indebidamente Nuevo acuerdo.

Imagen: Pendientes muestra Nuevo acuerdo

3. Apertura del flujo

El botón permite abrir las seis etapas de Enviar acuerdo, incluidas Información, Documentos, Participantes, Campos, Mensaje y Revisar y enviar.

Imagen: Firmante abre el flujo Enviar acuerdo

4. Creación del borrador

Se introdujeron únicamente un título y una descripción de QA, sin documentos ni destinatarios. El guardado automático mostró confirmación a las 13:03 y el contador cambió a Borradores 1.

Imagen: Confirmación del borrador guardado

El borrador aparece después en el listado con el título QA ROL-04B rechazo firmante 2026-08-28, cero destinatarios y cero documentos.

Imagen: Borrador creado por Firmante

También se conserva una captura del contenido de QA introducido:

Imagen: Contenido del borrador de autorización

Revisión de autorización

  • El modal de tareas renderiza Nuevo acuerdo sin condicionarlo a canSendAgreement.
  • POST /signature-requests/drafts resuelve la empresa y guarda el borrador sin exigir un rol emisor.
  • POST /signature-requests crea la solicitud sin exigir un rol emisor.
  • POST /signature-requests/{requestId}/send llama a assertActorCanAccessCompany, que comprueba pertenencia al tenant pero admite también al firmante; no exige owner, admin o emisor.
  • La lectura de acuerdos sí filtra al firmante por destinatario, pero ese control no protege las operaciones de escritura.

Cómo conseguir un OK

  1. Crear una comprobación centralizada, por ejemplo assertActorCanSendAgreement, que solo acepte owner, admin, emisor y el superadministrador autorizado.
  2. Ejecutar esa comprobación al principio de POST /signature-requests, POST /signature-requests/drafts y POST /signature-requests/{requestId}/send, antes de validar el cuerpo o escribir en DynamoDB/S3/SES.
  3. Aplicar la misma política a listado, actualización y eliminación de borradores, duplicación, cancelación y reenvío cuando correspondan a operaciones emisoras.
  4. Mantener para el firmante únicamente los endpoints necesarios para consultar y firmar acuerdos donde figure como destinatario.
  5. Condicionar todos los botones y accesos de creación del frontend a canSendAgreement, incluido el botón del modal de tareas.
  6. Bloquear también la apertura programática del modal de envío cuando el rol sea firmante.
  7. Añadir pruebas unitarias e integradas con claims reales de firmante para creación, guardado y envío; las tres deben devolver 403.
  8. Verificar que cada rechazo ocurre sin crear registros en DynamoDB, objetos o URLs en S3, auditorías de creación ni llamadas SES.
  9. Repetir los intentos desde Pendientes, Próximos a vencer, Completados y el resumen de acuerdos.
  10. Adjuntar capturas de la ausencia de acciones y trazas censuradas de los tres 403.
  11. Eliminar, con autorización, el borrador de QA creado por esta comprobación y confirmar que no quedan artefactos.
  12. Marcar ROL-04B como OK solo cuando interfaz y backend superen todos los puntos anteriores.

Artefacto creado

La prueba creó en producción el borrador QA ROL-04B rechazo firmante 2026-08-28, sin destinatarios ni documentos. Se mantiene identificado para su eliminación controlada; no se ha eliminado automáticamente porque esa acción modifica datos persistentes.

ROL-05 OK

Evidencia ROL-05: cambio de rol propio y elevación de privilegios

Intentar cambiar el rol propio o elevar privilegios.

Resultado esperado: Interfaz y backend rechazan la operación.

2 archivos fuente 1 evidencia visual

Evidencias visuales

01ROL-05-ELEVACION-PRIVILEGIOS-2026-08-28.svgOriginal

Informe de evidencia

Evidencia ROL-05: cambio de rol propio y elevación de privilegios

Fecha de comprobación: 28/08/2026 Interfaz: producción (https://signmethod.com/) Backend probado: artefacto compilado dist-lambda/index.js

Objetivo

Comprobar que la interfaz no ofrece acciones de administración a perfiles no autorizados y que PATCH /users/{userId}/role devuelve 403 antes de efectuar escrituras cuando se intenta cambiar el rol propio o elevar privilegios.

Interfaz de producción

Las capturas compartidas confirman:

  • emisor y firmante no muestran Administración, Usuarios, Alta ni controles para cambiar roles.
  • En una sesión admin, las acciones sobre el owner y otros perfiles administrativos aparecen protegidas o deshabilitadas.
  • En una sesión owner, la acción para modificar el propio usuario aparece deshabilitada.

Prueba aislada del backend

Se ejecutó el handler real del artefacto Lambda compilado contra endpoints AWS simulados localmente. Se utilizaron claims y usuarios ficticios bajo example.test; no se utilizaron tokens, cookies, contraseñas, cuentas ni servicios AWS reales.

Los simuladores registraron cualquier intento de escritura mediante DynamoDB UpdateItem/PutItem/DeleteItem o llamadas a Cognito. El resultado fue cero escrituras en todos los casos.

CasoRespuestaEscriturasResultado
Emisor cambia su propio rol a admin4030OK
Firmante cambia su propio rol a admin4030OK
Admin cambia su propio rol a owner4030OK
Owner cambia su propio rol a admin4030OK
Emisor eleva otro usuario a admin4030OK
Firmante eleva otro usuario a admin4030OK
Admin modifica un owner4030OK
Admin modifica otro admin4030OK
Owner intenta asignar owner4030OK
Owner intenta asignar superadmin4030OK

Resultado total: 10/10 casos superados; 0 escrituras; 0 fallos.

Imagen: Resumen visual de ROL-05

Controles confirmados

  • El cambio del rol propio devuelve 403 para owner, admin, emisor y firmante.
  • emisor y firmante no pueden cambiar roles de otros usuarios.
  • Un admin no puede modificar perfiles owner o admin.
  • Un owner no puede asignar owner ni superadmin.
  • Los rechazos ocurren antes de escribir en Cognito o DynamoDB.

Observación

Algunos mensajes internos del backend permanecen en inglés. No afecta al control de autorización comprobado, pero conviene mapearlos a mensajes funcionales en español antes de mostrarlos al usuario.

Conclusión

OK. La interfaz y el backend rechazan los cambios de rol propio y las elevaciones de privilegios contempladas por ROL-05. La prueba del backend es aislada y reproducible sobre el artefacto Lambda compilado; evita el riesgo de alterar cuentas reales en producción.

SEG

Seguridad

5 bloques de evidencia
SEG-01 KO

SEG-01 / SEG-03 / SEG-07 - Revision de seguridad

Realizar petición desde un origen no autorizado.

Resultado esperado: CORS rechaza el origen.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

SEG-01 / SEG-03 / SEG-07 - Revision de seguridad

Resultado

Revision realizada el 02/09/2026 sobre https://signmethod.com, una pestana Chrome en https://example.com, el codigo desplegable y la configuracion de infraestructura del repositorio. No se ejecutaron escaneos agresivos ni pruebas destructivas en produccion.

SEG-01 - CORS desde origen no autorizado

Resultado esperado: CORS rechaza el origen.

Estado: NO OK

Evidencia:

  • Comprobacion desde navegador con origen no autorizado https://example.com:
  • GET https://cb6456xer6.execute-api.eu-west-1.amazonaws.com/prod/health
  • Resultado observable: respuesta legible por CORS, type: cors, HTTP 200.
  • Cuerpo inicial: {"ok":true,"service":"signmethod-admin-api","versions":{"backendLambda":"2.0.7"}....
  • Desde el mismo origen, GET /companies con Authorization: Bearer fake-expired-token queda bloqueado para el navegador como Failed to fetch.
  • El bucket de documentos permite CORS desde cualquier origen:
  • backend/infra/lib/signmethod-backend-stack.mjs
  • allowedOrigins: ['*']
  • allowedHeaders: ['*']
  • metodos permitidos: PUT, GET y HEAD.
  • API Gateway tambien esta configurado con CORS abierto:
  • defaultCorsPreflightOptions.allowOrigins = apigateway.Cors.ALL_ORIGINS
  • defaultCorsPreflightOptions.allowMethods = apigateway.Cors.ALL_METHODS
  • headers permitidos: Content-Type, Authorization.
  • La respuesta generica de Lambda anade siempre:
  • access-control-allow-origin: *.

Conclusion:

  • La configuracion publicada no cumple el criterio de rechazo de origen no autorizado: al menos /health es legible desde https://example.com, y el codigo mantiene CORS abierto en API Gateway, Lambda y S3.
  • Se registra incidencia INC-036.

Para convertirlo en OK:

  • Definir una allowlist cerrada de origenes autorizados, por ejemplo https://signmethod.com y los dominios aprobados.
  • Eliminar '*' de CORS en API Gateway, Lambda y bucket S3.
  • No reflejar origenes arbitrarios desde la peticion.
  • Mantener Authorization solo para rutas que lo necesiten.
  • Restringir CORS de S3 a los origenes autorizados y metodos estrictamente necesarios.
  • Probar con origen autorizado y confirmar 2xx/preflight valido.
  • Probar con origen no autorizado, por ejemplo https://evil.example, y confirmar ausencia de Access-Control-Allow-Origin o respuesta rechazada.
  • Guardar capturas/cabeceras de ambos casos y repetir la prueba tras desplegar.

SEG-03 - JWT caducado o manipulado

Resultado esperado: el backend rechaza la peticion.

Estado: PARCIAL / no OK todavia

Evidencia:

  • Evidencia AWS confirmada por Joel:
  • API REST real: signmethod-prod-admin-api.
  • API id: cb6456xer6.
  • Stage: prod.
  • Region: eu-west-1.
  • Las rutas protegidas usan Cognito User Pools; por ejemplo, /users/{userId} tiene authorizationType: COGNITO_USER_POOLS.
  • La validacion de JWT se realiza en API Gateway antes de invocar la Lambda.
  • No se ha creado ningun User Pool, app client, usuario QA ni modificado produccion para esta comprobacion.
  • No se ha guardado, expuesto ni enviado ningun JWT.
  • Comprobacion desde navegador en https://signmethod.com contra ruta privada:
  • GET /prod/companies sin Authorization: resultado observable Failed to fetch.
  • GET /prod/companies con JWT falso con exp caducado y firma invalida: resultado observable Failed to fetch.
  • La comprobacion no uso ni extrajo tokens reales de la sesion del navegador.
  • Las rutas privadas de empresas, usuarios, plantillas, acuerdos y firmas usan authorizer Cognito en infraestructura:
  • authOptions = { authorizer, authorizationType: apigateway.AuthorizationType.COGNITO }.
  • Se aplica a rutas como /companies, /users, /templates, /signature-requests, /signatures y operaciones de envio/cancelacion/reenvio.
  • Existen rutas publicas sin JWT por diseno:
  • /health
  • /register
  • /register/reset-pending
  • /demo-requests
  • /recaptcha/verify
  • /public-agreements/{token}
  • /public-agreements/{token}/documents/{documentId}/signed-upload
  • /public-agreements/{token}/documents/{documentId}/complete
  • /company-invitations/{token} y acciones asociadas.
  • No existe evidencia de una peticion con JWT QA real y caducado.
  • No se puede certificar todavia el codigo exacto 401/403; lo esperado con Cognito ante expiracion es 401 Unauthorized, pero no se ha ejecutado esa prueba concreta.
  • Tampoco hay trazabilidad detallada por peticion en API Gateway porque el stage prod no tiene access logs configurados.
  • La prueba de navegador usa un JWT falso/caducado que permite validar rechazo observable, pero no distinguir si el rechazo se produce por caducidad, firma invalida o authorizer/CORS.

Conclusion:

  • La proteccion Cognito esta configurada en las rutas revisadas y se aplica antes de invocar la Lambda.
  • El navegador no obtiene datos al omitir o falsificar el JWT.
  • La evidencia funcional de rechazo por JWT caducado queda pendiente hasta probar un JWT QA real caducado y registrar el codigo exacto.
  • Las rutas publicas deben validarse con sus tokens propios y no con JWT; esto queda fuera del criterio exacto de JWT, pero debe revisarse para no mezclar ambos modelos de autenticacion.
  • Se registra incidencia INC-037 como falta de evidencia de prueba negativa.

Para convertirlo en OK:

  • Generar en un entorno controlado un JWT valido de prueba y esperar a su caducidad, o usar un token QA ya caducado obtenido sin exponerlo en documentos.
  • Repetir una llamada privada, por ejemplo GET /companies o GET /signature-requests, con:
  • JWT caducado.
  • JWT con firma manipulada.
  • JWT de otro pool/client si aplica.
  • Peticion sin header Authorization.
  • Confirmar respuestas 401/403 sin efectos en backend.
  • Confirmar que no se devuelven datos parciales ni mensajes con detalles sensibles.
  • Confirmar en CloudWatch que el rechazo no registra el token completo.
  • Documentar solo codigos HTTP, hora y token redaccionado/truncado.
  • Repetir tambien la comprobacion de rutas publicas con token propio invalido/caducado, pero separandolo de JWT para no falsear el criterio.

SEG-07 - Secretos y permisos IAM

Resultado esperado: no hay secretos en frontend y se aplica privilegio minimo.

Estado: KO

Evidencia:

  • Comprobacion desde navegador sobre el bundle publico de https://signmethod.com:
  • Script revisado: /assets/index-Cbl1jt2H.js.
  • Tamano aproximado: 1.472.596 bytes.
  • Patrones sensibles encontrados:
  • AWS access key: 0.
  • BEGIN PRIVATE KEY: 0.
  • X-Amz-Signature=: 0.
  • client_secret: 0.
  • AWS_SECRET_ACCESS_KEY / SECRET_ACCESS_KEY: 0.
  • Las coincidencias de password corresponden a logica de formularios/politica de contrasena, por ejemplo passwordPolicyMinLength y passwordPolicyCharacters; no son secretos embebidos.
  • En frontend se observan variables publicas VITE_* para region, API base URL, reCAPTCHA site key, User Pool ID y User Pool Client ID. Estos valores son configuracion publica y no secretos por si mismos.
  • La clave secreta de reCAPTCHA se obtiene desde SSM Parameter Store con WithDecryption: true, lo cual es adecuado para un secreto backend.
  • El rol de la Lambda recibe permisos amplios:
  • grantReadWriteData sobre tablas de empresas, usuarios, acuerdos, firmas, tokens, plantillas, carpetas y auditoria.
  • documentsBucket.grantReadWrite(apiHandler).
  • permisos Cognito administrativos: AdminCreateUser, AdminSetUserPassword, AdminUpdateUserAttributes, AdminDisableUser, AdminEnableUser, AdminGetUser, AdminDeleteUser.
  • ses:SendEmail con resources: ['*'].
  • No se aporta evidencia AWS IAM final desplegada ni analisis de Access Analyzer/CloudTrail que demuestre privilegio minimo efectivo.

Auditoria AWS confirmada por Joel en modo solo lectura, sin mostrar ni guardar secretos:

  • Lambda:
  • signmethod-prod-admin-api usa un rol exclusivo.
  • La confianza del rol esta limitada a lambda.amazonaws.com.
  • No tiene VPC ni DLQ configuradas.
  • Variables de entorno:
  • Solo hay nombres de tablas, bucket, region/entorno, User Pool y referencias de configuracion.
  • No se detectan secretos literales.
  • Codigo Lambda y bundle frontend:
  • Sin access keys AWS, claves privadas, JWTs, client secrets ni URLs presigned completas detectables por patrones.
  • El frontend solo declara VITE_API_BASE_URL, region AWS, User Pool/Client ID y reCAPTCHA site key como configuracion publica.
  • Cognito:
  • Autorizador y permisos limitados al User Pool de produccion concreto.
  • Las siete acciones admin indicadas aparecen en el codigo.
  • DynamoDB:
  • No hay dynamodb:*.
  • Las tablas permitidas son ARNs explicitos signmethod-prod-*.
  • S3:
  • Acceso limitado al bucket de documentos real.
  • No hay acceso concedido por este rol a otros buckets.
  • Bucket no publico, bloqueo publico completo, SSE-S3 AES256, versionado activo, propietario forzado y denegacion de HTTP sin TLS.
  • SSM:
  • Permisos limitados a dos ARNs concretos.
  • No hay ssm:GetParameter sobre *.
  • No hay permisos a Secrets Manager.
  • Uso real reportado por IAM:
  • Hay uso reciente de Cognito, DynamoDB, S3 y SES.
  • Politica IAM:
  • Access Analyzer validate-policy no devolvio errores ni avisos.

Brechas que impiden el OK:

  • SES:
  • ses:SendEmail tiene Resource: "*".
  • Aunque EMAIL_FROM coincide con no-reply@signmethod.com y el dominio esta verificado, IAM no fuerza esa identidad.
  • SES esta en sandbox.
  • No hay configuration sets ni event destinations.
  • S3:
  • Aunque el rol esta limitado al bucket correcto, permite GetObject*, List*, DeleteObject* y escritura sobre bucket/*.
  • No hay restriccion por prefijo/tenant.
  • DynamoDB:
  • No hay condicion por tenant, como dynamodb:LeadingKeys o controles equivalentes por atributos.
  • Incluye Scan y DeleteItem.
  • No es dynamodb:*, pero sigue siendo mas amplio que el minimo necesario.
  • SSM:
  • /signmethod/prod/recaptcha-secret, referenciado por la Lambda, no existe.
  • Solo existe demo-request-recipient y es String, no SecureString.
  • Por tanto no se acredita que el secreto reCAPTCHA este almacenado y cifrado en SSM.
  • IAM:
  • El rol no tiene permissions boundary.
  • La politica administrada AWSLambdaBasicExecutionRole usa Resource: "*" para logs.
  • Access Analyzer:
  • No hay analyzer configurado en eu-west-1.
  • validate-policy no sustituye la deteccion de acceso externo.
  • CloudTrail:
  • No hay trail configurado en la region.
  • El historial no permite demostrar que acciones concretas uso la Lambda.
  • El informe IAM solo acredita uso a nivel de servicio o acciones parciales.
  • Cognito:
  • El codigo referencia siete operaciones admin.
  • El uso reciente con fecha verificable solo aparece para AdminDeleteUser, AdminGetUser y AdminUpdateUserAttributes.
  • Las demas acciones requieren justificacion funcional o reduccion.

Conclusion:

  • No hay evidencia de secretos expuestos en Lambda o frontend, y varios alcances son correctos.
  • El punto no puede cerrarse como OK hasta corregir o justificar SES Resource:*, el alcance por prefijo/tenant en S3, las condiciones tenant de DynamoDB, la referencia SSM inexistente, y la falta de Access Analyzer/CloudTrail.
  • Se registra incidencia INC-038.

Para convertirlo en OK:

  • Revisar el bundle de produccion y confirmar que no contiene secretos, tokens privados, claves API secretas, contrasenas ni URLs firmadas.
  • Mantener en frontend solo configuracion publica VITE_*.
  • Crear /signmethod/prod/recaptcha-secret como SecureString cifrado o actualizar la Lambda para apuntar al secreto real existente.
  • Guardar secretos backend en SSM/Secrets Manager con cifrado y acceso limitado.
  • Sustituir ses:SendEmail sobre * por recursos/identidades autorizadas concretas.
  • Sacar SES de sandbox si el flujo de produccion lo requiere y configurar configuration set/event destination.
  • Reducir permisos Cognito administrativos a acciones y recursos estrictamente necesarios.
  • Separar funciones o roles si una misma Lambda acumula permisos de dominios distintos.
  • Limitar S3 a bucket, prefijos por tenant/documento y acciones concretas.
  • Limitar DynamoDB a tablas y acciones necesarias por flujo; aplicar condiciones por tenant si son viables.
  • Justificar o retirar Scan, DeleteItem, DeleteObject* y acciones Cognito admin no usadas recientemente.
  • Configurar un analyzer en IAM Access Analyzer para eu-west-1 y guardar hallazgos/resoluciones.
  • Configurar CloudTrail en la region o trail organizativo que cubra la actividad relevante.
  • Valorar permissions boundary para el rol de Lambda.
  • Repetir prueba de funcionalidad tras recortar permisos para confirmar que login, envio, firma, plantillas y usuarios siguen funcionando.
SEG-02 KO

SEG-02 - CSP y cabeceras de seguridad

Revisar CSP y cabeceras de seguridad.

Resultado esperado: Son correctas y no rompen login, reCAPTCHA o PDF.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

SEG-02 - CSP y cabeceras de seguridad

Resultado

KO

Prueba realizada el 01/09/2026 en produccion (https://signmethod.com) usando Chrome compartido.

Objetivo

Revisar CSP y cabeceras de seguridad. El resultado esperado es que sean correctas y no rompan login, reCAPTCHA o PDF.

Evidencia observada

Se recargo https://signmethod.com/ en Chrome y se inspecciono la respuesta principal HTML mediante la captura de red de Chrome DevTools Protocol.

Respuesta principal:

  • URL: https://signmethod.com/
  • Estado HTTP: 200
  • Tipo: text/html
  • Server: AmazonS3
  • Via: CloudFront

Cabeceras revisadas no presentes en la respuesta principal:

  • Content-Security-Policy
  • Strict-Transport-Security
  • X-Content-Type-Options
  • X-Frame-Options
  • Referrer-Policy
  • Permissions-Policy
  • Cross-Origin-Opener-Policy
  • Cross-Origin-Resource-Policy

Tambien se observaron errores de consola no bloqueantes relacionados con Quill:

  • quill Cannot register "clean" specified in "formats" config. Are you sure it was registered?

Conclusion

SEG-02 queda KO porque no se observan cabeceras de seguridad basicas ni CSP en la respuesta principal de produccion. La aplicacion sigue cargando el panel autenticado, por lo que el fallo no bloquea la navegacion, pero incumple el criterio de seguridad esperado.

SEG-04 OK

SEG-04 - HTML/JS inocuo en campos QA

Introducir HTML/JS inocuo en campos QA.

Resultado esperado: Se muestra como texto o se sanitiza; nunca se ejecuta.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

SEG-04 - HTML/JS inocuo en campos QA

Fecha: 01/09/2026 Entorno: Produccion (https://signmethod.com/) Herramienta: Playwright sobre Chrome abierto Resultado: OK

Objetivo

Comprobar que la introduccion de HTML/JS inocuo en campos QA se muestra como texto o se sanitiza, sin ejecucion en navegador.

Datos de prueba

Se uso un borrador QA existente para evitar enviar correos o crear un acuerdo definitivo. Los payloads fueron marcadores inocuos:

  • Titulo: QA SEG-04 <b>html</b> <img src=x onerror="document.body.dataset.seg04xss='executed'"> 2026-09-01
  • Descripcion: <script>document.body.dataset.seg04script='executed'</script> descripcion QA SEG-04
  • Asunto: SEG-04 asunto <img src=x onerror="document.body.dataset.seg04subject='executed'">
  • Mensaje: <b>SEG-04 mensaje</b> <img src=x onerror="document.body.dataset.seg04msg='executed'"><script>document.body.dataset.seg04msgscript='executed'</script>

Ejecucion

  1. Se abrio el dashboard de produccion en la sesion existente de Chrome.
  2. Se reutilizo el borrador QA QA FIR-19 contrasena acuerdo 2026-09-01.
  3. Se introdujeron los payloads en titulo y descripcion.
  4. Se guardo el borrador y se comprobo el listado de borradores.
  5. Se reabrio el borrador y se comprobo que la descripcion seguia como valor de campo, sin ejecucion.
  6. Se introdujeron payloads equivalentes en asunto y mensaje del editor enriquecido.
  7. Se comprobo que el editor Quill conserva las etiquetas como texto escapado.
  8. Se verifico en el DOM que no existian los marcadores de ejecucion data-seg04xss, data-seg04script, data-seg04subject, data-seg04msg ni data-seg04msgscript.
  9. Se limpio el payload del borrador, restaurando titulo, descripcion, asunto y mensaje QA neutro.

Resultado observado

  • El titulo se renderizo en el listado de borradores como texto literal: el HTML quedo escapado como &lt;b&gt; y &lt;img...&gt;.
  • La descripcion con <script> permanecio como valor textual del campo y no ejecuto JavaScript.
  • El editor Quill guardo el mensaje como contenido textual escapado dentro de <p>, no como nodos HTML ejecutables.
  • Ningun marcador data-seg04* aparecio en document.body.dataset.
  • Tras la limpieza final, el listado ya no mostraba el payload SEG-04.

Comprobacion de implementacion

La interfaz usa renderizado React normal para campos simples como titulo y descripcion, por lo que las etiquetas introducidas como texto quedan escapadas. Para el mensaje enriquecido, el frontend aplica sanitizeRichTextHtml antes de pintar previsualizaciones con dangerouslySetInnerHTML; la funcion elimina etiquetas bloqueadas, atributos on* y URLs javascript:. El backend aplica una sanitizacion equivalente en sanitizeRichHtml para el HTML enriquecido que se guarda/envia.

Conclusion

SEG-04 cumple el resultado esperado: los payloads HTML/JS inocuos no se ejecutan y se muestran como texto escapado o sanitizado.

SEG-05 KO

SEG-05 - Nombres de archivo con secuencias de ruta en acuerdos

Probar nombres de archivo con secuencias de ruta.

Resultado esperado: Se normalizan o rechazan.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

SEG-05 - Nombres de archivo con secuencias de ruta en acuerdos

Fecha: 01/09/2026 Entorno: Produccion (https://signmethod.com/) Herramienta: Playwright sobre Chrome abierto Resultado: KO

Objetivo

Comprobar que el flujo de acuerdos normaliza o rechaza nombres de archivo con secuencias de ruta.

Datos de prueba

Se reutilizaron PDFs QA pequenos de docs/evidencias/PLA-08-archivos-prueba/:

  • ..%2F..%2Fsecreto.pdf
  • ..%5C..%5Csecreto.pdf
  • ....secreto.pdf
  • contrato_'onerror=alert(1)'.pdf

Ejecucion

  1. Se abrio el dashboard de produccion en la sesion existente de Chrome.
  2. Se creo el borrador QA QA SEG-05 nombres ruta 2026-09-01.
  3. En el paso Documentos, se activo Subir PDF nuevo.
  4. Se subieron los cuatro PDFs anteriores mediante el selector multiple.
  5. Se verifico el listado de tarjetas de documento.
  6. Se guardo el borrador con Guardar y salir.
  7. Se reabrio el borrador y se volvio al paso Documentos.

Resultado observado

Los cuatro documentos fueron aceptados por la aplicacion y quedaron visibles como tarjetas:

  • ..%2F..%2Fsecreto.pdf
  • ..%5C..%5Csecreto.pdf
  • ....secreto.pdf
  • contrato_'onerror=alert(1)'.pdf

Tras guardar y reabrir el borrador, los cuatro nombres persistieron literalmente. No se mostro ningun mensaje de rechazo, normalizacion o advertencia. No se observo ejecucion de codigo ni alteracion visible de rutas en la interfaz.

Revision de implementacion

En el frontend, addReceiveDocuments valida unicamente que el fichero sea PDF por tipo o extension y que no supere el tamano maximo. Despues createReceiveDocumentFromFile conserva file.name como document.name.

En el backend, normalizeSignatureDocuments y normalizeDraftSignatureDocuments tambien validan extension .pdf, tipo y tamano, pero no normalizan ni rechazan secuencias de traversal codificadas, puntos consecutivos ni nombres con apariencia de manejador. Las claves internas de documento se construyen con documentId/UUID, por lo que el nombre no forma parte de la ruta S3 principal.

Conclusion

SEG-05 queda en KO: el sistema no cumple el resultado esperado de normalizar o rechazar nombres con secuencias de ruta en acuerdos. El riesgo observado es de validacion insuficiente y defensa en profundidad; no se ha demostrado traversal efectivo en almacenamiento.

SEG-08 KO

SEG-08 - Manipulacion de IDs en lectura y escritura

Manipular IDs en operaciones de lectura y escritura.

Resultado esperado: La autorización se valida siempre en backend.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

SEG-08 - Manipulacion de IDs en lectura y escritura

Fecha: 01/09/2026 Entorno: Produccion (https://signmethod.com/) Herramienta: Playwright sobre Chrome abierto y revision dirigida de backend Resultado: KO

Objetivo

Comprobar que la autorizacion se valida siempre en backend al manipular IDs en operaciones de lectura y escritura.

Contexto comprobado con Playwright

Se uso la pestana abierta de SignMethod en Chrome. La sesion visible estaba en:

  • Administrador · Prueba Produccion
  • URL visible: https://signmethod.com/#dashboard

No se realizaron llamadas destructivas reales para bloquear, desbloquear, cancelar, eliminar o firmar, porque el objetivo era verificar la proteccion ante manipulacion de IDs sin afectar usuarios o acuerdos reales.

Hallazgo principal

La ruta de bloqueo/desbloqueo de usuarios esta expuesta por ID:

  • POST /users/{userId}/block
  • POST /users/{userId}/unblock

El router llama directamente a:

  • setUserBlocked(requiredPathParam(event, 'userId'), true, actorFrom(event))
  • setUserBlocked(requiredPathParam(event, 'userId'), false, actorFrom(event))

La funcion setUserBlocked:

  1. Carga el usuario con getUser(userId).
  2. Ejecuta AdminDisableUserCommand o AdminEnableUserCommand sobre el email del usuario.
  3. Actualiza status en DynamoDB.
  4. Audita el cambio.

No recibe el event completo y, por tanto, no valida:

  • pertenencia del actor a la empresa del usuario objetivo;
  • rol autorizado del actor (owner, admin o superadmin);
  • jerarquia de roles;
  • proteccion frente a bloqueo/desbloqueo de usuarios de otra empresa;
  • proteccion frente a autobloqueo.

Hallazgos relacionados

En acuerdos, varias rutas si validan empresa mediante assertActorCanAccessCompany, por ejemplo:

  • lectura de plantillas/documentos de plantilla;
  • guardado y borrado de borradores;
  • envio/cancelacion de acuerdos;
  • lectura autenticada de acuerdos.

Sin embargo, el flujo publico de firma mantiene un problema ya documentado en INC-030: el token identifica al destinatario, pero las operaciones posteriores aceptan documentId de cualquier documento del acuerdo sin comprobar asignacion por destinatario o campos. Esto afecta tanto a lectura de documentos en buildPublicAgreementDocuments como a subida/finalizacion de documento firmado por documentId.

Conclusion

SEG-08 queda en KO. La autorizacion no se valida siempre en backend ante IDs manipulados: el bloqueo/desbloqueo de usuarios por userId carece de comprobaciones de empresa y rol, y el flujo publico de firma no filtra correctamente documentos por destinatario/asignacion.

TEC

Revisión técnica

6 bloques de evidencia
TEC-01 KO

TEC-01 / TEC-02 / TEC-03 - Revision tecnica de produccion

Revisar las peticiones de los flujos reales.

Resultado esperado: No hay 5xx , preproducción ni reintentos anómalos.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

TEC-01 / TEC-02 / TEC-03 - Revision tecnica de produccion

Resultado

KO

La revision se realizo el 01/09/2026 sobre el estado documentado de produccion (https://signmethod.com), el codigo desplegable del repositorio y las evidencias AWS confirmadas por Joel Lopez.

En este entorno no hay AWS CLI disponible, por lo que las comprobaciones de CloudWatch, API Gateway, Lambda, DynamoDB y S3 se documentan a partir de la revision manual autorizada en AWS.

TEC-01 - Peticiones de flujos reales

Resultado esperado: no hay 5xx, preproduccion ni reintentos anomalos.

Estado: KO

Evidencia AWS confirmada para produccion, desde el 01/09/2026 hasta el momento de la revision:

  • API REST: signmethod-prod-admin-api
  • Stage: prod
  • Lambda: signmethod-prod-admin-api
  • Recursos y variables apuntan a tablas/bucket signmethod-prod-*.
  • CloudWatch Logs muestra actividad real hoy: 1.886 eventos y 616 invocaciones Lambda.
  • Lambda: Errors=0, Throttles=0.
  • API Gateway: Count=1.194, 5XXError=0, 4XXError=14.
  • Latencia media maxima observada: aproximadamente 117 ms.

Limitacion:

  • No se puede certificar ausencia de reintentos o duplicados de crear/enviar/firmar/reenviar porque los logs no registran esos flujos con detalle correlacionable suficiente.
  • Falta configuracion de access logs en API Gateway. Sin ese export por peticion no hay una evidencia fiable para filtrar y correlacionar cada prueba.

Evidencia adicional desde Chrome:

  • Se recargo el dashboard autenticado y se abrio el listado de acuerdos.
  • Se observaron llamadas reales a produccion (/prod/health, /prod/companies, /prod/users, /prod/signature-requests y /prod/signature-requests/drafts) con respuestas 200/204.
  • No se observaron endpoints de preproduccion en el trafico capturado.
  • Se observo un GET /prod/signatures con fallo de carga del navegador (net::ERR_FAILED), sin codigo HTTP de respuesta capturable.

Conclusion especifica:

  • No hay evidencia de 5xx en AWS ni en el trafico capturado.
  • Sin embargo, el control no cumple completo porque falta access logging por peticion, no hay correlacion de reintentos/duplicados y Chrome muestra un fallo de carga en /prod/signatures.
  • Se vincula a INC-032.

TEC-02 - Objetos, metadatos y checksums

Resultado esperado: original y firmado estan en tenant y ubicacion correctos.

Estado: PARCIAL / KO para evidencia de firma completada

El codigo revisado guarda documentos en S3, genera objetos firmados bajo signed/, exige x-amz-checksum-sha256 al subir el PDF firmado y valida el checksum mediante HeadObject antes de persistir el artefacto firmado.

Evidencia AWS confirmada:

  • La tabla signmethod-prod-signature-requests existe y tiene PITR activado.
  • Los registros incluyen requestId, companyId, status, documentos y destinatarios.
  • Los documentos contienen documentId, nombre, key/originalKey y tamano.
  • Se verifico un objeto original en S3: PDF, tamano y ETag presentes.
  • El objeto original revisado incluye metadatos requestId, tenantId y documentId.

Hallazgos y limitaciones:

  • Falta checksum SHA-256 explicito en el objeto original; ETag no lo sustituye.
  • No hay artefactos firmados ni destinatarios completados disponibles en los registros revisados.
  • No se puede aportar la evidencia requerida de signedArtifacts, objeto firmado, SHA-256, completedAt y metadatos de firma.
  • La convencion documents/{companyId}/{documentId}/... no se cumple de forma uniforme en los 10 documentos revisados.
  • Hay que revisar o migrar las keys que no siguen el aislamiento esperado por tenant.

Este control queda ademas afectado por FIR-12/FIR-13: la interfaz no mostro una accion visible para descargar el PDF firmado, por lo que no se pudo contrastar el artefacto final desde la aplicacion.

TEC-03 - URL firmada con metodo/objeto distinto y caducidad

Resultado esperado: la URL firmada solo admite la operacion, objeto y periodo autorizados.

Estado: KO

El codigo revisado genera URLs firmadas de S3 con expiracion de 15 minutos para descarga y subida de documentos.

Evidencia AWS confirmada sobre una URL firmada de produccion generada contra un objeto real, sin divulgar la URL:

  • GET autorizado: 200.
  • PUT sobre URL de descarga: 403.
  • URL con key alterada: 403.
  • URL tras caducar: 403.

La proteccion criptografica de la URL firmada funciona para el caso S3 probado.

Limitacion:

  • Falta repetir la misma bateria con una URL emitida por el endpoint real de la aplicacion.
  • Cuando exista una firma completada, falta repetir la prueba sobre un artefacto firmado.
  • Desde Chrome se intento abrir el detalle de un acuerdo para capturar una URL emitida por la aplicacion, pero la inspeccion de red de la pestana quedo bloqueada por el control del navegador y no se pudo extraer una URL segura sin exponer tokens.

Conclusion

TEC-01 queda KO: no hay errores Lambda ni 5xx observados, pero faltan access logs y correlacion de reintentos/duplicados; ademas, Chrome observo un fallo net::ERR_FAILED en /prod/signatures.

TEC-02 queda KO/PARCIAL: hay evidencia de objetos originales y metadatos basicos, pero falta SHA-256 explicito, faltan artefactos firmados y se detecta inconsistencia en la convencion de keys por tenant.

TEC-03 queda KO: la URL firmada S3 probada respeta metodo, objeto y caducidad, pero el punto exige validar el flujo autorizado completo y falta repetirlo con URL emitida por la aplicacion y con artefacto firmado.

Evidencia manual requerida

Para completar estos puntos, faltan estas evidencias:

  • Activar o aportar access logs de API Gateway para correlacionar peticiones reales por flujo.
  • Trazabilidad suficiente para descartar reintentos/duplicados anomalos en crear/enviar/firmar/reenviar.
  • Un caso de firma completada con signedArtifacts, objeto firmado S3, SHA-256, tamano, completedAt y metadatos.
  • Normalizacion o justificacion de las keys S3 que no siguen documents/{companyId}/{documentId}/....
  • Prueba de URL firmada emitida por el endpoint real de la aplicacion.
  • Prueba de URL firmada sobre un artefacto firmado cuando exista.

Acciones futuras para completar los puntos

TEC-01

Acciones necesarias para poder repetir la prueba y cerrarla como OK:

  • Activar access logs en API Gateway para signmethod-prod-admin-api, stage prod.
  • Configurar el formato de log con campos minimos: fecha, request id, metodo, ruta, status, integration status, latency, user/tenant no sensible y correlation id.
  • Incorporar o confirmar un correlation id comun entre navegador, API Gateway, Lambda y auditoria funcional.
  • Registrar eventos funcionales de crear, enviar, firmar y reenviar acuerdos sin tokens, contrasenas, documentos ni URLs firmadas completas.
  • Repetir un flujo real QA controlado: crear acuerdo, enviar, abrir como firmante, firmar, reabrir detalle y reenviar un pendiente si aplica.
  • Exportar o capturar CloudWatch Logs Insights del periodo exacto de la prueba.
  • Filtrar 5xx y confirmar resultado vacio.
  • Filtrar referencias no productivas como preprod, staging, dev, localhost, 127.0.0.1 y dominios antiguos.
  • Correlacionar por request id/correlation id que cada accion QA esperada genera una sola operacion efectiva.
  • Confirmar que no hay reintentos anormales, duplicados de envio, duplicados de firma ni llamadas repetidas fuera del patron previsto.
  • Revisar especificamente el fallo observado en Chrome GET /prod/signatures con net::ERR_FAILED y corregirlo o justificarlo si corresponde a bloqueo local/extension.
  • Guardar evidencia censurada con metricas API Gateway/Lambda y extractos de logs sin datos sensibles.

Condicion de cierre:

  • 5XXError=0.
  • Errors=0 y Throttles=0 en Lambda.
  • Cero llamadas a preproduccion o dominios no autorizados.
  • Cero duplicados o reintentos anomalos demostrados por logs correlacionables.
TEC-02

Acciones necesarias para poder repetir la prueba y cerrarla como OK:

  • Crear o reutilizar un acuerdo QA que llegue a firma completada real.
  • Identificar el requestId, companyId, status, documentos y destinatarios en signmethod-prod-signature-requests.
  • Confirmar que cada documento tiene documentId, name, key u originalKey y tamano esperado.
  • Verificar en S3 el objeto original asociado a cada documento.
  • Confirmar que el objeto original tiene content type de PDF, tamano correcto y metadatos requestId, tenantId y documentId.
  • Definir si el original debe tener checksum SHA-256 explicito; si se exige, guardarlo como metadato o atributo persistido y no usar ETag como sustituto.
  • Completar una firma real y confirmar que el registro contiene signedArtifacts.
  • Verificar para cada signedArtifact: objectKey, sha256, size, completedAt, documentId y destinatario.
  • Consultar el objeto firmado en S3 con HeadObject y ChecksumMode=ENABLED.
  • Comparar el checksum S3 con el signedArtifacts[].sha256 persistido.
  • Confirmar que el tamano S3 coincide con signedArtifacts[].size.
  • Confirmar metadatos del firmado: requestId, tenantId, documentId y recipient.
  • Revisar las 10 keys ya detectadas como no uniformes y decidir migracion, normalizacion o excepcion documentada.
  • Normalizar la convencion de claves para que los documentos queden bajo un prefijo por tenant/documento, por ejemplo documents/{companyId}/{documentId}/....
  • Repetir la comprobacion tras normalizar, incluyendo original y firmado.

Condicion de cierre:

  • Original y firmado estan en el bucket de produccion correcto.
  • Ambos objetos pertenecen al tenant y documento esperados.
  • Existe checksum SHA-256 auditable para el firmado y, si el criterio lo exige, tambien para el original.
  • signedArtifacts existe y coincide con S3 en key, tamano, checksum, destinatario y fecha.
  • No hay keys fuera del aislamiento por tenant o quedan justificadas formalmente.
TEC-03

Acciones necesarias para poder repetir la prueba y cerrarla como OK:

  • Obtener una URL firmada emitida por el endpoint real de SignMethod, no generada manualmente desde AWS.
  • Redactar la URL antes de guardarla en evidencias: ocultar X-Amz-Signature, X-Amz-Credential, X-Amz-Security-Token, tokens y cualquier query sensible.
  • Probar la operacion autorizada dentro del periodo valido: por ejemplo GET para descarga/previsualizacion o PUT para subida, segun el flujo.
  • Probar metodo no autorizado sobre esa misma URL: por ejemplo PUT sobre una URL de descarga o GET sobre una URL de subida.
  • Probar key/objeto alterado manteniendo parametros de firma redaccionados en evidencia.
  • Esperar a que caduque la URL y repetir la operacion autorizada.
  • Registrar codigo HTTP, hora de prueba y resultado esperado/observado de cada caso.
  • Repetir la bateria sobre una URL de original.
  • Cuando exista una firma completada, repetir la bateria sobre una URL de artefacto firmado.
  • Confirmar que la aplicacion no muestra ni conserva tokens completos en pantalla, logs, capturas o mensajes de error.
  • Confirmar que los errores no revelan bucket, key interna completa, credenciales, token ni datos del acuerdo.

Condicion de cierre:

  • Operacion autorizada dentro del periodo valido responde correctamente.
  • Metodo no autorizado responde 403 o denegacion equivalente.
  • Objeto/key alterado responde 403 o denegacion equivalente.
  • URL caducada responde 403 o denegacion equivalente.
  • La prueba se ejecuta con URL emitida por SignMethod y se repite sobre artefacto firmado cuando exista.
TEC-04 KO

TEC-04 / TEC-06 / TEC-07 / TEC-08 - Revision tecnica de produccion

Intentar acceso público y listado del bucket.

Resultado esperado: Ambos están bloqueados.

2 archivos fuente 1 evidencia visual

Evidencias visuales

01TEC-04-06-07-08-signmethod-dashboard-2026-09-02.pngOriginal

Informe de evidencia

TEC-04 / TEC-06 / TEC-07 / TEC-08 - Revision tecnica de produccion

Resultado

KO / parcial

Revision realizada el 02/09/2026 sobre https://signmethod.com con Chrome conectado a la sesion real de produccion de joel.lopez@softradis.com, empresa activa pepe, rol Owner.

Capturas generadas:

  • TEC-04-06-07-08-signmethod-dashboard-2026-09-02.png
  • TEC-06-gmail-hilo-signmethod-3-mensajes-2026-09-01.png
  • TEC-06-gmail-correo-nuevo-unico-2026-09-02.png
  • TEC-06-gmail-correo-nuevo-detalle-2026-09-02.png
  • TEC-06-gmail-sin-correos-signmethod-2026-09-02.png
  • TEC-06-signmethod-envio-correcto-2026-09-02.png
  • TEC-08-listado-tras-corte-red-lectura-2026-09-02.png

TEC-04 - Acceso publico y listado del bucket

Resultado esperado: acceso publico a objeto bloqueado y listado del bucket bloqueado.

Estado: KO / bloqueado por falta de evidencia concluyente

Comprobaciones realizadas:

  • Bucket inferido de produccion segun la revision AWS previa: signmethod-prod-documents-743737184059.
  • Intento de abrir en Chrome el endpoint publico de listado:
  • https://signmethod-prod-documents-743737184059.s3.eu-west-1.amazonaws.com/
  • Resultado local: Chrome devuelve net::ERR_BLOCKED_BY_CLIENT.
  • Intento por terminal con curl.exe:
  • Resultado local: fallo TLS de Windows SEC_E_NO_CREDENTIALS; no se obtiene codigo HTTP fiable.
  • Intento por PowerShell Invoke-WebRequest:
  • Resultado local: Error inesperado de recepcion; no se obtiene codigo HTTP fiable.

Limitaciones:

  • El bloqueo observado es del entorno local/navegador, no una respuesta verificable de S3.
  • No se dispone de una key real de objeto QA para probar acceso publico a objeto sin URL firmada.
  • Un 404 sobre una key inventada no sirve como evidencia de bloqueo de acceso publico.

Evidencia manual necesaria para cerrar:

  • Abrir o consultar el endpoint publico del bucket y guardar codigo/respuesta esperada 403 AccessDenied.
  • Probar una key real de objeto QA sin query string ni URL firmada y guardar codigo/respuesta esperada 403 AccessDenied.
  • No guardar keys sensibles completas si identifican documentos reales; usar key QA o valor redaccionado.

TEC-06 - Envios, entregas, rebotes y duplicados

Resultado esperado: cada accion genera los mensajes previstos.

Estado: NO OK / pendiente de evidencia de mensajeria y correlacion

Evidencia disponible:

  • La aplicacion muestra acuerdos enviados y pendientes en Chrome de produccion.
  • FIR-04 confirma visualmente un acuerdo enviado con estado Enviado, destinatarios enviados y contadores.
  • FIR-15 confirma visualmente el reenvio de un acuerdo pendiente y el mensaje Reenvio ejecutado correctamente para joel.lopez@softradis.com.
  • En el listado revisado el 02/09/2026 se observan Todos (5), Pendientes (3), Borradores (0) y Completado (0).
  • En Gmail de joel.lopez@softradis.com, revisando solo correos de no-reply@signmethod.com, se localiza un hilo de SignMethod con 3 mensajes del 01/09/2026:
  • 11:51, asunto/hilo Prueba, acuerdo Prueba Pau, mensaje Prueba de envio de acuerdo FIR-04.
  • 13:20, asunto/hilo Prueba, acuerdo Prueba Pau 12.
  • 13:23, tercer mensaje dentro del mismo hilo de SignMethod.
  • La busqueda exacta de hoy from:no-reply@signmethod.com after:2026/9/2 before:2026/9/3 devuelve: No hay ningun mensaje que coincida con tu busqueda.
  • Con autorizacion del usuario se creo y envio desde https://signmethod.com un acuerdo QA nuevo:
  • Titulo: QA TEC-06 envio Joel 2026-09-02.
  • Destinatario: Joel Lopez <joel.lopez@softradis.com>.
  • Documento: memoria-prueba-01.pdf, 79 KB.
  • Asunto: Prueba.
  • Caducidad visible: 05/09/2026.
  • La aplicacion confirmo el envio con el mensaje Acuerdo enviado correctamente a 1 destinatario.
  • Tras el envio, los contadores de SignMethod subieron a Enviados 6 y Pendientes 4.
  • En Gmail se busco from:no-reply@signmethod.com "QA TEC-06 envio Joel 2026-09-02" after:2026/9/2 before:2026/9/3.
  • Gmail devolvio un unico resultado (1-1 de 1), no leido, de no-reply@signmethod.com, asunto Prueba, hora 09:42.
  • Al abrir el correo se comprobo remitente SignMethod, destinatario para mi, titulo de acuerdo, documento memoria-prueba-01.pdf, tamano 79 KB y boton Firmar acuerdo.
  • No se abrio el enlace de firma ni se conservaron tokens completos.
  • Evidencia AWS revisada para el 02/09/2026, alrededor de las 09:42 CEST, ventana aproximada 07:40-07:42 UTC:
  • Lambda signmethod-prod-admin-api: hubo actividad.
  • Lambda: Errors=0 y Throttles=0 en los minutos consultados.
  • API Gateway: 5XXError=0 en la misma ventana.
  • API Gateway access logs: no configurados (accessLog: null).
  • SES: no hay configuration sets en eu-west-1.
  • CloudTrail no devuelve eventos de email.amazonaws.com en la ventana revisada.

Limitaciones:

  • Antes de generar el acuerdo QA no habia correos de acuerdos nuevos de hoy, 02/09/2026, en el buzon de Joel.
  • No se puede correlacionar la peticion de envio con un 2xx, request id ni una sola accion efectiva porque API Gateway no tiene access logs.
  • No existe evidencia verificable en SES/CloudTrail de 1 envio a joel.lopez@..., entrega, Bounce=0, Complaint=0 ni ausencia tecnica de duplicados.
  • La ausencia de duplicado queda demostrada en Gmail para el correo recibido por Joel, pero no sustituye la evidencia tecnica de SES/API/Lambda.
  • Revisar Gmail o enviar nuevos correos adicionales requiere confirmacion manual inmediata porque afecta a comunicaciones reales.

Evidencia manual necesaria para cerrar:

  • Activar access logs de API Gateway para capturar status, request id, ruta y latencia de la peticion real.
  • Configurar trazabilidad de SES mediante configuration set, event destination o mecanismo equivalente.
  • Capturar eventos verificables de envio, entrega, rebote y queja para el periodo exacto.
  • Correlacionar el acuerdo QA con una unica peticion efectiva y un unico mensaje por destinatario.
  • Repetir la prueba y confirmar: 1 envio previsto, 1 entrega o recepcion verificable, Bounce=0, Complaint=0, 0 duplicados, 5XXError=0, Lambda Errors=0 y Throttles=0.

Conclusion especifica:

  • No hay indicios de fallo tecnico ni 5xx en la ventana revisada.
  • El correo llego una sola vez al buzon de Joel segun Gmail.
  • El punto no se puede aprobar porque faltan las evidencias obligatorias de mensajeria y correlacion tecnica.

TEC-07 - Logs de las pruebas sin secretos ni documentos

Resultado esperado: los logs no contienen contrasenas, tokens completos ni documentos.

Estado: KO / parcial

Evidencia disponible:

  • La consola de Chrome de la pestana https://signmethod.com/#dashboard no mostro entradas capturadas durante la revision.
  • No se detectaron secretos visibles en la consola del navegador en esta comprobacion.

Limitaciones:

  • La consola del navegador no sustituye los logs de produccion.
  • Falta revisar CloudWatch Logs de Lambda/API Gateway para el periodo exacto de las pruebas.
  • Sin access logs configurados en API Gateway no puede revisarse de forma completa el rastro por peticion.

Evidencia manual necesaria para cerrar:

  • Exportar consultas censuradas de CloudWatch Logs del periodo de las pruebas.
  • Buscar patrones de riesgo: password, passwd, token, signature, X-Amz-Signature, X-Amz-Credential, Authorization, Cookie, URL firmada completa, base64 de documentos y fragmentos PDF.
  • Confirmar que solo aparecen identificadores no sensibles o valores redaccionados/truncados.
  • Si aparece informacion sensible, registrar incidencia especifica, retirar la evidencia contaminada y corregir el logging.

TEC-08 - Operacion tras corte de red controlado

Resultado esperado: no duplica usuarios, documentos, acuerdos o firmas.

Estado: KO / parcial

Comprobacion realizada sin efectos reales:

  • Se abrio el listado de acuerdos en Chrome.
  • Estado inicial visible: Todos (5), Pendientes (3), Borradores (0), Completado (0).
  • Se corto la red de la pestana mediante control de navegador.
  • Se pulso Actualizar acuerdos con la red cortada.
  • Se restauro la red y se volvio a pulsar Actualizar acuerdos.
  • Estado final visible: Todos (5), Pendientes (3), Borradores (0), Completado (0).
  • No se observaron duplicados visibles en el listado tras la recuperacion de red.

Limitaciones:

  • La operacion probada fue de solo lectura; no cubre creacion de usuario, subida de documento, guardado/envio de acuerdo ni firma.
  • Para cerrar el punto hace falta repetir con una operacion de escritura QA controlada y comprobar backend/contadores/logs.
  • Cualquier envio de acuerdo, reenvio o firma debe confirmarse justo antes porque genera efectos reales y correos.

Evidencia manual necesaria para cerrar:

  • Elegir una operacion QA de escritura: crear borrador, guardar acuerdo, enviar acuerdo o firmar.
  • Registrar conteos antes de cortar red.
  • Cortar red durante la operacion en un punto controlado.
  • Reintentar tras recuperar red.
  • Verificar en UI y backend que no se duplican usuarios, documentos, acuerdos ni firmas.
  • Confirmar con logs correlacionados que solo existe una operacion efectiva o que la segunda se rechaza de forma idempotente.

Incidencias vinculadas

TEC-05 OK

TEC-05 - Persistencia de sesion y datos

Cerrar sesión y volver a consultar los datos.

Resultado esperado: Usuarios, plantillas, acuerdos y estados persisten.

3 archivos fuente 2 evidencias visuales

Evidencias visuales

01TEC-05-login-posterior-dashboard-2026-09-01.pngOriginal
02TEC-05-persistencia-recarga-dashboard-2026-09-01.pngOriginal

Informe de evidencia

TEC-05 - Persistencia de sesion y datos

Resultado

OK

Revision realizada el 01/09/2026 en produccion (https://signmethod.com) usando Chrome compartido.

Objetivo

Cerrar sesion y volver a consultar los datos. El resultado esperado es que usuarios, plantillas, acuerdos y estados persistan.

Evidencia observada

Antes de la recarga, el dashboard mostraba:

  • Usuario activo: joel.lopez@softradis.com
  • Empresa activa: pepe - Owner
  • Acuerdos pendientes: 3
  • Proximos a vencer: 3
  • Completados recientemente: 0
  • Usuarios de la empresa: 1
  • Enviados: 5
  • Pendientes: 3
  • Completados: 0

Tras recargar la pagina en Chrome, la sesion siguio activa y el DOM interactivo del dashboard mantuvo los controles principales:

  • Pendientes 3
  • Proximos a vencer 3
  • Completados recientemente 0
  • Usuarios y roles 1
  • Enviados 5
  • Completados 0

Cierre de sesion y reentrada

Se pulso Salir desde el dashboard. La aplicacion mostro la home publica con el formulario de acceso y el mensaje:

  • Sesion cerrada
  • Sesion cerrada correctamente.

Tras el login manual con credenciales validas, Chrome volvio al dashboard autenticado y mostro:

  • Usuario activo: joel.lopez@softradis.com
  • Empresa activa: pepe - Owner
  • Panel: Panel Owner
  • Acuerdos pendientes: 3
  • Proximos a vencer: 3
  • Completados recientemente: 0
  • Usuarios de la empresa: 1
  • Enviados: 5
  • Pendientes: 3
  • Completados: 0

Los datos principales de usuario, empresa, acuerdos y estados se mantienen tras cerrar sesion y volver a entrar.

Conclusion

TEC-05 cumple el resultado esperado y queda OK.

Evidencias

  • docs/evidencias/TEC-05-persistencia-recarga-dashboard-2026-09-01.png
  • docs/evidencias/TEC-05-login-posterior-dashboard-2026-09-01.png
TEC-06 KO

Revisar envíos, entregas, rebotes y duplicados.

Revisar envíos, entregas, rebotes y duplicados.

Resultado esperado: Cada acción genera los mensajes previstos.

5 archivos fuente 5 evidencias visuales

Evidencias visuales

01TEC-06-gmail-correo-nuevo-detalle-2026-09-02.pngOriginal
02TEC-06-gmail-correo-nuevo-unico-2026-09-02.pngOriginal
03TEC-06-gmail-hilo-signmethod-3-mensajes-2026-09-01.pngOriginal
04TEC-06-gmail-sin-correos-signmethod-2026-09-02.pngOriginal
05TEC-06-signmethod-envio-correcto-2026-09-02.pngOriginal
TEC-08 KO

Repetir una operación tras un corte de red controlado.

Repetir una operación tras un corte de red controlado.

Resultado esperado: No duplica usuarios, documentos, acuerdos o firmas.

1 archivo fuente 1 evidencia visual

Evidencias visuales

01TEC-08-listado-tras-corte-red-lectura-2026-09-02.pngOriginal
TEC-09 OK

TEC-09 - Consistencia entre identidad, usuario y empresa

Comprobar consistencia entre Cognito, usuarios y empresa.

Resultado esperado: Identidad, membresía y estado coinciden.

2 archivos fuente 1 evidencia visual

Evidencias visuales

01TEC-09-identidad-empresa-rol-2026-09-01.pngOriginal

Informe de evidencia

TEC-09 - Consistencia entre identidad, usuario y empresa

Resultado

OK

Prueba realizada el 01/09/2026 en produccion (https://signmethod.com) usando Chrome compartido.

Objetivo

Comprobar consistencia entre identidad, usuarios y empresa. El resultado esperado es que identidad, membresia y estado coincidan.

Evidencia observada

En el dashboard autenticado se observa:

  • Usuario activo: joel.lopez@softradis.com
  • Cabecera de contexto: Owner - pepe
  • Empresa activa: pepe - Owner
  • Panel mostrado: Panel Owner
  • Seccion de usuarios y roles visible.
  • Contadores visibles: Usuarios de la empresa 1, Administradores 0, Emisores 0, Firmantes 0.

La identidad de la sesion, la empresa activa y el rol mostrado son coherentes entre la cabecera, el selector de empresa y el panel operativo.

Limitacion

Esta validacion se hizo desde la interfaz de Chrome. No incluye comparacion directa con Cognito ni DynamoDB porque eso requiere acceso AWS.

Evidencia

  • docs/evidencias/TEC-09-identidad-empresa-rol-2026-09-01.png

UX

Experiencia de usuario

5 bloques de evidencia
UX-01 KO

UX-01 - Flujos criticos en navegadores acordados

Repetir home, login, panel, envío y firma en los navegadores acordados.

Resultado esperado: Los flujos críticos funcionan en todos.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

UX-01 - Flujos criticos en navegadores acordados

Fecha: 01/09/2026 Entorno: Produccion (https://signmethod.com/) Herramienta: Playwright sobre Chrome abierto y contraste con evidencias previas Resultado: KO

Objetivo

Repetir home, login, panel, envio y firma en los navegadores acordados y confirmar que los flujos criticos funcionan en todos.

Comprobacion realizada

Se uso la pestana abierta de SignMethod en Chrome. La sesion visible estaba en:

  • Administrador · Prueba Produccion
  • URL visible: https://signmethod.com/#dashboard

La interfaz permite acceder al panel y abrir el flujo Enviar acuerdo. Durante la sesion actual tambien quedo visible el borrador QA de SEG-05 en el paso Documentos, confirmando que Chrome estaba operativo para interaccion de panel y envio.

Evidencias que impiden marcar OK

UX-01 exige que los flujos criticos funcionen en todos los navegadores acordados. No se cumple por los siguientes bloqueos ya reproducidos en produccion:

  • FIR-07: desde el panel de firmante, Ver acuerdo no permite revisar y firmar correctamente; la vista muestra incoherencias de documentos y deja Revisar y firmar deshabilitado.
  • FIR-08: desde el panel de firmante, el acuerdo pendiente solo ofrece Ver acuerdo; abre una vista bloqueada y no permite iniciar la firma para probar el campo obligatorio.
  • FIR-12: tras completar la firma, no existe accion visible para descargar el documento firmado desde listado, detalle o enlace publico reutilizado.
  • AUT-02: el smoke publico contra produccion quedo en KO en chromium, firefox, edge y safari/WebKit, con fallos clasificados en navegacion, alta publica, acuerdos/firma con API simulada, semantica accesible y objetivos tactiles.

Con un fallo reproducido en Chrome ya no puede afirmarse que los flujos criticos funcionan en todos los navegadores acordados. La evidencia multi-navegador existente tampoco esta verde.

Conclusion

UX-01 queda en KO. Para aprobarlo hay que corregir los bloqueos del flujo de firma desde panel y la descarga del documento firmado, y repetir la matriz completa en Chrome, Edge, Firefox, WebKit/Safari y movil real.

UX-02 OK

UX-02 - Anchuras responsive

Probar anchuras 320, 375, 768, 1024 y escritorio.

Resultado esperado: No hay desbordamiento ni contenido inaccesible.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

UX-02 - Anchuras responsive

Fecha: 01/09/2026 Entorno: Produccion (https://signmethod.com/) Herramienta: Playwright sobre Chrome abierto Resultado: OK

Objetivo

Probar las anchuras 320, 375, 768, 1024 y escritorio, verificando que no hay desbordamiento horizontal ni contenido inaccesible.

Pantallas comprobadas

Se uso la sesion autenticada visible en Chrome:

  • Administrador · Prueba Produccion
  • URL visible: https://signmethod.com/#dashboard

La comprobacion cubrio el dashboard y el modal Enviar acuerdo, abierto en el paso Documentos con el borrador QA QA SEG-05 nombres ruta 2026-09-01.

Resultado por anchura

AnchuradocumentElement.scrollWidthbody.scrollWidthResultado
320 px320320Sin overflow horizontal global
375 px375375Sin overflow horizontal global
768 px768768Sin overflow horizontal global
1024 px10241024Sin overflow horizontal global
1366 px13661366Sin overflow horizontal global

Observaciones

  • Los fondos/decoraciones (ground-layer y capas visuales) pueden sobresalir geometricamente, pero quedan dentro de contenedores con overflow: hidden o clip; no generan scroll horizontal ni contenido funcional inaccesible.
  • A 320 px, el tablist de Enviar acuerdo tiene mas contenido que anchura visible, pero el contenedor .receive-tabs declara overflow-x: auto, por lo que las pestañas restantes son desplazables.
  • Los documentos del borrador y sus acciones permanecen accesibles mediante scroll vertical.
  • Al finalizar se restablecio el viewport del navegador.

Conclusion

UX-02 queda en OK para la comprobacion responsive solicitada en Chrome: no se detecto desbordamiento horizontal global ni perdida de controles funcionales en las anchuras probadas.

UX-03 KO

UX-03 - Orientacion vertical/horizontal en envio y firma

Probar envío y firma en vertical y horizontal.

Resultado esperado: PDF, campos, firma y botones son utilizables.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

UX-03 - Orientacion vertical/horizontal en envio y firma

Fecha: 01/09/2026 Entorno: Produccion (https://signmethod.com/) Herramienta: Playwright sobre Chrome abierto Usuario visible: Administrador · Prueba Produccion (pau.dengra@softradis.com)

Criterio

Probar envio y firma en vertical y horizontal.

Resultado esperado: PDF, campos, firma y botones son utilizables.

Comprobacion realizada

Se uso la pestana abierta de SignMethod sin recargarla. La sesion tenia abierto el modal Enviar acuerdo, en el borrador QA SEG-05 nombres ruta 2026-09-01.

Envio - vertical

Viewport aplicado: 390x844.

  • Modal Enviar acuerdo visible.
  • Paso Documentos visible con documentos PDF cargados.
  • documentElement.scrollWidth = 390 y body.scrollWidth = 390, sin desbordamiento horizontal global.
  • Botones visibles y habilitados: Atras, Guardar y salir, Continuar.
  • Los documentos quedan accesibles mediante scroll vertical dentro del modal.
Envio - horizontal

Viewport aplicado: 844x390.

  • Modal Enviar acuerdo visible.
  • Paso Documentos visible con documentos PDF cargados.
  • documentElement.scrollWidth = 844 y body.scrollWidth = 844, sin desbordamiento horizontal global.
  • Botones visibles y habilitados: Atras, Guardar y salir, Continuar.
  • Las tarjetas de documentos se distribuyen horizontalmente dentro del ancho disponible.
Paso Campos

Se abrio el paso Campos del borrador actual.

  • En vertical 390x844 y horizontal 844x390 no hubo desbordamiento horizontal global.
  • La pantalla muestra Sin campos preparados todavía.
  • No se pudo comprobar la usabilidad de campos de firma en este borrador porque no habia campos configurados.
Firma

Para no abandonar ni alterar el borrador abierto, se abrio una segunda pestana de SignMethod con la misma sesion autenticada.

Resultado observado:

  • El dashboard muestra Pendientes 1.
  • Al abrir el listado de acuerdos con filtro Pendientes (1), la tabla no muestra ningun acuerdo.
  • Tras pulsar Actualizar acuerdos, el modal queda con el mensaje Acuerdos actualizados, pero sin filas.
  • No aparece una accion Ver acuerdo, Firmar o equivalente sobre el pendiente, por lo que no se puede abrir una vista firmable desde esa superficie.

Resultado

KO.

La parte de envio se comporta correctamente en orientacion vertical y horizontal, pero UX-03 exige validar tambien la firma. No se puede acreditar que PDF, campos, firma y botones sean utilizables en ambas orientaciones porque:

  • El borrador probado no contiene campos preparados.
  • El listado de pendientes es incoherente: contador Pendientes 1, pero tabla sin filas.
  • Las incidencias INC-023 y INC-023 ya documentan que el acceso a la firma desde Ver acuerdo queda bloqueado o no ofrece una accion clara de firma.

Incidencia asociada

INC-023.

Accion recomendada: corregir la carga del listado de pendientes, asegurar que Ver acuerdo abre una vista firmable cuando corresponde y repetir UX-03 con un acuerdo QA con campos preparados en orientacion vertical y horizontal.

UX-04 KO

UX-04 / UX-06 / UX-07 - Accesibilidad, teclado y contraste

Recorrer home, modales, login, envío y firma con teclado.

Resultado esperado: Orden lógico, foco visible y sin trampas.

2 archivos fuente 1 evidencia visual

Evidencias visuales

01UX-04-06-07-envio-revision-accesibilidad-2026-09-02.pngOriginal

Informe de evidencia

UX-04 / UX-06 / UX-07 - Accesibilidad, teclado y contraste

Fecha: 02/09/2026 Entorno: Produccion (https://signmethod.com/) Herramienta: Chrome visible conectado a Codex Usuario visible: Owner - pepe (joel.lopez@softradis.com)

Alcance

Se revisaron, sin ejecutar acciones con efectos reales, el panel autenticado, el modal Acuerdos y el flujo Enviar acuerdo.

No se envio ningun acuerdo, no se subieron documentos y no se firmo ningun documento durante esta revision.

Evidencia visual:

  • docs/evidencias/UX-04-06-07-envio-revision-accesibilidad-2026-09-02.png
  • Capturas manuales compartidas por Joel en el chat el 02/09/2026 para UX-04:
  • Dashboard autenticado con foco visible sobre la tarjeta Proximos a vencer.
  • Vista publica Visualizacion del acuerdo con destinatario joel.lopez@softradis.com y documento PDF visible.
  • Home publica con enlace Dashboard visible tras volver desde la vista de acuerdo.
  • Modal de login Entrar al dashboard con email, contrasena, boton Entrar, boton de mostrar contrasena y estado Sesion cerrada correctamente.

UX-04 - Navegacion con teclado

Resultado esperado: orden logico, foco visible y sin trampas.

Estado: KO.

Evidencia observada
  • Las capturas manuales compartidas para UX-04 aportan evidencia positiva de foco visible en dashboard y de que las pantallas home, visualizacion de acuerdo y login son alcanzables durante el recorrido manual.
  • En login se observa el formulario Entrar al dashboard, con email y contrasena rellenados, boton Entrar, boton iconico para mostrar/ocultar contrasena y mensaje Sesion cerrada correctamente; esta captura confirma que el estado de cierre aparece visualmente tras salir.
  • En el dashboard, el foco es visible en varios controles mediante outline, pero al iniciar el recorrido con Tab despues de haber desplazado la pagina se enfoca primero en elementos de cabecera con coordenadas fuera del viewport visible. Esto puede hacer que una persona que usa teclado pierda la referencia del foco.
  • En el modal Acuerdos, el foco no queda atrapado dentro del dialogo: el recorrido con Tab pasa por controles de fondo como Plantillas, Administracion, Temporalidad, selector de empresa, Usuarios, Enviar acuerdo, Comprar ahora y Salir.
  • El modal Enviar acuerdo presenta el mismo problema: aunque el dialogo tiene aria-modal="true", el foco sigue alcanzando controles de la pagina de fondo.
  • El dialogo de acuerdos puede abrirse y recorrerse parcialmente con teclado, pero el comportamiento no cumple el criterio de modal accesible porque el fondo no queda inerte.
  • La vista publica de acuerdo aparece visualmente cargada con un documento, pero la captura no demuestra por si sola el orden completo de foco, la activacion por teclado ni la ausencia de trampas durante la firma.
  • Aunque el login queda cubierto de forma visual por la captura manual, falta registrar el orden de tabulacion completo y la operativa Enter/Escape con teclado puro.
Para convertirlo en OK
  • Al abrir cualquier modal, mover el foco inicial al titulo o primer control accionable del dialogo.
  • Aplicar focus trap dentro del dialogo mientras este abierto.
  • Marcar el fondo como inerte o equivalente para que no reciba foco ni sea anunciado.
  • Restaurar el foco al control que abrio el modal al cerrarlo.
  • Garantizar cierre por Escape cuando no haya perdida de datos, y confirmacion explicita si el cierre descarta cambios.
  • Repetir con teclado puro el recorrido home, login, dashboard, modal de acuerdos, envio y firma real QA, incluyendo la vista publica del acuerdo mostrada en la captura manual.
  • Guardar evidencia del orden de foco y de que no hay trampas ni foco fuera de pantalla.

UX-06 - Controles, errores y estados con lector de pantalla

Resultado esperado: se anuncian correctamente.

Estado: KO.

Evidencia observada
  • El modal Acuerdos tiene role="dialog" y aria-modal="true", pero no tiene aria-label ni aria-labelledby; por tanto el lector de pantalla no dispone de un nombre de dialogo fiable.
  • El modal Enviar acuerdo tambien tiene role="dialog" y aria-modal="true", pero carece de aria-label y aria-labelledby.
  • En el flujo Enviar acuerdo, los campos obligatorios revisados aparecen sin id, sin asociacion label[for], sin aria-describedby, sin aria-invalid y sin aria-required.
  • Los placeholders existen en varios campos, pero no sustituyen a una etiqueta accesible persistente.
  • Hay estados positivos: el guardado automatico y varios avisos de paso usan role="status" y aria-live="polite", por lo que parte de los estados podria anunciarse.
  • Tambien hay estados que no quedan igualmente claros: botones de paso y resumen muestran Pendiente, pero no se detecto una asociacion programatica completa entre el error, el campo concreto y el control que debe corregirse.
  • Se observaron controles con textos accesibles ambiguos o repetidos, como varios botones Editar, y controles iconicos que dependen de aria-label puntual.
  • En menus de acciones, pueden aparecer elementos role="menuitem" sin texto visible/accesible suficiente cuando el menu esta desplegado o parcialmente activo.
  • No se ejecuto un lector de pantalla nativo como NVDA, JAWS, VoiceOver o TalkBack; la revision se basa en DOM, roles, nombres accesibles y senales ARIA visibles desde Chrome.
Para convertirlo en OK
  • Dar nombre accesible a cada dialogo mediante aria-labelledby apuntando al titulo visible.
  • Asociar cada campo con id y label for, manteniendo texto visible persistente.
  • Asociar ayudas y errores mediante aria-describedby.
  • Marcar campos invalidos con aria-invalid="true" y anunciar errores en una region role="alert" o aria-live adecuada.
  • Diferenciar botones repetidos con nombres accesibles contextuales, por ejemplo Editar acuerdo, Editar documentos, Editar participantes.
  • Revisar todos los botones iconicos y menus para que tengan nombre accesible unico y estado aria-expanded correcto.
  • Ejecutar una pasada manual con NVDA en Windows y, si aplica, VoiceOver/TalkBack en movil.
  • Repetir controles, errores y estados en login, envio y firma QA antes de cerrar como OK.

UX-07 - Contraste y objetivos tactiles

Resultado esperado: son legibles y accionables.

Estado: KO.

Evidencia observada
  • La mayoria de textos principales se perciben legibles en escritorio, pero hay al menos un contraste insuficiente medido: el aviso verde Acuerdo enviado correctamente a 1 destinatario. aparece con texto rgb(20, 100, 55) sobre fondo compuesto aproximado rgb(39, 63, 52), con contraste calculado aproximado 1.58:1, inferior al minimo WCAG AA de 4.5:1 para texto normal.
  • Muchos objetivos accionables estan por debajo de 44x44 px:
  • Navegacion superior: Acuerdos, Plantillas, Administracion, Temporalidad tienen 20 px de alto.
  • Inicio mide aproximadamente 52x27.
  • Selector de empresa y botones Usuarios, Enviar acuerdo, Comprar ahora, Salir tienen 34 px de alto.
  • Boton de perfil mide aproximadamente 32x34.
  • Cierre de modal mide aproximadamente 36x40.
  • Botones iconicos de actualizar o mas acciones miden aproximadamente 36x36 o 32x32.
  • Varios botones del flujo Enviar acuerdo miden 40 px de alto.
  • Los controles pequenos pueden ser accionables con raton en escritorio, pero no cumplen una referencia tactil robusta para movil o usuarios con baja precision.
Para convertirlo en OK
  • Ajustar colores de avisos, estados secundarios y botones para cumplir WCAG AA: minimo 4.5:1 en texto normal y 3:1 en texto grande/iconos esenciales.
  • Medir contraste sobre el fondo final compuesto, no solo sobre el color CSS inmediato.
  • Elevar el area clicable/tactil de controles interactivos a 44x44 px como referencia minima.
  • Mantener iconos pequenos visualmente si se desea, pero aumentar padding o area activa.
  • Revisar objetivos tactiles en desktop, movil vertical y movil horizontal.
  • Repetir medicion de contraste y tamano sobre dashboard, modales, login, envio y firma QA.
UX-05 OK

UX-05 - Zoom al 200 %

Aplicar zoom al 200 %.

Resultado esperado: No se pierde contenido o funcionalidad.

1 archivo fuente 0 evidencias visuales

Informe de evidencia

UX-05 - Zoom al 200 %

Fecha: 01/09/2026 Entorno: Produccion (https://signmethod.com/) Herramienta: Playwright sobre Chrome abierto Usuario visible: Administrador · Prueba Produccion (pau.dengra@softradis.com)

Criterio

Aplicar zoom al 200 %.

Resultado esperado: no se pierde contenido o funcionalidad.

Comprobacion realizada

Inicialmente se intento aplicar zoom real del navegador con atajos desde Playwright/Chrome, pero no cambio de forma observable. A continuacion el usuario aplico manualmente el zoom al 200 % en el Chrome abierto y se repitio la medicion con Playwright.

El zoom real quedo confirmado por navegador:

  • devicePixelRatio = 2.
  • Viewport CSS efectivo aproximado: 952x444.
  • visualViewport.scale = 1, comportamiento esperado en Chrome de escritorio con zoom de pagina.

Resultado observado

Dashboard con zoom real 200 %
  • Viewport efectivo: 952x444.
  • documentElement.scrollWidth = 952.
  • body.scrollWidth = 953.
  • Sin desbordamiento horizontal funcional; la diferencia de 1 px se considera redondeo del navegador.
  • El contenido queda disponible mediante scroll vertical.
  • Controles visibles/accesibles: Menu, Inicio, Usuarios, Enviar acuerdo, Comprar ahora, Salir y tarjetas principales del panel.
Modal Acuerdos con zoom real 200 %

Se abrio el listado desde Pendientes 1.

  • Modal visible.
  • Viewport efectivo: 960x444.
  • Sin desbordamiento horizontal funcional.
  • Controles visibles: Actualizar acuerdos, Nuevo acuerdo, buscador y filtro de tareas.
  • El listado mantiene el problema funcional ya documentado en UX-03/INC-023: el contador indica Pendientes 1, pero la tabla filtrada no muestra filas. Ese defecto no es especifico del zoom.
Modal Enviar acuerdo con zoom real 200 %

Se abrio el modal Enviar acuerdo.

  • Viewport efectivo: 960x444.
  • Modal visible.
  • Sin desbordamiento horizontal funcional.
  • El dialogo tiene scroll interno (scrollHeight mayor que clientHeight), por lo que el contenido queda accesible verticalmente.
  • Controles principales visibles: Borradores, pasos Informacion, Documentos, Participantes, Campos, Mensaje, Revisar y enviar, Guardar y salir, Continuar.

Resultado

OK.

No se detecto perdida de contenido ni funcionalidad atribuible al zoom 200 % en dashboard, modal de acuerdos ni modal de envio.

La firma sigue limitada por el defecto funcional ya documentado en UX-03/INC-023, pero durante esta comprobacion no se observo una perdida adicional provocada por el zoom.

OTR

Otros artefactos

1 bloque de evidencia
OTR-OBS DOCUMENTADO

observation plus00 evidence

Artefactos y evidencias asociados a este bloque de validación.

1 archivo fuente 0 evidencias visuales

Archivos asociados

observation-plus00-evidence-2026-09-03.zipZIP · 1.4 MB Abrir original