Informe detallado de validación de producción
SIF BongoFact 1.0.29 · 29 de septiembre de 2026
Resultado global: PASS
Bump SemVer PATCH: aplicado
Esta autoverificación técnica revisa evidencias reproducibles del release. No constituye
homologación de la AEAT, certificación ENS ni dictamen jurídico externo. Facturae/FACe se
evalúa como interoperabilidad de factura electrónica y no como parte del RRSIF.
0. Gate funcional obligatorio
Resultado: PASS
Commit auditado: 7bdb02be4201e6f66ea888161c412152bdff5b95
Conectividad AEAT: N/A · falta certificado dedicado de sonda
- PASS · Pruebas unitarias e integración (7 s)
- PASS · Compilación TypeScript + Vite (89 s)
- PASS · E2E Portal de Gestorías (escritorio y móvil) (124 s)
1. SIF Veri*Factu y Facturae/FACe
31 controles · 27 PASS · 4 N/A · 0 FAIL
Artefacto: verifactu_audit_20260929_2356.txt
Área: Veri*Factu · huella
Referencia: RD 1007/2023 art. 12 · Orden HAC/1177/2024 art. 13
Requisito: Calcular SHA-256 sobre el subconjunto y formato oficial de campos.
Método: Vector determinista y recálculo independiente con node:crypto.
Evidencia: veriFactuService.mjs
Resultado: Huella SHA-256 hex 64 mayúsculas coincidente (38C89D610219…).
Área: Veri*Factu · registros
Referencia: RD 1007/2023 arts. 10 y 11 · Orden HAC/1177/2024 arts. 10 y 11
Requisito: Generar altas y anulaciones XML UTF-8 con estructura y contenido reglamentarios.
Método: Generación de ambos tipos y comprobación de nodos críticos.
Evidencia: veriFactuService.mjs
Resultado: XML RegistroAlta y RegistroAnulacion contienen Huella, encadenamiento y estructura mínima.
Área: Veri*Factu · trazabilidad
Referencia: RD 1007/2023 art. 8.2.b · Orden HAC/1177/2024 art. 7
Requisito: Encadenar cada alta/anulación con el registro cronológicamente anterior.
Método: Cadena de dos registros y prueba negativa con huella alterada.
Evidencia: veriFactuService.mjs
Resultado: Encadenamiento: huella N depende de N-1; genesis vacío en cadena; ruptura detectada.
Área: Veri*Factu · QR
Referencia: Orden HAC/1177/2024 arts. 20 y 21
Requisito: Construir la URL QR oficial exclusivamente con NIF, serie/número, fecha e importe.
Método: Parseo de URL y comparación exacta de parámetros.
Evidencia: qrGenerator.mjs · veriFactuService.mjs
Resultado: QR apunta a ValidarQR AEAT (prod/www2) con los cuatro parámetros oficiales y sin datos adicionales.
PASSINALTEABILIDAD_CUMP01
Área: Veri*Factu · inalterabilidad
Referencia: RD 1007/2023 art. 8.2.a · Orden HAC/1177/2024 art. 6
Requisito: Impedir modificación o eliminación de registros sellados.
Método: Sonda RPC real o verificación de migración cuando no hay credenciales.
Evidencia: prevent_invoice_tampering
Resultado: BD bloqueó UPDATE con huella: Veri*Factu: no se puede modificar base_imponible en factura emitida. Use anulación.
PASSEMISION_ATOMICA_CUMP02
Área: Veri*Factu · concurrencia
Referencia: RD 1007/2023 art. 8.2.a–b
Requisito: Serializar numeración y encadenamiento para evitar carreras.
Método: Sonda de existencia RPC o inspección de migración FOR UPDATE.
Evidencia: aplicar_emision_verifactu_atomica
Resultado: RPC aplicar_emision_verifactu_atomica desplegada (responde a sonda).
PASSSIF_IDENTIDAD_VERSION_PRODUCTOR
Área: Veri*Factu · identificación SIF
Referencia: Orden HAC/1177/2024, anexo 2.6 y art. 15.1 a–j
Requisito: Los registros deben identificar de forma coherente productor, código, versión e instalación del SIF.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: server/servicios/veriFactuService.mjs · src/config/sifRelease.json
Resultado: Productor, NIF y versión 1.0.29 son coherentes entre registro y release.
PASSMODO_EXCLUSIVO_VERIFACTU
Área: Veri*Factu · modalidad
Referencia: RD 1007/2023 art. 16 · Orden HAC/1177/2024 arts. 15.1.e y 16
Requisito: Si se declara uso exclusivo VERI*FACTU, la emisión debe enlazar con la remisión efectiva a AEAT.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: veriFactuService.mjs · emitirBorradorFacturaSaas.mjs
Resultado: El registro declara SoloVerifactu=S y el flujo de un tenant VERIFACTU remite tras sellar.
N/AFIRMA_REGISTROS_NO_VERIFACTU
Área: Veri*Factu · firma de registros
Referencia: RD 1007/2023 arts. 12 y 16.3 · Orden HAC/1177/2024 art. 14
Requisito: Los registros no VERI*FACTU se firman con XAdES y certificado cualificado; los VERI*FACTU están dispensados.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: TipoUsoPosibleSoloVerifactu=S
Resultado: No aplicable por diseño exclusivamente VERI*FACTU; permanece obligatoria la huella SHA-256.
N/AREGISTRO_EVENTOS_NO_VERIFACTU
Área: Veri*Factu · registro de eventos
Referencia: Orden HAC/1177/2024 art. 9
Requisito: Los sistemas no VERI*FACTU registran eventos de inicio/fin, anomalías, restauración y exportación.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: TipoUsoPosibleSoloVerifactu=S · FAQ técnica AEAT
Resultado: No aplicable mientras el producto solo pueda operar como VERI*FACTU.
PASSSIF_MULTIPLES_OBLIGADOS
Área: Veri*Factu · identificación SIF
Referencia: Orden HAC/1177/2024 art. 15.1.f y anexo 2.6
Requisito: La capacidad de prestar servicio a varios obligados tributarios debe declararse coherentemente.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: veriFactuService.mjs · migración agency_relations
Resultado: La capacidad multiobligado está declarada de forma coherente.
N/AAUTORIZACION_NO_APLICACION
Área: Veri*Factu · supuestos especiales
Referencia: Orden HAC/1177/2024 art. 12
Requisito: Consignar el número de registro de autorizaciones o resoluciones de no aplicación cuando existan.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: No se declara ninguna autorización o resolución especial para BongoFact.
Resultado: No aplicable al release auditado; si un obligado dispone de resolución, deberá habilitarse y verificarse antes de su uso.
N/ARENUNCIA_MODALIDAD_VERIFACTU
Área: Veri*Factu · modalidad
Referencia: Orden HAC/1177/2024 art. 17
Requisito: Una eventual renuncia a la remisión respeta plazo, campo oficial y mantenimiento hasta fin de año.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: Declaración de producto exclusivamente VERI*FACTU.
Resultado: No aplicable: el producto no ofrece cambio a modalidad no VERI*FACTU.
PASSALTA_SIMULTANEA_EXPEDICION
Área: Veri*Factu · registro de alta
Referencia: RD 1007/2023 arts. 9 y 10 · Orden HAC/1177/2024 art. 10
Requisito: Generar automáticamente el registro de alta simultáneamente o inmediatamente antes de expedir la factura.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: emitirBorradorFacturaSaas.mjs
Resultado: El flujo de emisión construye/persiste el XML y aplica numeración, huella y estado mediante operación atómica.
PASSCORRECCION_MEDIANTE_NUEVO_REGISTRO
Área: Veri*Factu · inalterabilidad
Referencia: RD 1007/2023 art. 8.2.a y art. 11
Requisito: Las correcciones o anulaciones no alteran el original: generan un registro posterior.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: veriFactuService.mjs · migraciones CUMP-01/CUMP-02
Resultado: Existe registro de anulación encadenado y bloqueo de mutación de registros sellados.
PASSTRAZABILIDAD_BIDIRECCIONAL_UI
Área: Veri*Factu · trazabilidad
Referencia: Orden HAC/1177/2024 art. 7.h
Requisito: Desde cualquier registro debe poder saltarse al anterior y posterior, mostrando validez de hash y orden temporal.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: src/components/facturacion/InvoiceTraceabilityTimeline.tsx
Resultado: La interfaz ofrece navegación anterior/posterior y valida encadenamiento.
PASSCONSERVACION_ACCESO_EXPORTACION
Área: Veri*Factu · conservación
Referencia: RD 1007/2023 art. 8.2.c y art. 14 · Orden HAC/1177/2024 art. 8
Requisito: Conservar y permitir acceso, consulta y copia electrónica legible de los registros.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: exportarDatosUsuario.mjs · /api/exportar-datos · almacenamiento facturas_xml
Resultado: La exportación autenticada reúne facturas y XML conservados en un ZIP tenant-scoped.
PASSREMISION_AEAT_SEGURA_FEHACIENTE
Área: Veri*Factu · remisión
Referencia: RD 1007/2023 arts. 8.1 y 16 · Orden HAC/1177/2024 arts. 4, 5 y 16
Requisito: Remisión continuada, segura, correcta, íntegra, automática, consecutiva, instantánea y fehaciente.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: aeatVerifactuRemision.mjs · procesarRemisionRegistroVerifactu.mjs
Resultado: Transporte HTTPS/mTLS, certificado y parser de respuesta AEAT presentes.
PASSPRODUCCION_AEAT_ENTORNO
Área: Veri*Factu · despliegue
Referencia: Orden HAC/1177/2024 art. 16 · separación de entornos AEAT
Requisito: Un release de producción debe auditarse contra configuración productiva explícita, nunca preproducción/mock.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: VERIFACTU_ENV · VERIFACTU_ENDPOINT_URL · release-prod-gate
Resultado: El gate usa entorno prod y endpoint oficial agenciatributaria.gob.es.
PASSREMISION_CONTROL_FLUJO
Área: Veri*Factu · remisión
Referencia: Orden HAC/1177/2024 art. 16.2
Requisito: Respetar el tiempo de espera inicialmente de 60 segundos, su actualización por AEAT y el máximo de registros por envío.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: aeatVerifactuRemision.mjs · verifactuFlowControl.mjs · migraciones verifactu_remision_control(_rpc)
Resultado: Se detecta control de flujo durable (RPC + TiempoEsperaEnvio) y tamaño máximo de lote 1000.
PASSREMISION_REINTENTO_INMUTABLE
Área: Veri*Factu · inalterabilidad y contingencia
Referencia: RD 1007/2023 art. 8.2.a · Orden HAC/1177/2024 art. 16.4
Requisito: Reenviar un registro sellado conserva XML, FechaHoraHusoGenRegistro y huella, marcando la incidencia solo en el sobre.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: remitirFacturaAeatManual.mjs · procesarRemisionRegistroVerifactu.mjs · prepararXmlRemisionConVentanaAeat.mjs
Resultado: El reenvío usa el XML firmado conservado, verifica su hash y no recalcula la huella.
PASSREMISION_REINTENTO_HORARIO_AVISO
Área: Veri*Factu · contingencia
Referencia: Orden HAC/1177/2024 art. 16.4
Requisito: Reintentar al menos cada hora y mantener aviso visible mientras existan registros pendientes.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: server/index.mjs · procesarRemisionRegistroVerifactu.mjs · frontend
Resultado: Existe worker horario y aviso persistente de pendientes.
PASSRESPUESTA_AEAT_CSV_ERRORES
Área: Veri*Factu · remisión
Referencia: Orden HAC/1177/2024 art. 16.3 y 16.5
Requisito: Interpretar aceptación, CSV, registro erróneo y código de error sin confundir HTTP 200 con aceptación.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: aeatVerifactuRemision.mjs · tests/aeatVerifactuRemision.test.mjs
Resultado: El parser separa estado de envío/registro, CSV y errores de negocio.
PASSREMISION_MARCA_INCIDENCIA
Área: Veri*Factu · contingencia
Referencia: Orden HAC/1177/2024 art. 16.4 y anexo 4
Requisito: Marcar en el mensaje los registros remitidos fuera de plazo por una incidencia técnica.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: aeatVerifactuRemision.mjs · verifactuFlowControl.mjs · migraciones verifactu_remision_control(_rpc)
Resultado: Se detecta el campo Incidencia en SOAP y persistencia de incidencia técnica por tenant.
PASSQR_REPRESENTACION_GRAFICA
Área: Veri*Factu · factura
Referencia: Orden HAC/1177/2024 arts. 20 y 21
Requisito: Incluir QR legible de 30–40 mm y la mención VERI*FACTU; en factura electrónica, la URL.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: invoiceTemplate.mjs · qrGenerator.mjs
Resultado: Las plantillas sitúan al inicio un QR de 30 mm con «QR tributario:» y la mención legal, sin exigir certificado al receptor.
PASSDECLARACION_RESPONSABLE_ART15
Área: Veri*Factu · declaración responsable
Referencia: RD 1007/2023 art. 13 · Orden HAC/1177/2024 art. 15
Requisito: Declaración visible por versión, con apartados obligatorios 1.a–1.l en orden y anexo explicativo.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: scripts/generate-declaracion.mjs · public/legal/declaracion-responsable.html
Resultado: Se comprueba estructuralmente el generador, no una firma externa ni una homologación de la AEAT.
PASSFACTURAE_322_ESTRUCTURA
Área: Facturae/FACe · formato
Referencia: Ley 25/2013 · formato Facturae 3.2.2 publicado por FACe
Requisito: Generar Facturae 3.2.2 con cabecera, partes, impuestos, totales, líneas y pago coherentes.
Método: Generación determinista de una factura de prueba y comprobación de estructura/valores.
Evidencia: facturaeXmlService.mjs · tests/facturaeXml.test.mjs
Resultado: La muestra usa namespace/esquema 3.2.2 y totaliza 100,00 + 21,00 = 121,00.
Área: Facturae/FACe · centros administrativos
Referencia: Especificación FACe / Facturae 3.2.2
Requisito: Incluir oficina contable (01), órgano gestor (02) y unidad tramitadora (03) en BuyerParty.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: facturaeXmlService.mjs
Resultado: La muestra contiene los tres centros DIR3 con sus RoleTypeCode.
PASSFACTURAE_FIRMA_XADES_POLICY
Área: Facturae/FACe · firma
Referencia: Política de firma Facturae v3.1 · XAdES-EPES
Requisito: Firmar el XML con certificado cualificado, referencia enveloped y política Facturae exigida por FACe.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: facturaeSigner.mjs · facturaeXmlService.mjs
Resultado: El motor y el preflight exigen XAdES-EPES y el digest de política; no se usa un certificado real en CI.
PASSFACTURAE_IDENTIDAD_CERTIFICADO
Área: Facturae/FACe · identidad
Referencia: Política de firma Facturae/FACe
Requisito: Comprobar que el certificado pertenece al emisor o a un representante válido de la persona jurídica.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: facturaeXmlService.mjs · pkcs12Identidad.mjs
Resultado: El preflight compara SellerParty con identidad y organizationIdentifier del certificado.
PASSFACE_TRANSPORTE_RESPUESTA
Área: Facturae/FACe · remisión
Referencia: Servicios web FACe y WSDL oficial
Requisito: Enviar factura firmada, interpretar código de resultado y conservar número de registro.
Método: Inspección estática reproducible del código incluido en el release.
Evidencia: faceWebService.mjs · tests/aeatVerifactuRemision.test.mjs
Resultado: Existe cliente SOAP y parser que no considera éxito sin código/registro válido.
2. Seguridad
15 controles · 15 PASS · 0 N/A · 0 FAIL
Artefacto: security_audit_20260929_2356.txt
PASSJWT_PRIVATE_ENDPOINTS
Área: Identidad · autenticación
Referencia: RGPD art. 32 · ENS arts. 17 y 18 · OWASP ASVS V2
Requisito: Validar JWT en endpoints privados y autenticación específica del integrador.
Método: Inspección de middleware y prefijos protegidos.
Evidencia: server/index.mjs · middleware/requireAuth.mjs
Resultado: requireAuth valida JWT; AUTH_ROUTE_PREFIXES cubre facturación/admin; integrador usa API key propia.
Área: API · inyección
Referencia: OWASP ASVS V5 · OWASP Top 10 A03
Requisito: Evitar SQL construido por concatenación de entrada no confiable.
Método: Escaneo de patrones peligrosos en todos los archivos del servidor.
Evidencia: server/**/*.mjs
Resultado: Sin patrones obvios de SQL concatenado en 254 archivos server.
PASSINTEGRADOR_APIKEY_HASH
Área: Identidad · credenciales API
Referencia: OWASP ASVS V2/V6
Requisito: No persistir API keys de integradores en texto claro.
Método: Vector hash independiente y revisión de columnas persistidas.
Evidencia: integradorBancarioAuth.mjs
Resultado: API key de integrador: SHA-256 hex; solo se persiste integrador_api_key_hash.
Área: Operación · monitorización
Referencia: ENS arts. 23 y 26
Requisito: Exponer salud mínima sin datos sensibles y sin exigir sesión.
Método: Control negativo del gate JWT.
Evidencia: server/index.mjs
Resultado: /api/health excluido correctamente del gate JWT.
Área: Datos · aislamiento tenant
Referencia: RGPD art. 32 · ENS arts. 15, 17 y 21 (referencia de buenas prácticas)
Requisito: Toda lectura/escritura fiscal debe quedar limitada al tenant autorizado.
Método: Análisis estático reproducible del artefacto de release.
Evidencia: requireTenantFacturacion.mjs · políticas RLS en supabase/migrations
Resultado: Existe middleware tenant y RLS en la base de datos; la prueba no sustituye un test remoto de políticas.
Área: Identidad · privilegios
Referencia: ENS arts. 17 y 18 · OWASP ASVS V2/V4
Requisito: Las acciones privilegiadas requieren rol de plataforma verificado y MFA AAL2.
Método: Análisis estático reproducible del artefacto de release.
Evidencia: server/index.mjs · requireAuth.mjs
Resultado: El backend diferencia Superadmin de claims genéricos y dispone de gate AAL2.
Área: API · origen de peticiones
Referencia: OWASP ASVS V3/V14
Requisito: Restringir orígenes web y bloquear mutaciones sin origen/autenticación válida.
Método: Análisis estático reproducible del artefacto de release.
Evidencia: server/index.mjs
Resultado: Existe allowlist de hosts/orígenes y gate JWT para prefijos protegidos.
Área: API · disponibilidad
Referencia: ENS art. 23 · OWASP API Security API4
Requisito: Limitar abuso en autenticación, IA y rutas de coste elevado.
Método: Análisis estático reproducible del artefacto de release.
Evidencia: server/index.mjs
Resultado: Se detectan limitadores para IA y middleware de rate limiting.
PASSHTTP_SECURITY_HEADERS
Área: Web · navegador y transporte
Referencia: ENS arts. 22 y 23 · OWASP ASVS V14
Requisito: Forzar HTTPS/HSTS y políticas CSP, anti-sniffing y framing.
Método: Análisis estático reproducible del artefacto de release.
Evidencia: securityCsp.mjs · nginx-bongofact.conf
Resultado: La aplicación define HSTS/CSP y Nginx sirve el dominio por HTTPS.
PASSSECRETS_DEPLOY_ISOLATION
Área: Secretos · despliegue
Referencia: ENS arts. 18, 19 y 21 · OWASP ASVS V6
Requisito: No incluir secretos, credenciales cloud ni claves privadas en artefactos o frontend.
Método: Análisis estático reproducible del artefacto de release.
Evidencia: deploy/deploy-bongoo.ps1
Resultado: El empaquetado excluye .env y credenciales; el .env remoto se conserva con permisos restringidos.
PASSCERTIFICATE_VAULT_CRYPTO
Área: Criptografía · certificados
Referencia: RGPD art. 32 · ENS arts. 21 y 22
Requisito: Cifrar certificados en reposo, limitar descifrado y limpiar material sensible de memoria.
Método: Análisis estático reproducible del artefacto de release.
Evidencia: certificadoVault.mjs y servicios de firma
Resultado: Se detectan cifrado autenticado/gestión de bóveda y limpieza de buffers.
PASSAUDIT_LOG_APPEND_ONLY
Área: Trazabilidad · auditoría
Referencia: ENS art. 24 · RD 1007/2023 art. 8 (ámbito fiscal)
Requisito: Registrar acciones críticas en una bitácora tenant-scoped resistente a alteración.
Método: Análisis estático reproducible del artefacto de release.
Evidencia: auditLogger.mjs · migration audit_logs_inmutable
Resultado: audit_logs es append-only por trigger, fuerza RLS y restringe privilegios.
PASSLOG_SECRET_DISCLOSURE
Área: Trazabilidad · confidencialidad
Referencia: RGPD art. 32 · OWASP ASVS V7
Requisito: No escribir contraseñas, PIN, claves privadas, service_role o API keys en logs.
Método: Análisis estático reproducible del artefacto de release.
Evidencia: Escaneo de 254 archivos server
Resultado: No se detecta interpolación obvia de secretos en console.*.
Área: Cadena de suministro
Referencia: ENS arts. 20 y 21 · OWASP ASVS V1.14
Requisito: Fijar versiones reproducibles de dependencias para el artefacto desplegado.
Método: Análisis estático reproducible del artefacto de release.
Evidencia: package-lock.json · npm install en deploy
Resultado: Existe lockfile y producción instala únicamente dependencias runtime.
PASSDEPLOY_ATOMIC_HEALTH_ROLLBACK
Área: Continuidad · despliegue
Referencia: ENS arts. 25 y 26
Requisito: Publicar de forma controlada, conservar versión anterior y verificar salud del servicio.
Método: Análisis estático reproducible del artefacto de release.
Evidencia: deploy/deploy-bongoo.ps1
Resultado: El frontend usa swap, conserva dist.previous y comprueba Nginx/API tras reinicio.
3. Fuentes normativas y técnicas
Generado automáticamente por scripts/release-prod-gate.mjs antes del despliegue.