Arquitectura

Como esta construido esto, que funciona de verdad y que todavia no. Todo sale de los mismos archivos que generan la documentacion del repositorio.

Arb Sepolia

Red vecinal de reporte de seguridad. El vecino reporta en 3 toques desde el celular; la evidencia se sube a IPFS, su hash se ancla en Arbitrum y la red vecinal se entera al instante. Un botón aparte escala a serenazgo o policía. Nadie ve quién reportó salvo que el propio usuario lo autorice o exista una orden judicial verificable.

v0.1.0-beta.2actualizado 2026-08-0911 capas

6

listas

5

simuladas

0

pendientes

Principios

  • Pseudónimo por defecto: la identidad real nunca toca la cadena.
  • El reporte vale porque es verificable, no porque lo firme una institución.
  • Doble ruta: la red vecinal y la autoridad son caminos paralelos, no excluyentes.
  • Lo simulado se etiqueta como simulado, dentro del producto.
  • Toda pieza que otro equipo va a reemplazar vive detrás de una interfaz.
  • La recompensa premia presencia verificable, no tiempo de app abierta.

Capas del sistema

Interfaz mobile-first

Listo

Seis pestañas (la de Círculo solo con sesión iniciada), flujo de reporte en 3 pasos, mapa y panel de arquitectura. Diseñada para una mano, de noche, con prisa.

Next.js 15 (App Router)React 19Tailwind CSS 4

src/app · src/components

Dominio y reglas

Listo

Tipos del reporte, catálogo de categorías, hash canónico, geometría de zonas y política anti-Sybil. Funciones puras, con tests, sin dependencias.

TypeScript estrictoVitest

src/lib/tipos.ts · src/lib/hash.ts · src/lib/geo.ts · src/lib/antisybil.ts

Estado y persistencia

Simulado

Repositorio de reportes con persistencia en el dispositivo, más el índice compartido leído de la cadena en modo arbitrum. Los datos sembrados de demostración existen solo con NEXT_PUBLIC_DATOS_DEMO=1 (ADR-040): en la prueba real la red muestra únicamente reportes reales.

React ContextlocalStorage

src/lib/repositorio.ts · src/lib/seed.ts · src/components/proveedores/AppProvider.tsx

Capa de cadena (Arbitrum)

Listo

Interfaz ChainAdapter: anclar reporte, consultar recompensa, resolver enlaces al explorador, leer el índice compartido. Los tres contratos están desplegados y verificados en Arbitrum Sepolia (2026-08-08) y ya registran reportes reales de la prueba de campo. ArbitrumChainAdapter firma con la wallet embebida de Privy (ADR-050) — o con una inyectada si existe — y el gas llega solo por el grifo automático (ADR-051). Gas medido del anclaje: 216,804 por submitReport. En producción (Vercel) el modo arbitrum se activa al cargar las variables y redesplegar; hasta entonces solo producción sigue en simulado, con el respaldo etiquetado del ADR-049 para quien no tenga firma.

Arbitrum Sepolia (421614)Arbitrum One (42161)viemPrivy (wallet embebida)

src/lib/chain/types.ts · src/lib/chain/mock-adapter.ts · src/lib/chain/arbitrum-adapter.ts · src/lib/chain/proveedor-inyectado.ts · src/lib/chain/eventos.ts · src/lib/chain/redes.ts · src/lib/chain/abis.ts · src/components/proveedores/ProveedorPrivy.tsx

Evidencia (IPFS)

Simulado

Sube foto o video y devuelve un CID. La beta usa un adaptador local que produce un CID determinista desde el hash del archivo.

IPFSPinata (a integrar)

src/lib/storage/types.ts · src/lib/storage/mock-adapter.ts

Puente con la autoridad

Simulado

Ruta API que valida el aviso y genera folio para serenazgo, policía o ambulancia. Reenvía a un webhook real si está configurado.

Next.js Route Handler

src/app/api/escalamiento/route.ts

Identidad, acceso y revelación selectiva

Simulado

Puerta de acceso selectiva con Google (ADR-035, amend de ADR-027): navegar la app es libre, reportar y el circulo exigen sesion. El alias publico se deriva de la cuenta, asi que entrar desde otro telefono devuelve el mismo. La cuenta nunca se muestra a la red ni toca la cadena: es la identidad real que IdentityEscrow custodiaria bajo 2-de-3.

Auth.js v5 (Google)JWT en cookie, sin base de datosPrivy — wallet embebida integrada (ADR-050)IdentityEscrow.sol

src/auth.ts · src/lib/identidad.ts · src/components/cuenta/AccesoGoogle.tsx · src/components/cuenta/RevelacionSelectiva.tsx

Agregado comunitario de sismos

Listo

Cuando dos o más vecinos distintos reportan un sismo en 30 minutos, se muestra el agregado por zona y la intensidad más repetida. Cuenta reportes, no mide sismos: no hay acelerómetros ni detección propia.

Función pura con testsVitest

src/lib/sismos.ts · src/components/sismos/AvisoSismo.tsx

Círculo de cuidado

Simulado

Si alguien comparte su ubicación contigo, avisa cuando ocurre un reporte cerca de esa persona y deja su teléfono a un toque. Es la única parte de la app que exige cuenta, porque maneja teléfonos y ubicaciones de terceros.

Funciones puras con testsNotification APIlocalStorage

src/lib/circulo.ts · src/lib/circulo-simulacion.ts · src/components/circulo/PanelCirculo.tsx

Despliegue y cabeceras

Listo

Vercel con detección automática de Next.js. Cabeceras de seguridad y CSP declaradas en next.config.ts para poder probarlas en local. Un preflight aborta el build si alguien expone un secreto con prefijo NEXT_PUBLIC_.

VercelGitHub ActionsContent-Security-Policy

next.config.ts · vercel.json · scripts/preflight-env.mjs · .github/workflows/ci.yml

Gobernanza del desarrollo con IA

Listo

Bitácora de decisiones validada en CI y renderizada dentro del producto. La arquitectura y los docs se generan del mismo JSON, así no pueden divergir.

JSON validadoscripts de Node

src/data/decisiones.json · src/data/arquitectura.json · scripts/validate-data.mjs · scripts/generate-docs.mjs