Mike (@mikerb95)CodeByMike

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

34
Total req. no funcionales
33
Implementados
1
Parciales
0
Planeados
97% en producción
Estado
Prioridad

Seguridad

10/10
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 las cuentas de GitHub explícitamente permitidas obtienen sesión de administrador, sin excepción. La cuenta se reconoce por su id numérico, que no cambia nunca, además de por su login.

Prioridad altasrc/lib/auth.ts (ALLOWED_GITHUB_IDSALLOWED_GITHUB_LOGINS)auth.config.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
RNF-31

Las llaves de seguridad no se pueden repetir ni plantar

Implementado

Un inicio de sesión con llave capturado no se puede reutilizar, y dar de alta una llave nueva exige haber probado la identidad hace menos de diez minutos. Cada alta y cada baja de llave avisa al teléfono y queda en el micro-SIEM.

Prioridad altasrc/lib/webauthn.ts (storeChallengeconsumeChallengenotifyPasskeyChange)webauthn_challengessrc/lib/auth.ts (isRecentAuth)auth.config.ts (authTime)src/pages/api/admin/webauthn/*
RNF-32

Lo privado cuenta, pero no se publica

Implementado

Las páginas públicas de actividad (/log y la portada) incluyen el trabajo en repos privados en sus cifras (horas, racha, total, gráfico), pero nunca el nombre del repo ni el mensaje de un commit o PR que no sea público.

Prioridad altasrc/pages/api/github/activity.ts (esPublico)
RNF-33

Lo que sale de la base no puede convertirse en código

Implementado

Todo JSON incrustado en un <script> escapa los caracteres que cerrarían la etiqueta, las URLs guardadas solo se pintan como enlace si son http(s), las respuestas privadas no se guardan en ninguna caché, y cada tipo de pase firmado con la misma clave lleva su propio dominio de firma.

Prioridad mediasrc/lib/json-script.ts (jsonEnScripten 25 páginas y layouts)src/lib/safe-url.ts (urlSegura)src/pages/api/lab/ingest.tssrc/middleware.ts (Cache-Control privado)src/lib/demo.ts (DemoScope)src/lib/webauthn.ts (firmaProof)
RNF-34

El servidor no sondea su propia red interna (SSRF)

Implementado

Todo lo que el servidor sondea por encargo, sea un monitor de uptime, el diagnóstico del panel o el analizador público, resuelve el host y rechaza IPs privadas, de loopback, link-local o reservadas antes de conectarse. Los monitores siguen las redirecciones a mano y validan cada destino, y la lectura del certificado TLS pasa por el mismo guardia.

Prioridad altasrc/lib/ssrf-guard.ts (assertPublicHost); src/lib/monitors.ts (probe con redirecciones manualesfetchSslExpiry); src/pages/api/admin/monitors/diagnose.ts; src/pages/api/lab/site-check.ts

Confiabilidad y disponibilidad

9/9
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)src/lib/cron-auth.tstests/crons.test.ts
RNF-29

Las fechas se anclan a la zona de Colombia, y las dos clases se tratan distinto

Implementado

Todo dato con fecha que salga a un documento o a una pantalla se resuelve en America/Bogota: los instantes (emisión, pago, creación) se formatean en esa zona, y las fechas de calendario (vencimiento, periodo de un servicio, fecha de un hito) se anclan a medianoche colombiana al entrar. Un solo módulo puro lo resuelve para las cuentas de cobro, las facturas del portal y los hitos.

Prioridad altasrc/lib/fecha-co.tssrc/lib/cuentas-cobro.tssrc/lib/portal/format.tssrc/pages/api/admin/portal/hitos.tssrc/pages/api/admin/portal/facturas.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

5/5
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-30

Cambio de dominio sin enlaces rotos

Implementado

El sitio vive en codebymike.net; sus duplicados alcanzables (www.codebymike.net y el alias fijo del proyecto en Vercel) redirigen con 308 conservando ruta y query, para no publicar copias indexables del mismo contenido. Las integraciones que llaman a /api NO se redirigen. El dominio anterior (codebymike.tech) salió de la lista el 8 sep 2026: dejó de resolver y una regla para un host inalcanzable solo aparenta cobertura.

Prioridad altasrc/lib/canonical-host.ts (lista única de hosts)src/middleware.ts (destinoCanonicoantes de los guardas) para lo SSRintegrations/canonical-redirect.mjs para lo prerenderizadosrc/lib/site.ts (SITE_ORIGIN para enlaces armados fuera de un request)astro.config.mjs (site)
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)