Mike (@mikerb95)CodeByMike

28 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.

28
Total req. no funcionales
27
Implementados
1
Parciales
0
Planeados
96% en producción
Estado
Prioridad

Seguridad

6/6
RNF-01

Cifrado de secretos en reposo

Implementado

Todo secreto de servicio (API keys, tokens) se almacena cifrado con AES-256-GCM; nunca en texto plano en la base de datos.

Prioridad altasrc/lib/crypto.ts
RNF-02

Autorización por allowlist

Implementado

Solo los logins de GitHub explícitamente permitidos obtienen sesión de administrador, sin excepción.

Prioridad altasrc/lib/auth.ts
RNF-03

Fail-open en enforcement de seguridad

Implementado

Cualquier fallo en blocklist, rate limiting o sensor deja pasar el request; el enforcement nunca puede tumbar el sitio.

Prioridad altasrc/middleware.ts
RNF-04

Sin bloqueos eternos

Implementado

Todo bloqueo de IP y todo chaos flag tiene TTL obligatorio; el sistema se autocorrige sin intervención manual.

Prioridad mediablocked_ips.expiresAtchaos_flags.expiresAt
RNF-05

Minimización de PII en la vitrina pública

Implementado

La IP se enmascara/hashea antes de exponerse fuera del panel admin; Web Vitals no capturan datos personales.

Prioridad mediasecurity_events.ipHash
RNF-20

Los guardas de ruta son ciegos al idioma

Implementado

Ningún clasificador de ruta (rate limiting, bloqueo en modo demo, gate de admin, portal) puede cambiar de veredicto porque la URL lleve un prefijo de idioma delante.

Prioridad altasrc/i18n/routing.ts (delocalizePathisLocalizedPrivateRequest)src/middleware.ts

Confiabilidad y disponibilidad

8/8
RNF-06

Idempotencia de pagos

Implementado

Un mismo idempotencyKey nunca genera dos cobros, incluso ante doble clic o reintento de red.

Prioridad altapayments.idempotencyKey
RNF-07

Máquina de estados sin retrocesos

Implementado

Los estados terminales de un pago (approved/declined/error/voided) nunca retroceden ante webhooks fuera de orden.

Prioridad altasrc/lib/payments.ts
RNF-08

Rollback automático de deploy

Implementado

Si el health check post-deploy falla, el pipeline revierte automáticamente a la última versión saludable.

Prioridad altaci_runs.healthOk
RNF-09

Objetivo de disponibilidad (SLO)

Implementado

Cada servicio monitoreado puede evaluarse contra un objetivo configurable (por defecto 99.5% en ventana de 30 días).

Prioridad mediasrc/lib/slo.ts
RNF-10

Rate limiting resistente a redeploys

Implementado

El estado del limitador de tasa persiste en base de datos, no se resetea con cada despliegue.

Prioridad mediarate_limit_buckets
RNF-26

Las páginas públicas sobreviven a una base caída

Implementado

Una consulta que falla en una página pública pinta el dato como ausente, nunca como error ni como 404: la portada, /status, /security, /certifications y /engineering siguen sirviendo su contenido aunque la base de datos no responda.

Prioridad altasrc/lib/safe-query.tsusado en src/pages/index.astrostatus.astrosecurity.astrocertifications.astro y engineering.astro
RNF-27

Datos reales desde fuentes alternas con la base caída

Implementado

Cuando la base de datos no responde, las páginas públicas no se limitan a omitir el dato (RNF-26): lo sirven desde una fuente alterna real. La portada pinta los proyectos desde una instantánea capturada de la propia base, y /status mide la disponibilidad y la latencia sondeando los endpoints públicos en el momento del render, sin base de datos de por medio.

Prioridad altasrc/lib/fallback/ (rastreador.tsinstantanea.tssondeo-vivo.ts)src/data/instantanea.jsonsrc/data/respaldo-monitores.tsscripts/capturar-instantanea.mjs
RNF-28

Los crons declarados son verificables sin desplegar

Implementado

Toda ruta declarada en la sección de crons de vercel.json existe como archivo, exporta un handler GET, comprueba CRON_SECRET y no cuelga del gate de sesión de /api/admin.

Prioridad altavercel.json (crons)tests/crons.test.ts

Eficiencia de desempeño

2/3
RNF-11

Latencia del sensor de seguridad

Implementado

La clasificación de cada request (regex/lookup en memoria) no debe añadir latencia perceptible; la escritura es fire-and-forget.

