Historial de decisiones de arquitectura (ADR)
Resumen
Registro de decisiones técnicas significativas del ecosistema zolski.net (Jun 2026). Formato: contexto → opciones → decisión → consecuencias.
ADR-001: Folks como IdP propio vs Auth0/Supabase Auth
Contexto: SSO multi-app en *.zolski.net.
Opciones: delegar a Auth0; Supabase Auth; IdP propio.
Decisión: Folks custom con JWT ES256 y cookies .zolski.net.
Consecuencias: control total de tiers y OAuth linking; costo de mantener auth in-house.
ADR-002: .kal v3pin vs v3 (password Folks)
Contexto: vault cifrado con password implica pérdida al reset Folks. Decisión: v3pin — PIN aleatorio 6 chars, Argon2id browser-only. Consecuencias: UX de PIN extra; zero-knowledge real; migración obligatoria v3→v3pin.
ADR-003: Client-side render dashboard vs SSR processed/
Contexto: plaintext en processed/{id}.json en Railway.
Decisión: KAL_V3_CLIENT_RENDER=1 — historial solo en RAM del browser.
Consecuencias: menor superficie server; más lógica crypto en frontend.
ADR-004: Tier admin como valor vs flag is_admin
Decisión: admin es un tier más en la jerarquía (rank 4), no columna booleana separada.
Consecuencias: un solo modelo para permisos; can_actor_modify_target uniforme.
ADR-005: Soft delete usuarios y tickets
Decisión: deleted_at timestamp en lugar de DELETE físico inmediato.
Consecuencias: auditoría y recuperación; queries filtran deleted_at IS NULL.
ADR-006: CodeMirror 6 vs alternativas (wiki editor)
Decisión: CodeMirror 6 vendored + marked.js + DOMPurify para editor híbrido Desk. Consecuencias: bundle controlado; paridad server/client documentada.
ADR-007: Vendoring vs CDN
Decisión: dependencias frontend críticas (marked, DOMPurify, CodeMirror) en /static/vendor/.
Consecuencias: builds reproducibles; sin SPOF CDN en prod.
ADR-008: Railway/Neon vs self-hosted
Estado: pendiente evaluación 2026 H2. Contexto: costos Railway + Neon vs VPS propio. Decisión actual: mantener Railway compute + Neon Postgres + Cloudflare edge.