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.
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.
6
listas
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
ListoSeis 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.
src/app · src/components
Dominio y reglas
ListoTipos 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.
src/lib/tipos.ts · src/lib/hash.ts · src/lib/geo.ts · src/lib/antisybil.ts
Estado y persistencia
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.
src/lib/repositorio.ts · src/lib/seed.ts · src/components/proveedores/AppProvider.tsx
Capa de cadena (Arbitrum)
ListoInterfaz 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.
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)
Sube foto o video y devuelve un CID. La beta usa un adaptador local que produce un CID determinista desde el hash del archivo.
src/lib/storage/types.ts · src/lib/storage/mock-adapter.ts
Puente con la autoridad
Ruta API que valida el aviso y genera folio para serenazgo, policía o ambulancia. Reenvía a un webhook real si está configurado.
src/app/api/escalamiento/route.ts
Identidad, acceso y revelación selectiva
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.
src/auth.ts · src/lib/identidad.ts · src/components/cuenta/AccesoGoogle.tsx · src/components/cuenta/RevelacionSelectiva.tsx
Agregado comunitario de sismos
ListoCuando 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.
src/lib/sismos.ts · src/components/sismos/AvisoSismo.tsx
Círculo de cuidado
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.
src/lib/circulo.ts · src/lib/circulo-simulacion.ts · src/components/circulo/PanelCirculo.tsx
Despliegue y cabeceras
ListoVercel 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_.
next.config.ts · vercel.json · scripts/preflight-env.mjs · .github/workflows/ci.yml
Gobernanza del desarrollo con IA
ListoBitá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.
src/data/decisiones.json · src/data/arquitectura.json · scripts/validate-data.mjs · scripts/generate-docs.mjs