Prioridad altasrc/lib/security/sensor.ts
RNF-12

Core Web Vitals dentro de "good"

Parcial

LCP, INP y CLS del sitio público deben mantenerse en la banda "good" según el p75 medido en producción.

Prioridad mediaweb_vitals
RNF-13

Cache de lecturas frecuentes

Implementado

Blocklist y flags de chaos se leen con cache en memoria (30s) para no golpear la base de datos en cada request.

Prioridad mediasrc/lib/security/blocklist.ts

Mantenibilidad

7/7
RNF-14

Datos de documentación como código

Implementado

Requerimientos, casos de uso e iteraciones se definen en TypeScript tipado, no en documentos externos desincronizables.

Prioridad mediasrc/data/documentacion.ts
RNF-15

Registro de decisiones de arquitectura

Implementado

Cada decisión técnica relevante por proyecto queda documentada con contexto, alternativas y consecuencias (ADR).

Prioridad mediaproject_adrs
RNF-22

Entorno de desarrollo reproducible en contenedor

Implementado

El entorno de desarrollo (Node 22.12, navegador de Playwright, bases de datos) se define como código en un devcontainer, de modo que clonar el repositorio y abrirlo produce el mismo entorno en cualquier máquina.

Prioridad media.devcontainer/ (Dockerfilecompose.yamldevcontainer.json)compose.yaml
RNF-23

Pruebas de integración contra libSQL real

Implementado

La suite e2e puede ejecutarse contra un servidor libSQL (sqld) en contenedor además de contra bases en archivo, ejerciendo el mismo protocolo HTTP/hrana que Turso en producción.

Prioridad mediacompose.yamlplaywright.config.ts (E2E_DB_MODE)scripts/wait-libsql.mjsscripts/seed-e2e.mjs
RNF-24

Separación de niveles de autoridad verificable

Implementado

Las decisiones de publicar, revertir y ejecutar están separadas en tres niveles de autoridad, y cada frontera se sostiene en un mecanismo del repositorio, no en la disciplina de quien programa. La matriz RACI de las actividades críticas es un dato tipado con sus reglas comprobadas en CI.

Prioridad mediasrc/data/gobernanza.tssrc/lib/gobernanza-estilos.tssrc/pages/docs/roles.astrosrc/pages/docs/raci.astro; mecanismos: .github/workflows/ci.yml (health check + rollback)regla de deploys en CLAUDE.mdallowlist en src/middleware.tspolítica de migraciones aditivas en drizzle/
RNF-16

Retención y purga de datos operativos

Implementado

Los checks de monitoreo y eventos de seguridad crudos se purgan pasados 90 días para no inflar el almacenamiento.

Prioridad bajamonitor_checkssecurity_events
RNF-25

Coste de lectura acotado en las páginas públicas

Implementado

El coste en filas leídas de una página pública no crece con la antigüedad del sistema: /status lee un resumen diario precalculado (una fila por monitor y día, ~720) más el día en curso, en vez de agregar los 90 días crudos de monitor_checks en cada render. Las pruebas de carga se niegan a arrancar si el objetivo está conectado a una base remota.

Prioridad altamonitor_dailysrc/lib/monitor-rollup.tssrc/pages/api/cron/monitor-rollup.tssrc/pages/status.astrosrc/lib/db-target.tslab/k6/lib/perfil.js

Usabilidad y accesibilidad

4/4
RNF-17

Panel operable desde móvil

Implementado

El panel admin y sus subpáginas son usables en viewport móvil (drawer de navegación colapsable).

Prioridad mediasrc/layouts/AdminLayout.astro
RNF-18

Auditoría de accesibilidad automatizada

Implementado

Cada push corre axe-core sobre Playwright contra las 8 páginas públicas y reporta las violaciones al panel del LAB como hallazgos rastreables.

Prioridad mediascripts/a11y-scan.mjs.github/workflows/a11y.yml
RNF-19

Navegación por teclado y anuncios en el portal

Implementado

El portal de clientes ofrece salto al contenido, región aria-live para el resultado de las acciones y devolución explícita del foco tras enviar un formulario.

Prioridad mediasrc/layouts/PortalLayout.astro
RNF-21

Paridad de traducciones verificable

Implementado

Una clave añadida al diccionario español sin su par en inglés rompe el type-check, y ningún hreflang ni entrada de sitemap apunta a una URL traducida que no exista.

Prioridad mediasrc/i18n/en.ts (satisfies typeof es)src/i18n/routing.ts (TRANSLATED_ROUTEStranslatedAlternates)