Cifrado de secretos en reposo
Todo secreto de servicio (API keys, tokens) se almacena cifrado con AES-256-GCM; nunca en texto plano en la base de datos.
src/lib/crypto.ts 18 requerimientos no funcionales agrupados por categoría de calidad (alineadas a ISO/IEC 25010): seguridad, confiabilidad/disponibilidad, eficiencia de desempeño, mantenibilidad y usabilidad/accesibilidad. Filtra por estado o prioridad, o busca por ID, título o ruta.
No hay requerimientos que coincidan con los filtros.
Todo secreto de servicio (API keys, tokens) se almacena cifrado con AES-256-GCM; nunca en texto plano en la base de datos.
src/lib/crypto.ts Solo los logins de GitHub explícitamente permitidos obtienen sesión de administrador, sin excepción.
src/lib/auth.ts Cualquier fallo en blocklist, rate limiting o sensor deja pasar el request; el enforcement nunca puede tumbar el sitio.
src/middleware.ts Todo bloqueo de IP y todo chaos flag tiene TTL obligatorio; el sistema se autocorrige sin intervención manual.
blocked_ips.expiresAt chaos_flags.expiresAt La IP se enmascara/hashea antes de exponerse fuera del panel admin; Web Vitals no capturan datos personales.
security_events.ipHash Un mismo idempotencyKey nunca genera dos cobros, incluso ante doble clic o reintento de red.
payments.idempotencyKey Los estados terminales de un pago (approved/declined/error/voided) nunca retroceden ante webhooks fuera de orden.
src/lib/payments.ts Si el health check post-deploy falla, el pipeline revierte automáticamente a la última versión saludable.
ci_runs.healthOk Cada servicio monitoreado puede evaluarse contra un objetivo configurable (por defecto 99.5% en ventana de 30 días).
src/lib/slo.ts El estado del limitador de tasa persiste en base de datos, no se resetea con cada despliegue.
rate_limit_buckets La clasificación de cada request (regex/lookup en memoria) no debe añadir latencia perceptible; la escritura es fire-and-forget.
src/lib/security/sensor.ts LCP, INP y CLS del sitio público deben mantenerse en la banda "good" según el p75 medido en producción.
web_vitals Blocklist y flags de chaos se leen con cache en memoria (30s) para no golpear la base de datos en cada request.
src/lib/security/blocklist.ts Requerimientos, casos de uso e iteraciones se definen en TypeScript tipado, no en documentos externos desincronizables.
src/data/documentacion.ts Cada decisión técnica relevante por proyecto queda documentada con contexto, alternativas y consecuencias (ADR).
project_adrs Los checks de monitoreo y eventos de seguridad crudos se purgan pasados 90 días para no inflar el almacenamiento.
monitor_checks security_events El panel admin y sus subpáginas son usables en viewport móvil (drawer de navegación colapsable).
src/layouts/AdminLayout.astro Cada PR corre una auditoría automática de accesibilidad (axe/lighthouse) sobre las páginas públicas.