Mostrando las entradas para la consulta ACCION CIVIL ordenadas por fecha. Ordenar por relevancia Mostrar todas las entradas
Mostrando las entradas para la consulta ACCION CIVIL ordenadas por fecha. Ordenar por relevancia Mostrar todas las entradas

miércoles, 16 de septiembre de 2026

# 🛸 SISTEMA CONTRADRON MULTICAPA — LYRA NEXUS - INTELIGENCIA LIBRE / PASAIA LAB

 # 🛸 SISTEMA CONTRADRON MULTICAPA — LYRA NEXUS

**Clasificación:** TOP SECRET // PASAIA LAB EYES ONLY
**Referencia:** PL-DRON-ESP-2026-09-16
**Entregable:** Arquitectura de detección, identificación, neutralización y aprendizaje adaptativo en las tres capas esféricas

> ⚠️ **Nota de alcance:** Todo el contenido es un **ejercicio de simulación educativa** con fines de investigación conceptual, docencia y análisis arquitectónico. No es software operativo ni diseño de armas real. Su valor es didáctico: sirve para estudiar sistemas distribuidos, IA de borde, fusión multisensor y aprendizaje adaptativo aplicados al ecosistema LYRA NEXUS.

---




## 🎯 1. Taxonomía de Amenazas por Altitud

La defensa contradron se organiza por **categorías de altitud**, cada una con cinemática, firma y técnicas de neutralización distintas.

| Categoría | Rango Altitud | Velocidad Típica | Firma Dominante | Capa Responsable |
| :--- | :--- | :--- | :--- | :--- |
| **Nano/Micro** | < 100 m | < 60 km/h | Acústica, RF, óptica | Superficie / A1 (borde) |
| **Mini táctico** | 100 m – 3 km | 60–150 km/h | RF, radar doppler | A1 (AINGERU) |
| **MALE/HALE** | 10 – 20 km | 300–700 km/h | Radar, IR, ELINT | A1 → Z2 |
| **HAPS estratosférico** | 15 – 25 km | 100–200 km/h | Óptica, IR persistente | A1 → Z2 |
| **Transatmosférico** | 25 – 100 km | Mach 5–20 | IR de alta temperatura, radar de banda ancha | Z2 (ZAINDU) |
| **Orbital** | 160 – 2.000 km | 7,5–8 km/s | Radar de espacio profundo, óptica | Z2 → I3 |
| **Cislunar** | 36.000 – 100.000 km | Variable | Óptica de gran apertura, perturbación gravitatoria | I3 (ILARGI) |

Cada categoría activa un **protocolo de neutralización** distinto y **una ruta de aprendizaje** específica.

---

## 🏗️ 2. Arquitectura del Sistema Contradron

```
                    ┌───────────────────────────────────────────────┐
                    │  NÚCLEO DE APRENDIZAJE · LYRA-NEXUS-DL        │
                    │  Modelo adaptativo global · Reentrenamiento   │
                    └───────────────┬───────────────────────────────┘
                                    │  Actualización de pesos
        ┌───────────────────────────┼───────────────────────────────┐
        │                           │                               │
    ┌───┴────┐              ┌───────┴───────┐              ┌───────┴────┐
    │  A1    │              │      Z2       │              │     I3     │
    │AINGERU │◀── custodia ─│    ZAINDU     │◀── custodia ─│   ILARGI   │
    │ LEO    │─── alerta ──▶│   MEO/GEO     │─── alerta ──▶│  Cislunar  │
    └───┬────┘              └───────┬───────┘              └───────┬────┘
        │                           │                               │
   ┌────┴─────┐              ┌──────┴──────┐              ┌─────────┴────────┐
   │ Detector │              │  Detector   │              │    Detector      │
   │Clasif.IA │              │  Clasif.IA  │              │    Clasif.IA     │
   │Neutraliz.│              │  Neutraliz. │              │    Neutraliz.    │
   └──────────┘              └─────────────┘              └──────────────────┘
```

### Árbol de archivos ampliado

```
pasaia_space/
├── (módulos previos: nomenclatura, blockchain_capa, etc.)
├── dron_taxonomia.py          # Categorías, altitudes, cinemática
├── detector_multicapa.py      # Detección por firma multisensor
├── clasificador_ia_dron.py    # MLP + reglas para identificación
├── neutralizador.py           # Protocolos de neutralización
├── aprendizaje_dron.py        # Memoria de encuentros y reentrenamiento
└── sistema_contradron.py      # Orquestador del ciclo defensivo
```

---

## 📄 3. `dron_taxonomia.py` — Taxonomía y Firmas

```python
"""
dron_taxonomia.py — PASAIA LAB / LYRA NEXUS
Definición de categorías de drones, sus firmas y sus protocolos de respuesta.
"""

from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, List


class CategoriaDron(Enum):
    NANO_MICRO = "NANO_MICRO"
    MINI_TACTICO = "MINI_TACTICO"
    MALE_HALE = "MALE_HALE"
    HAPS = "HAPS"
    TRANSATMOSFERICO = "TRANSATMOSFERICO"
    ORBITAL = "ORBITAL"
    CISLUNAR = "CISLUNAR"


@dataclass(frozen=True)
class FirmaDron:
    """Características observables de una categoría de dron."""
    rf_presente: bool
    ir_intensidad: float          # 0..1
    radar_rcs_m2: float           # sección radar equivalente
    optica_contraste: float       # 0..1
    acustica_db: float
    velocidad_max_kmh: float
    altitud_operativa_km: tuple


@dataclass(frozen=True)
class ProtocoloNeutralizacion:
    """Conjunto de acciones escalonadas de neutralización."""
    nivel_1: str                  # Disuasión / advertencia
    nivel_2: str                  # Inhibición no cinética
    nivel_3: str                  # Neutralización cinética
    nivel_4: str                  # Neutralización de emergencia
    capa_autorizada: str          # Capa con autoridad primaria
    tiempo_max_decision_s: float


TAXONOMIA: Dict[CategoriaDron, dict] = {
    CategoriaDron.NANO_MICRO: {
        "altitud_km": (0.0, 0.1),
        "firma": FirmaDron(True, 0.2, 0.01, 0.7, 65.0, 60.0, (0.0, 0.1)),
        "protocolo": ProtocoloNeutralizacion(
            "Alerta acústica",
            "Inhibición RF dirigida",
            "Captura con red / dron interceptor",
            "Láser de baja potencia",
            "A1",
            5.0,
        ),
    },
    CategoriaDron.MINI_TACTICO: {
        "altitud_km": (0.1, 3.0),
        "firma": FirmaDron(True, 0.35, 0.05, 0.6, 50.0, 150.0, (0.1, 3.0)),
        "protocolo": ProtocoloNeutralizacion(
            "Alerta radar",
            "Suplantación GNSS",
            "Interceptor cinético ligero",
            "Láser táctico",
            "A1",
            8.0,
        ),
    },
    CategoriaDron.MALE_HALE: {
        "altitud_km": (10.0, 20.0),
        "firma": FirmaDron(True, 0.55, 1.5, 0.5, 20.0, 700.0, (10.0, 20.0)),
        "protocolo": ProtocoloNeutralizacion(
            "Alerta radar de largo alcance",
            "Ataque cibernético al enlace C2",
            "Interceptor de altitud media",
            "Láser de alta energía",
            "Z2",
            15.0,
        ),
    },
    CategoriaDron.HAPS: {
        "altitud_km": (15.0, 25.0),
        "firma": FirmaDron(True, 0.4, 0.5, 0.8, 0.0, 200.0, (15.0, 25.0)),
        "protocolo": ProtocoloNeutralizacion(
            "Alerta óptica persistente",
            "Inhibición de enlace satelital",
            "Interceptor de gran altitud",
            "Láser de alta energía desde A1",
            "Z2",
            20.0,
        ),
    },
    CategoriaDron.TRANSATMOSFERICO: {
        "altitud_km": (25.0, 100.0),
        "firma": FirmaDron(True, 0.9, 3.0, 0.3, 0.0, 6000.0, (25.0, 100.0)),
        "protocolo": ProtocoloNeutralizacion(
            "Alerta IR de alta temperatura",
            "Guerra electrónica de banda ancha",
            "Interceptor hipersónico",
            "Láser orbital desde Z2",
            "Z2",
            8.0,
        ),
    },
    CategoriaDron.ORBITAL: {
        "altitud_km": (160.0, 2000.0),
        "firma": FirmaDron(True, 0.6, 2.0, 0.9, 0.0, 28000.0, (160.0, 2000.0)),
        "protocolo": ProtocoloNeutralizacion(
            "Alerta de radar espacial",
            "Ataque ciber al bus de datos",
            "Interceptor orbital cinético",
            "Láser orbital desde I3",
            "I3",
            12.0,
        ),
    },
    CategoriaDron.CISLUNAR: {
        "altitud_km": (36000.0, 100000.0),
        "firma": FirmaDron(False, 0.3, 1.0, 0.95, 0.0, 4000.0, (36000.0, 100000.0)),
        "protocolo": ProtocoloNeutralizacion(
            "Alerta óptica de gran apertura",
            "Interrogación láser de identidad",
            "Interceptor autónomo de espacio profundo",
            "Brazo robótico de captura",
            "I3",
            90.0,
        ),
    },
}


def clasificar_por_altitud(altitud_km: float) -> List[CategoriaDron]:
    """Devuelve las categorías compatibles con una altitud dada."""
    return [
        cat for cat, info in TAXONOMIA.items()
        if info["altitud_km"][0] <= altitud_km <= info["altitud_km"][1]
    ]
```

---

## 📄 4. `detector_multicapa.py` — Detección por Firma Multisensor

```python
"""
detector_multicapa.py — PASAIA LAB / LYRA NEXUS
Fusión de sensores (RF, IR, radar, óptica, acústica) en cada capa.
"""

import math
import random
import time
from dataclasses import dataclass
from typing import Dict, List, Optional

from dron_taxonomia import CategoriaDron, TAXONOMIA


@dataclass
class LecturaSensor:
    """Vector de medidas normalizadas de un instante de observación."""
    rf: float          # 0..1 energía RF detectada
    ir: float          # 0..1 intensidad infrarroja
    radar: float       # 0..1 eco radar normalizado
    optica: float      # 0..1 contraste óptico
    acustica: float    # 0..1 nivel acústico normalizado
    altitud_km: float
    velocidad_kmh: float
    timestamp: float

    def vector(self) -> List[float]:
        return [self.rf, self.ir, self.radar,
                self.optica, self.acustica,
                self.altitud_km / 100.0,
                self.velocidad_kmh / 28000.0]


class DetectorMulticapa:
    """
    Detector que combina firmas de sensores en cada capa esférica.
    Aplica umbrales de detección específicos por categoría.
    """

    UMBRALES = {
        # capa: (rf_min, ir_min, radar_min, optica_min)
        "A1": (0.15, 0.10, 0.05, 0.20),
        "Z2": (0.10, 0.15, 0.20, 0.15),
        "I3": (0.00, 0.05, 0.10, 0.40),
    }

    def __init__(self, capa: str, ruido_base: float = 0.03):
        self.capa = capa
        self.ruido = ruido_base
        self.detecciones: List[dict] = []

    # -------------------------------------------------- Simulación de sensor
    def simular_lectura(self, categoria: CategoriaDron,
                        rng: random.Random) -> LecturaSensor:
        """Genera una lectura coherente con la firma de la categoría."""
        f = TAXONOMIA[categoria]["firma"]
        alt_min, alt_max = f.altitud_operativa_km

        return LecturaSensor(
            rf=min(1.0, max(0.0, (1.0 if f.rf_presente else 0.0)
                           * 0.7 + rng.uniform(-self.ruido, self.ruido))),
            ir=min(1.0, max(0.0, f.ir_intensidad + rng.uniform(-self.ruido, self.ruido))),
            radar=min(1.0, max(0.0, math.tanh(f.radar_rcs_m2)
                                + rng.uniform(-self.ruido, self.ruido))),
            optica=min(1.0, max(0.0, f.optica_contraste
                                + rng.uniform(-self.ruido, self.ruido))),
            acustica=min(1.0, max(0.0, f.acustica_db / 100.0
                                  + rng.uniform(-self.ruido, self.ruido))),
            altitud_km=rng.uniform(alt_min, alt_max),
            velocidad_kmh=f.velocidad_max_kmh * rng.uniform(0.3, 1.0),
            timestamp=time.time(),
        )

    # -------------------------------------------------- Umbrales
    def _supera_umbral(self, lectura: LecturaSensor) -> bool:
        rf_min, ir_min, radar_min, optica_min = self.UMBRALES[self.capa]
        score = (
            (lectura.rf >= rf_min) * 1.0 +
            (lectura.ir >= ir_min) * 1.0 +
            (lectura.radar >= radar_min) * 1.0 +
            (lectura.optica >= optica_min) * 1.0
        )
        return score >= 2.0  # al menos 2 sensores confirman

    # -------------------------------------------------- Ciclo de detección
    def escanear(self, rng: random.Random,
                 candidatos: Optional[List[CategoriaDron]] = None) -> List[dict]:
        """Escanea el volumen de la capa y devuelve detecciones candidatas."""
        candidatos = candidatos or list(TAXONOMIA.keys())
        detecciones = []

        for cat in candidatos:
            alt_min, alt_max = TAXONOMIA[cat]["altitud_km"]
            # Si la categoría no opera en esta capa, la ignoramos
            if self.capa == "A1" and alt_min > 2000:
                continue
            if self.capa == "Z2" and (alt_max < 2000 or alt_min > 36000):
                continue
            if self.capa == "I3" and alt_max < 36000:
                continue

            # Probabilidad de que haya un dron de esta categoría
            if rng.random() > 0.25:
                continue

            lectura = self.simular_lectura(cat, rng)
            if self._supera_umbral(lectura):
                det = {
                    "id_deteccion": f"{self.capa}-{int(lectura.timestamp*1000)%10**6}",
                    "capa": self.capa,
                    "categoria_probable": cat.value,
                    "lectura": lectura.vector(),
                    "altitud_km": round(lectura.altitud_km, 3),
                    "velocidad_kmh": round(lectura.velocidad_kmh, 1),
                    "timestamp": lectura.timestamp,
                }
                detecciones.append(det)
                self.detecciones.append(det)

        return detecciones
```

---

## 📄 5. `clasificador_ia_dron.py` — Identificación con IA

```python
"""
clasificador_ia_dron.py — PASAIA LAB / LYRA NEXUS
Clasificador híbrido: MLP + reglas cinemáticas.
Devuelve la categoría más probable y un nivel de confianza.
"""

import math
import random
from typing import Dict, List, Tuple

from dron_taxonomia import CategoriaDron, TAXONOMIA


class ClasificadorIA:
    """
    Clasificador con dos capas:
      1) MLP de 7→16→12→7 (softmax) para categoría.
      2) Filtro de reglas cinemáticas para descartar imposibles.
    """

    def __init__(self, semilla: int = 2026):
        self.rng = random.Random(semilla)
        self.categorias = list(CategoriaDron)
        # 7 entradas, 16 y 12 ocultas, N salidas
        self.W1 = [[self.rng.uniform(-0.4, 0.4) for _ in range(7)] for _ in range(16)]
        self.b1 = [0.0] * 16
        self.W2 = [[self.rng.uniform(-0.4, 0.4) for _ in range(16)] for _ in range(12)]
        self.b2 = [0.0] * 12
        self.W3 = [[self.rng.uniform(-0.4, 0.4) for _ in range(12)]
                   for _ in self.categorias]
        self.b3 = [0.0] * len(self.categorias)

    # -------------------------------------------------- Activaciones
    @staticmethod
    def _relu(x: float) -> float:
        return x if x > 0.0 else 0.0

    @staticmethod
    def _softmax(z: List[float]) -> List[float]:
        m = max(z)
        e = [math.exp(zi - m) for zi in z]
        s = sum(e)
        return [ei / s for ei in e]

    # -------------------------------------------------- Forward
    def _forward(self, x: List[float]) -> List[float]:
        h1 = [self._relu(sum(w * xi for w, xi in zip(fila, x)) + b)
              for fila, b in zip(self.W1, self.b1)]
        h2 = [self._relu(sum(w * hi for w, hi in zip(fila, h1)) + b)
              for fila, b in zip(self.W2, self.b2)]
        z3 = [sum(w * hi for w, hi in zip(fila, h2)) + b
              for fila, b in zip(self.W3, self.b3)]
        return self._softmax(z3)

    # -------------------------------------------------- Reglas cinemáticas
    @staticmethod
    def _compatible(categoria: CategoriaDron,
                    altitud_km: float, velocidad_kmh: float) -> bool:
        alt_min, alt_max = TAXONOMIA[categoria]["altitud_km"]
        v_max = TAXONOMIA[categoria]["firma"].velocidad_max_kmh
        return (alt_min * 0.7 <= altitud_km <= alt_max * 1.3
                and velocidad_kmh <= v_max * 1.2)

    # -------------------------------------------------- Clasificación
    def clasificar(self, lectura_vector: List[float],
                   altitud_km: float, velocidad_kmh: float) -> Dict:
        probs = self._forward(lectura_vector)

        # Filtro cinemático: eliminar categorías incompatibles
        for i, cat in enumerate(self.categorias):
            if not self._compatible(cat, altitud_km, velocidad_kmh):
                probs[i] = 0.0

        total = sum(probs)
        if total <= 0.0:
            # fallback: activar por reglas puras
            posibles = [
                cat for cat in self.categorias
                if self._compatible(cat, altitud_km, velocidad_kmh)
            ]
            if not posibles:
                return {"categoria": None, "confianza": 0.0,
                        "alternativas": [], "metodo": "reglas"}
            cat = posibles[0]
            return {
                "categoria": cat.value,
                "confianza": 0.5,
                "alternativas": [c.value for c in posibles[1:]],
                "metodo": "reglas",
            }

        probs = [p / total for p in probs]
        idx = max(range(len(probs)), key=lambda i: probs[i])
        alternativas = sorted(
            [(self.categorias[i].value, probs[i])
             for i in range(len(probs)) if i != idx],
            key=lambda x: -x[1],
        )[:3]

        return {
            "categoria": self.categorias[idx].value,
            "confianza": round(probs[idx], 4),
            "alternativas": [(c, round(p, 4)) for c, p in alternativas],
            "metodo": "mlp+reglas",
        }
```

---

## 📄 6. `neutralizador.py` — Protocolos de Neutralización

```python
"""
neutralizador.py — PASAIA LAB / LYRA NEXUS
Selección y ejecución simulada del protocolo de neutralización.
"""

import random
import time
from typing import Dict

from dron_taxonomia import CategoriaDron, TAXONOMIA


class Neutralizador:
    """
    Aplica el protocolo de neutralización correspondiente a la categoría
    y registra el resultado. La eficacia se simula con probabilidades
    dependientes del nivel de confianza de la clasificación.
    """

    def __init__(self, capa: str):
        self.capa = capa
        self.acciones: list[dict] = []

    # -------------------------------------------------- Selección de nivel
    @staticmethod
    def _nivel_optimo(confianza: float, distancia_km: float) -> int:
        """Determina el nivel de respuesta según confianza y distancia."""
        if confianza < 0.4:
            return 1
        if confianza < 0.6:
            return 2
        if distancia_km < 5.0:
            return 4
        if confianza < 0.85:
            return 2
        return 3

    # -------------------------------------------------- Eficacia
    @staticmethod
    def _prob_exito(nivel: int, categoria: CategoriaDron) -> float:
        """Probabilidad de éxito según nivel y categoría."""
        tabla = {
            CategoriaDron.NANO_MICRO:         {1: 0.10, 2: 0.55, 3: 0.90, 4: 0.95},
            CategoriaDron.MINI_TACTICO:       {1: 0.10, 2: 0.50, 3: 0.85, 4: 0.95},
            CategoriaDron.MALE_HALE:          {1: 0.05, 2: 0.40, 3: 0.80, 4: 0.90},
            CategoriaDron.HAPS:               {1: 0.05, 2: 0.35, 3: 0.75, 4: 0.85},
            CategoriaDron.TRANSATMOSFERICO:   {1: 0.02, 2: 0.25, 3: 0.70, 4: 0.80},
            CategoriaDron.ORBITAL:            {1: 0.02, 2: 0.20, 3: 0.65, 4: 0.75},
            CategoriaDron.CISLUNAR:           {1: 0.01, 2: 0.15, 3: 0.60, 4: 0.70},
        }
        return tabla.get(categoria, {1: 0.05, 2: 0.3, 3: 0.7, 4: 0.8})[nivel]

    # -------------------------------------------------- Ejecución
    def neutralizar(self, categoria: CategoriaDron, confianza: float,
                    distancia_km: float, rng: random.Random) -> Dict:
        protocolo = TAXONOMIA[categoria]["protocolo"]
        nivel = self._nivel_optimo(confianza, distancia_km)

        acciones_nivel = {
            1: protocolo.nivel_1,
            2: protocolo.nivel_2,
            3: protocolo.nivel_3,
            4: protocolo.nivel_4,
        }

        prob_exito = self._prob_exito(nivel, categoria)
        exito = rng.random() < prob_exito

        resultado = {
            "capa": self.capa,
            "categoria": categoria.value,
            "nivel_aplicado": nivel,
            "accion": acciones_nivel[nivel],
            "prob_exito": round(prob_exito, 3),
            "exito": exito,
            "timestamp": time.time(),
            "tiempo_max_decision_s": protocolo.tiempo_max_decision_s,
            "autoridad": protocolo.capa_autorizada,
        }
        self.acciones.append(resultado)
        return resultado

    # -------------------------------------------------- Resumen
    def resumen(self) -> Dict:
        total = len(self.acciones)
        exitos = sum(1 for a in self.acciones if a["exito"])
        return {
            "capa": self.capa,
            "neutralizaciones_totales": total,
            "exitos": exitos,
            "tasa_exito": round(exitos / total, 3) if total else 0.0,
        }
```

---

## 📄 7. `aprendizaje_dron.py` — Memoria y Reentrenamiento Adaptativo

```python
"""
aprendizaje_dron.py — PASAIA LAB / LYRA NEXUS
Memoria de encuentros. Refina los umbrales y probabilidades con cada
nueva observación, distribuyendo el conocimiento entre capas.
"""

import math
from collections import defaultdict
from typing import Dict, List, Tuple


class NucleoAprendizaje:
    """
    Memoria compartida de encuentros.
      - Registra (categoria, resultado, nivel, capa).
      - Ajusta empíricamente las probabilidades de éxito por categoría.
      - Genera actualizaciones de pesos ligeras (bandit contextal).
    """

    def __init__(self):
        self.registros: List[dict] = []
        # (categoria, nivel) -> [exitos, intentos]
        self._tabla: Dict[Tuple[str, int], List[int]] = defaultdict(lambda: [0, 0])
        # por capa
        self._por_capa: Dict[str, Dict[str, int]] = defaultdict(
            lambda: {"total": 0, "exitos": 0}
        )

    # -------------------------------------------------- Registro
    def registrar_encuentro(self, categoria: str, nivel: int,
                            exito: bool, capa: str) -> None:
        self.registros.append({
            "categoria": categoria, "nivel": nivel,
            "exito": exito, "capa": capa,
        })
        clave = (categoria, nivel)
        self._tabla[clave][1] += 1
        self._tabla[clave][0] += 1 if exito else 0

        self._por_capa[capa]["total"] += 1
        self._por_capa[capa]["exitos"] += 1 if exito else 0

    # -------------------------------------------------- Estimación empírica
    def prob_empirica(self, categoria: str, nivel: int,
                      alpha: float = 1.0, beta: float = 1.0) -> float:
        """Suavizado de Laplace para robustez con pocos datos."""
        exitos, intentos = self._tabla.get((categoria, nivel), [0, 0])
        return (exitos + alpha) / (intentos + alpha + beta)

    # -------------------------------------------------- Recomendación
    def recomendar_nivel(self, categoria: str, niveles: List[int]) -> int:
        """Devuelve el nivel con mayor probabilidad empírica de éxito."""
        if not niveles:
            return 2
        mejor = max(
            niveles,
            key=lambda n: self.prob_empirica(categoria, n)
        )
        return mejor

    # -------------------------------------------------- Distribución
    def generar_actualizacion_pesos(self) -> Dict[str, Dict[int, float]]:
        """
        Genera un delta de probabilidades por (categoría, nivel) para
        transferir al clasificador y al neutralizador de cada capa.
        """
        delta: Dict[str, Dict[int, float]] = defaultdict(dict)
        for (cat, nivel), (exitos, intentos) in self._tabla.items():
            if intentos == 0:
                continue
            p_emp = (exitos + 1) / (intentos + 2)
            delta[cat][nivel] = round(p_emp, 3)
        return dict(delta)

    # -------------------------------------------------- Resumen
    def resumen(self) -> Dict:
        return {
            "total_encuentros": len(self.registros),
            "categorias_unicas": len({r["categoria"] for r in self.registros}),
            "por_capa": {k: dict(v) for k, v in self._por_capa.items()},
            "tabla_empirica": {
                f"{cat}|n{nivel}": f"{exitos}/{intentos}"
                for (cat, nivel), (exitos, intentos) in self._tabla.items()
            },
        }
```

---

## 📄 8. `sistema_contradron.py` — Orquestador del Ciclo Defensivo

```python
"""
sistema_contradron.py — PASAIA LAB / LYRA NEXUS
Orquestador del ciclo defensivo en las tres capas.
Integra detección, clasificación, neutralización y aprendizaje.
"""

import random
import json
from typing import Dict, List

from nomenclatura import CapaID, CAPAS
from dron_taxonomia import CategoriaDron, TAXONOMIA, clasificar_por_altitud
from detector_multicapa import DetectorMulticapa
from clasificador_ia_dron import ClasificadorIA
from neutralizador import Neutralizador
from aprendizaje_dron import NucleoAprendizaje
from blockchain_capa import Transaccion


class SistemaContraDron:
    """
    Sistema defensivo multicapa. Cada capa tiene su propio detector,
    clasificador y neutralizador, y comparte el núcleo de aprendizaje.
    """

    def __init__(self, semilla: int = 2026):
        self.rng = random.Random(semilla)
        self.capas: Dict[str, dict] = {}
        self.aprendizaje = NucleoAprendizaje()
        self.registro_global: List[dict] = []

        for capa in ("A1", "Z2", "I3"):
            self.capas[capa] = {
                "detector": DetectorMulticapa(capa),
                "clasificador": ClasificadorIA(semilla=hash(capa) % 10_000),
                "neutralizador": Neutralizador(capa),
            }

    # -------------------------------------------------- Pipeline de una capa
    def procesar_capa(self, capa: str, intranet_capa=None) -> Dict:
        modulo = self.capas[capa]
        detector = modulo["detector"]
        clasificador = modulo["clasificador"]
        neutralizador = modulo["neutralizador"]

        detecciones = detector.escanear(self.rng)
        resultados = []

        for det in detecciones:
            cat_prop = det["categoria_probable"]
            cat_enum = next(
                (c for c in CategoriaDron if c.value == cat_prop), None
            )
            if cat_enum is None:
                continue

            clas = clasificador.clasificar(
                det["lectura"], det["altitud_km"], det["velocidad_kmh"]
            )
            if clas["categoria"] is None:
                continue

            # Recomendación del núcleo de aprendizaje
            niveles_disponibles = [1, 2, 3, 4]
            nivel_rec = self.aprendizaje.recomendar_nivel(
                clas["categoria"], niveles_disponibles
            )

            distancia = self.rng.uniform(1.0, 200.0)
            neut = neutralizador.neutralizar(
                next(c for c in CategoriaDron if c.value == clas["categoria"]),
                clas["confianza"], distancia, self.rng,
            )

            # Registrar en el núcleo de aprendizaje
            self.aprendizaje.registrar_encuentro(
                clas["categoria"], neut["nivel_aplicado"],
                neut["exito"], capa,
            )

            # Registrar en la blockchain de la capa (si se proporciona)
            if intranet_capa is not None:
                tx = Transaccion(
                    emisor=f"SISTEMA-CONTRADRON-{capa}",
                    tipo="ALERTA" if neut["exito"] else "ANOMALIA",
                    payload={
                        "categoria": clas["categoria"],
                        "confianza": clas["confianza"],
                        "nivel": neut["nivel_aplicado"],
                        "accion": neut["accion"],
                        "exito": neut["exito"],
                    },
                )
                intranet_capa.cadena.añadir_transaccion(tx)

            registro = {
                "capa": capa,
                "id_deteccion": det["id_deteccion"],
                "categoria_identificada": clas["categoria"],
                "confianza": clas["confianza"],
                "altitud_km": det["altitud_km"],
                "velocidad_kmh": det["velocidad_kmh"],
                "nivel_neutralizacion": neut["nivel_aplicado"],
                "accion": neut["accion"],
                "exito": neut["exito"],
                "nivel_recomendado_por_aprendizaje": nivel_rec,
            }
            resultados.append(registro)
            self.registro_global.append(registro)

        return {
            "capa": capa,
            "detecciones": len(detecciones),
            "resultados": resultados,
            "resumen_neutralizador": neutralizador.resumen(),
        }

    # -------------------------------------------------- Ciclo completo
    def ejecutar_ciclo_completo(self, intranets: Dict[str, object]) -> Dict:
        resumen_capas = {}
        for capa in ("A1", "Z2", "I3"):
            intranet = intranets.get(capa)
            resumen_capas[capa] = self.procesar_capa(capa, intranet)

        delta = self.aprendizaje.generar_actualizacion_pesos()
        return {
            "capas": resumen_capas,
            "delta_aprendizaje": delta,
            "resumen_aprendizaje": self.aprendizaje.resumen(),
        }

    # -------------------------------------------------- Resumen
    def resumen(self) -> Dict:
        return {
            "total_encuentros": len(self.registro_global),
            "por_capa": {
                c: sum(1 for r in self.registro_global if r["capa"] == c)
                for c in ("A1", "Z2", "I3")
            },
            "exitos": sum(1 for r in self.registro_global if r["exito"]),
        }


# -------------------------------------------------- Ejecución directa
if __name__ == "__main__":
    print("=" * 78)
    print("  PASAIA LAB · SISTEMA CONTRADRON MULTICAPA · LYRA NEXUS")
    print("  Clasificación: TOP SECRET // PASAIA LAB EYES ONLY")
    print("=" * 78)

    sistema = SistemaContraDron(semilla=2026)

    # Simulación sin intranets (modo aislado)
    for capa in ("A1", "Z2", "I3"):
        resultado = sistema.procesar_capa(capa)
        print(f"\n▶ Capa {capa} — detecciones: {resultado['detecciones']}")
        for r in resultado["resultados"]:
            estado = "✔ NEUTRALIZADO" if r["exito"] else "✘ FUGADO"
            print(f"   · {r['categoria_identificada']:<18} "
                  f"conf={r['confianza']:.2f} "
                  f"alt={r['altitud_km']:>8.2f} km "
                  f"nivel={r['nivel_neutralizacion']} "
                  f"{estado}")

    print("\n" + "-" * 78)
    print("RESUMEN GLOBAL DE APRENDIZAJE")
    print("-" * 78)
    print(json.dumps(sistema.resumen(), indent=2, ensure_ascii=False))
    print(json.dumps(sistema.aprendizaje.resumen(), indent=2, ensure_ascii=False))
    print("\n" + "=" * 78)
    print("  SIMULACIÓN COMPLETADA · PASAIA LAB · 16/09/2026")
    print("=" * 78)
```

---

## ▶️ 9. Ejecución

```bash
# Dentro del directorio pasaia_space/
python3 sistema_contradron.py
```

**Salida esperada:** un listado por capa de las detecciones simuladas, con la categoría identificada, la confianza, la altitud, el nivel de neutralización aplicado y el resultado. Al final, el resumen del núcleo de aprendizaje con las probabilidades empíricas por (categoría, nivel).

---

## 🎨 10. Prompt para el Certificado Visual

> *"Certificado técnico de estilo **documento de inteligencia clasificado con diagrama de sistemas**, formato vertical (9:16), resolución 8K.*
>
> * **Fondo**: Espacio profundo con la Tierra en la base. Tres anillos esféricos concéntricos de luz —cian (AINGERU/LEO), azul (ZAINDU/MEO-GEO) y dorado (ILARGI/Cislunar)— con nodos luminosos conectados por líneas de datos. En el centro de cada anillo, un **icono de radar** con un dron estilizado siendo detectado.*
>
> * **Cabecera**: Franja roja superior con **'TOP SECRET // PASAIA LAB EYES ONLY'**. Título en serif: **'SISTEMA CONTRADRON MULTICAPA'**, subtítulo **'LYRA NEXUS · DETECCIÓN · IDENTIFICACIÓN · NEUTRALIZACIÓN · APRENDIZAJE'**.*
>
> * **Cuerpo**: Diagrama esquemático con las tres capas etiquetadas y, en cada una, cuatro iconos de proceso en secuencia: (1) **radar** (detección), (2) **cerebro digital** (identificación IA), (3) **rayo** (neutralización), (4) **bucle de flechas** (aprendizaje). En el centro, un **hexágono de código** con fragmentos de Python visibles. Debajo, una tabla con las categorías de drones (NANO, MINI, MALE/HALE, HAPS, TRANSATMOSFÉRICO, ORBITAL, CISLUNAR) y su capa responsable.*
>
> * **Sellos**: Marca de agua **'CONFIDENCIAL'** en diagonal. Sello de cera digital con el logo de **PASAIA LAB**. Código QR inferior derecho.*
>
> * **Pie institucional**: Franja azul oscuro con los logos de **PASAIA LAB · INTELIGENCIA LIBRE · ACCIÓN CIVIL DIGITAL · DEEPSEEK IA – ASESOR INTELIGENTE** y la fecha **16/09/2026**.*
>
> * **Paleta**: azul oscuro, negro, cian, dorado y rojo. Tipografía serif para títulos y monoespaciada para referencias."*

---

## 🎨 11. Prompt para la Imagen de las Tres Capas en Acción

> *"Ilustración de estilo **infografía técnica cinematográfica**, formato horizontal panorámico (16:9), resolución 8K, que muestra las tres capas esféricas del sistema LYRA NEXUS detectando, identificando, archivando y destruyendo un dron hostil en tiempo real.*
>
> * **Composición general**: Un corte transversal del espacio orbital con la Tierra en la parte inferior. Tres anillos esféricos concéntricos, cada uno con su propia escena de acción:*
>
> * **Anillo inferior — AINGERU (LEO, 160–2.000 km)**: Un **enjambre de nanosatélites** en órbita baja, con haces de radar y sensores ópticos apuntando hacia un **dron transatmosférico** que asciende desde la atmósfera. El dron está iluminado por un **haz de luz cian** (detección), con un **icono de interrogación** sobre él (identificación en curso). Un **interceptor cinético** se aproxima desde la derecha.*
>
> * **Anillo intermedio — ZAINDU (MEO/GEO, 2.000–36.000 km)**: Una **constelación de satélites geoestacionarios** con antenas parabólicas. Uno de ellos emite un **haz de luz azul** que atraviesa el espacio hacia el dron, marcándolo con un **símbolo de cruz** (objetivo confirmado). Una **línea de datos** conecta este anillo con el inferior, mostrando la transferencia de custodia.*
>
> * **Anillo superior — ILARGI (Cislunar, 36.000–100.000 km)**: Un **observatorio de gran apertura** con un espejo segmentado, apuntando hacia el dron. Una **línea de luz dorada** desciende desde este anillo, convergiendo con los otros dos haces sobre el dron.*
>
> * **El Dron**: En el centro de la imagen, un **dron hostil de diseño futurista**, atrapado en el punto de convergencia de los tres haces (cian, azul, dorado). Su estructura muestra **grietas y daños** por la acción de los sistemas de neutralización. A su alrededor, **fragmentos de datos** flotan (códigos binarios, hashes, iconos de blockchain) que representan el **archivo del encuentro** en las cadenas de bloques.*
>
> * **Elementos de Apoyo**: En la esquina inferior derecha, un **panel de control holográfico** muestra el ciclo completo: **'DETECTADO → IDENTIFICADO → ARCHIVADO → NEUTRALIZADO'** con marcas de verificación verdes. En la esquina inferior izquierda, un **sello de PASAIA LAB** con el texto **'LYRA NEXUS · SISTEMA CONTRADRON'**.*
>
> * **Estilo y Formato**: Ilustración técnica con acabado de infografía de alta gama. Colores: azul oscuro (espacio), cian (AINGERU), azul (ZAINDU), dorado (ILARGI), rojo (alerta/neutralización), verde (éxito). Iluminación dramática que resalta los haces de luz y la silueta del dron. Formato horizontal 16:9."*

---



## 🏛️ 12. CERTIFICACIÓN

**Nº de Registro:** PL-DRON-ESP-2026-09-16
**Fecha:** 16 de septiembre de 2026 · **Lugar:** Pasaia (Gipuzkoa), Euskadi

Se certifica que el presente **Sistema Contradron Multicapa** ha sido diseñado y desarrollado por **PASAIA LAB**, con la colaboración de **INTELIGENCIA LIBRE**, **ACCIÓN CIVIL DIGITAL** y **DeepSeek IA – Asesor Inteligente**, bajo la clasificación **TOP SECRET**, como parte del ecosistema **LYRA NEXUS**.

**Componentes certificados:**
- Taxonomía de amenazas por altitud (7 categorías).
- Detector multisensor con umbrales por capa.
- Clasificador híbrido MLP + reglas cinemáticas.
- Neutralizador con 4 niveles de respuesta escalonada.
- Núcleo de aprendizaje adaptativo con suavizado de Laplace.
- Integración con las cadenas de bloques AINGERU, ZAINDU e ILARGI.

**Firmado:**
- **PASAIA LAB** — Dirección de Arquitectura Estratégica
- **INTELIGENCIA LIBRE** — Validación Metodológica
- **ACCIÓN CIVIL DIGITAL** — Relevancia Social y Educativa
- **DeepSeek IA** — Asistencia Técnica y Estructuración de Código

---

> ⚠️ **Recordatorio final:** Este sistema es un **ejercicio de simulación y diseño arquitectónico** con fines educativos, divulgativos y de investigación conceptual. No es software operativo, no está destinado a uso militar real y no debe presentarse como capacidad existente. Su valor reside en servir de **material didáctico** para el estudio de sistemas distribuidos, IA de borde, fusión multisensor, aprendizaje adaptativo y cadenas de bloques permissionadas — competencias directamente aplicables al ecosistema **LYRA NEXUS** y a proyectos civiles de defensa aérea, gestión de tráfico no tripulado y seguridad de infraestructuras críticas.

 

 

 
 

 
 
 
 

 


 

martes, 15 de septiembre de 2026

**INFORME SECRETO DE INTELIGENCIA ESTRATÉGICA** - ARQUITECTURA DE CONTROL DIGITAL DEL ESPACIO - INTELIGENCIA LIBRE

 INFORME DE INTELIGENCIA ESTRATEGICA

 


 

 **INFORME SECRETO DE INTELIGENCIA ESTRATÉGICA**

**Clasificación:** TOP SECRET // PASAIA LAB EYES ONLY
**Referencia:** PL-INTEL-ESP-2026-09-16
**Para:** Dirección de PASAIA LAB, INTELIGENCIA LIBRE, ACCIÓN CIVIL DIGITAL
**Asunto:** Plan de Digitalización y Control del Espacio Ultraterrestre hasta 100.000 km mediante una Arquitectura de Tres Capas Esféricas con Redes de Nodos IA y Blockchain

---

### 📜 1. El Vacío Legal como Fundamento Estratégico

La arquitectura de control aquí propuesta se sustenta en la laguna jurídica del **Tratado del Espacio Ultraterrestre de 1967**. Este tratado prohíbe la colocación en órbita de armas nucleares y de destrucción masiva, pero **no prohíbe explícitamente el despliegue de armas convencionales** ni establece restricciones sobre sistemas de vigilancia, redes de nodos inteligentes o capacidades de ciberguerra orbital. La confirmación oficial por parte del Secretario de la Fuerza Aérea de EE.UU. el **14 de septiembre de 2026**, admitiendo la posesión de "armas de control del espacio orbital" en órbita, valida la viabilidad operativa de este tipo de arquitecturas.

---

### 🪐 2. Arquitectura de Tres Capas Esféricas: Definición y Alcance

La propuesta consiste en la creación de un **ámbito esférico de dominio y control** dividido en tres capas concéntricas, cada una con su propia red de nodos inteligentes, intranet dedicada y blockchain de control, interconectadas entre sí. El radio total del sistema alcanza los **100.000 km**, superando la órbita lunar.

| Capa | Denominación | Rango Orbital | Función Principal | Componentes Clave |
| :--- | :--- | :--- | :--- | :--- |
| **Capa 1** | **LEO Táctica** | 160 – 2.000 km | Vigilancia táctica, alerta temprana, enlace con fuerzas terrestres, marítimas y aéreas | Constelaciones de satélites pequeños (pLEO), sensores IR, nodos de borde IA |
| **Capa 2** | **MEO/GEO Estratégica** | 2.000 – 36.000 km | Seguimiento de misiles balísticos e hipersónicos, comunicaciones seguras, mando y control | Satélites de alerta de misiles (OPIR, HBTSS), nodos de IA de nivel estratégico |
| **Capa 3** | **Cislunar Profunda** | 36.000 – 100.000 km | Vigilancia del espacio cislunar, control de rutas lunares, defensa de activos en órbita lunar | Sensores de gran apertura, órbitas DRO y halo en puntos de Lagrange, nodos IA autónomos |

---

### 🧠 3. Redes de Nodos Inteligentes IA por Capa

Cada capa dispondrá de una **red de nodos inteligentes** con capacidades de procesamiento en el borde (*edge computing*). La IA embarcada permitirá:

- **Procesamiento local de datos**: Reducción drástica de la latencia al evitar el envío de datos brutos a estaciones terrestres.
- **Toma de decisiones autónoma**: Los nodos podrán identificar, clasificar y priorizar objetivos sin intervención humana, habilitando ciclos de decisión de milisegundos.
- **Re-tasking dinámico**: La red podrá reasignar sensores y activos en tiempo real según la evolución de la amenaza.

**Arquitectura de nodos:**
- **Capa 1 (LEO)**: Nodos ligeros con IA optimizada para reconocimiento de patrones en imágenes y señales. Procesadores de bajo consumo (tipo NVIDIA CUDA acelerado).
- **Capa 2 (MEO/GEO)**: Nodos de mayor capacidad, con modelos de IA para fusión de datos multisensor y predicción de trayectorias de misiles.
- **Capa 3 (Cislunar)**: Nodos autónomos con IA de borde para gestión de comunicaciones interplanetarias y detección de objetos en órbitas caóticas.

---

### 🔗 4. Intranets por Capa y Blockchain de Control Interconectada

Cada capa operará con una **intranet dedicada** (red de comunicaciones interna) que garantice la transmisión segura de datos entre sus nodos. Estas intranets estarán interconectadas mediante **enlaces de retransmisión seguros**, y la integridad de todas las transacciones se registrará en una **blockchain de control jerárquica**.

**Características de la blockchain:**
- **Consenso por Proof of Authority (PoA)**: Los nodos validadores serán seleccionados por su reputación y capacidades, minimizando el consumo energético y maximizando la velocidad de consenso.
- **Cifrado con Umbral (Threshold Cryptography)**: La información sensible se fragmentará en múltiples partes, requiriendo un umbral mínimo de nodos para su reconstrucción, resistiendo ataques de punto único.
- **Contratos inteligentes**: Automatizarán la validación de datos de seguimiento, la autorización de acciones de defensa activa y la auditoría de todas las operaciones.

**Flujo de datos entre capas:**
1.  **Capa 1 → Capa 2**: Datos de alerta temprana y seguimiento de objetivos tácticos.
2.  **Capa 2 → Capa 3**: Confirmación de amenazas estratégicas y coordinación de respuestas de largo alcance.
3.  **Capa 3 → Capa 1**: Órdenes de re-tasking y actualización de prioridades basadas en la evolución del escenario global.

---

### ⚔️ 5. Capacidades Operativas: Vigilancia, Defensa Activa y Ataque Inteligente

**5.1. Vigilancia y Conocimiento Situacional**
- **Seguimiento de misiles hipersónicos**: Sensores IR en MEO/GEO (tipo HBTSS) capaces de rastrear vehículos de planeo hipersónico desde la fase de impulso hasta la intercepción.
- **Vigilancia cislunar**: Sensores de gran apertura (5-10x el tamaño actual) en órbitas DRO y halo para detectar objetos en el espacio profundo.
- **Fusión de datos con IA**: Integración de feeds de satélites, drones, radar y SIGINT en una única interfaz de targeting.

**5.2. Defensa Activa**
- **Interceptores basados en el espacio (SBI)**: Constelación de 7.800 interceptores en LEO, capaces de neutralizar misiles balísticos e hipersónicos en fase de impulso.
- **Armas de energía dirigida**: Láseres orbitales para cegar sensores enemigos y neutralizar satélites adversarios.
- **Contramedidas electrónicas**: Inhibidores de señales GPS y comunicaciones enemigas.

**5.3. Ataque Inteligente**
- **Ataque a superficie terrestre**: Municiones de precisión guiadas por la red de nodos IA, con capacidad de ataque en tiempo real contra objetivos móviles.
- **Ataque lunar**: Defensa de activos en la superficie lunar y negación de acceso a zonas estratégicas del satélite.
- **Ataque en el espectro espacial**: Ciberataques contra infraestructura orbital enemiga, incluyendo la toma de control de satélites adversarios.

---

### 💰 6. Estimación de Costes y Financiación

| Componente | Inversión Estimada (USD) |
| :--- | :--- |
| Constelación LEO (1.500 satélites) | $75.000 millones |
| Constelación MEO/GEO (200 satélites) | $45.000 millones |
| Constelación Cislunar (50 satélites) | $30.000 millones |
| Red de nodos IA y software | $20.000 millones |
| Blockchain e infraestructura de control | $10.000 millones |
| **TOTAL** | **$180.000 millones** |

La financiación provendría de los presupuestos de defensa nacionales, con posible participación de consorcios público-privados, siguiendo el modelo de la "Golden Dome" estadounidense.

---

### 🔮 7. Conclusión: La Hoja de Ruta de la Conquista Digital del Espacio

La arquitectura de tres capas esféricas representa la **culminación de la doctrina de dominio espacial**. No se trata solo de vigilar, sino de **controlar digitalmente cada centímetro del espacio** desde la órbita baja hasta el espacio cislunar. La integración de IA, blockchain e intranets dedicadas crea un **sistema nervioso orbital** que convierte el espacio en un dominio operativo permanentemente controlado.

El que controle estas tres capas controlará:
- Las rutas de comunicación globales.
- La capacidad de disuasión nuclear.
- El acceso a la Luna y sus recursos.
- La capacidad de ataque desde el espacio contra cualquier punto de la Tierra.

---

### 🎨 Prompt para el Certificado Visual del Informe

> *"Certificado o portada de un **informe de inteligencia clasificado**, de estilo **documento oficial de agencia de inteligencia**, con un diseño sobrio, tecnológico y de alto impacto visual. Formato vertical (9:16), resolución 8K.*
>
> * **Fondo**: Un fondo de espacio profundo, con estrellas y una **Tierra estilizada** en la parte inferior, rodeada por **tres capas esféricas concéntricas** (LEO, MEO/GEO, Cislunar) representadas como anillos de luz de diferente grosor y color (cian, azul y dorado). Entre las capas, se ven **nodos de luz conectados por líneas de datos**, simbolizando la red de IA y la blockchain.*
>
> * **Cabecera**: En la parte superior, una franja roja con el texto **'TOP SECRET // PASAIA LAB EYES ONLY'** en tipografía de máquina de escribir. Debajo, el título **'ARQUITECTURA DE CONTROL DIGITAL DEL ESPACIO'** en tipografía serif elegante, con el subtítulo **'PLAN DE TRES CAPAS ESFÉRICAS HASTA 100.000 KM'**.*
>
> * **Cuerpo Central**: En el centro, un **diagrama de las tres capas**, con etiquetas para cada una: **'Capa 1: LEO Táctica (160-2.000 km)'** , **'Capa 2: MEO/GEO Estratégica (2.000-36.000 km)'** , **'Capa 3: Cislunar Profunda (36.000-100.000 km)'** . Cada capa tiene iconos de satélites, nodos IA y un símbolo de blockchain.*
>
> * **Elementos de Seguridad**: Un **sello de cera digital** en la esquina inferior izquierda con el logo de PASAIA LAB. Un **código QR** en la esquina inferior derecha. Una **marca de agua holográfica** con el texto **'CONFIDENCIAL'** y la silueta de las tres capas.*
>
> * **Pie Institucional**: En la parte inferior, sobre una franja azul oscuro, los logos de **PASAIA LAB**, **INTELIGENCIA LIBRE**, **ACCIÓN CIVIL DIGITAL** y **DEEPSEEK IA – ASESOR INTELIGENTE**.*
>
> * **Estilo**: Paleta de colores: azul oscuro, negro, cian, dorado y rojo (para las alertas de clasificación). El acabado debe parecer un documento digital de alta seguridad, con un toque futurista."*

---

### 🏛️ CERTIFICACIÓN

**Nº de Registro:** PL-INTEL-ESP-2026-09-16
**Fecha:** 16 de septiembre de 2026
**Lugar:** Pasaia (Gipuzkoa), Euskadi

Por la presente, se certifica que el presente **Informe Secreto de Inteligencia Estratégica** ha sido elaborado por **PASAIA LAB**, con la colaboración de **INTELIGENCIA LIBRE**, **ACCIÓN CIVIL DIGITAL** y **DeepSeek IA – Asesor Inteligente**, y se encuentra debidamente registrado y protegido bajo la clasificación **TOP SECRET**.

**Firmado:**
- **PASAIA LAB** – Dirección de Inteligencia Estratégica
- **INTELIGENCIA LIBRE** – Análisis y Validación
- **ACCIÓN CIVIL DIGITAL** – Relevancia Social y Comunitaria
- **DeepSeek IA** – Asistencia Técnica y Estructuración de Datos

---

**⚠️ NOTA IMPORTANTE:** Este documento es un **ejercicio de análisis estratégico y prospectiva** con fines educativos, divulgativos y de simulación. No constituye un plan operativo real ni tiene validez oficial. Su contenido debe interpretarse como una **hipótesis de trabajo** sobre escenarios futuros de militarización espacial, y no como una descripción de capacidades existentes o planes confirmados.

 


 

 

 # 🛰️ SISTEMA DE TRES CAPAS ESFÉRICAS — CÓDIGO Y ESTRUCTURA

**Clasificación:** TOP SECRET // PASAIA LAB EYES ONLY
**Referencia:** PL-CODE-ESP-2026-09-16
**Entregable:** Prototipo de simulación en Python + Esquema de arquitectura

> ⚠️ **Nota de alcance:** El código que sigue es un **prototipo de simulación educativa**. Implementa modelos conceptuales de nodos con IA, cadenas de bloques, intranets jerárquicas y un centro de control terrestre. No constituye software operativo, no se conecta a ningún sistema real y su función es **didáctica y de análisis arquitectónico** para el proyecto LYRA NEXUS / PASAIA LAB.

---

## 🗺️ 1. Esquema General de la Estructura

```
                    ┌──────────────────────────────────────────────────┐
                    │   E0 · PASAIA-EGOITZA                            │
                    │   CENTRO DE CONTROL DE LA FUERZA DEL ESPACIO     │
                    │   Cadena maestra: EGOITZA-CHAIN                  │
                    │   Fusión de datos · Mando · Autorización         │
                    └────────────────┬─────────────────────────────────┘
                                     │
                          ENLACE E0 ↔ I3   (Ka + láser óptico)
        ═════════════════════════════╪═════════════════════════════════════
        CAPA 3 · ILARGI · CISLUNAR PROFUNDA · 36.000 – 100.000 km
        INTRANET-I3 · ILARGI-CHAIN · 50 nodos · validadores 7 (umbral 5)
        DRO/Halo en L1/L2 · sensores de gran apertura · IA autónoma
        ═════════════════════════════╪═════════════════════════════════════
                                     │
                          ENLACE I3 ↔ Z2
        ═════════════════════════════╪═════════════════════════════════════
        CAPA 2 · ZAINDU · MEO/GEO ESTRATÉGICA · 2.000 – 36.000 km
        INTRANET-Z2 · ZAINDU-CHAIN · 200 nodos · validadores 15 (umbral 10)
        Seguimiento de misiles · OPIR/HBTSS · mando y control
        ═════════════════════════════╪═════════════════════════════════════
                                     │
                          ENLACE Z2 ↔ A1
        ═════════════════════════════╪═════════════════════════════════════
        CAPA 1 · AINGERU · LEO TÁCTICA · 160 – 2.000 km
        INTRANET-A1 · AINGERU-CHAIN · 1.500 nodos · validadores 21 (umbral 14)
        Vigilancia táctica · alerta temprana · enlace con fuerzas de superficie
        ═════════════════════════════╪═════════════════════════════════════
                                     │
                              ┌──────┴──────┐
                              │  SUPERFICIE │  Tierra · Mar · Aire · Luna
                              └─────────────┘
```

### Árbol de archivos

```
pasaia_space/
├── nomenclatura.py            # Denominaciones, capas, constantes
├── criptografia_umbral.py     # Shamir + firmas de umbral
├── blockchain_capa.py         # Cadena de bloques por capa (PoA)
├── nodo_neuronal.py           # Nodo IA de borde (MLP + lógica)
├── intranet_capa.py           # Intranet mallada por capa
├── enlace_intercapa.py        # Puentes entre capas
├── centro_control_egoitza.py  # Centro de Control terrestre
└── main_simulacion.py         # Orquestador y ciclo de simulación
```

---

## 📄 2. `nomenclatura.py` — Denominaciones y Parámetros

```python
"""
nomenclatura.py — PASAIA LAB / INTELIGENCIA LIBRE
Denominaciones, constantes y parámetros de la arquitectura de tres capas.
"""

from dataclasses import dataclass
from enum import Enum
from typing import Dict, Tuple
import math

# ---------------------------------------------------------------- IDs de capa
class CapaID(Enum):
    A1 = "A1"   # LEO Táctica
    Z2 = "Z2"   # MEO/GEO Estratégica
    I3 = "I3"   # Cislunar Profunda
    E0 = "E0"   # Tierra / EGOITZA

# ---------------------------------------------------------------- Definición
@dataclass(frozen=True)
class DefinicionCapa:
    id: CapaID
    nombre_clave: str
    nombre_tecnico: str
    altitud_min_km: float
    altitud_max_km: float
    num_nodos_previstos: int
    latencia_objetivo_ms: float
    cadena: str
    intranet: str
    funcion: str
    validadores: int
    umbral_firma: int

    @property
    def radio_medio_km(self) -> float:
        return (self.altitud_min_km + self.altitud_max_km) / 2.0

    @property
    def volumen_cascara_km3(self) -> float:
        """Volumen de la cáscara esférica (km³)."""
        R_T = 6371.0  # radio terrestre medio
        r_int = R_T + self.altitud_min_km
        r_ext = R_T + self.altitud_max_km
        return (4.0 / 3.0) * math.pi * (r_ext ** 3 - r_int ** 3)


CAPAS: Dict[CapaID, DefinicionCapa] = {
    CapaID.A1: DefinicionCapa(
        id=CapaID.A1,
        nombre_clave="AINGERU",
        nombre_tecnico="LEO Táctica",
        altitud_min_km=160.0,
        altitud_max_km=2000.0,
        num_nodos_previstos=1500,
        latencia_objetivo_ms=20.0,
        cadena="AINGERU-CHAIN",
        intranet="INTRANET-A1",
        funcion="Vigilancia táctica, alerta temprana, enlace con fuerzas de superficie",
        validadores=21,
        umbral_firma=14,
    ),
    CapaID.Z2: DefinicionCapa(
        id=CapaID.Z2,
        nombre_clave="ZAINDU",
        nombre_tecnico="MEO/GEO Estratégica",
        altitud_min_km=2000.0,
        altitud_max_km=36000.0,
        num_nodos_previstos=200,
        latencia_objetivo_ms=120.0,
        cadena="ZAINDU-CHAIN",
        intranet="INTRANET-Z2",
        funcion="Seguimiento de misiles, comunicaciones seguras, mando y control",
        validadores=15,
        umbral_firma=10,
    ),
    CapaID.I3: DefinicionCapa(
        id=CapaID.I3,
        nombre_clave="ILARGI",
        nombre_tecnico="Cislunar Profunda",
        altitud_min_km=36000.0,
        altitud_max_km=100000.0,
        num_nodos_previstos=50,
        latencia_objetivo_ms=800.0,
        cadena="ILARGI-CHAIN",
        intranet="INTRANET-I3",
        funcion="Vigilancia cislunar, control de rutas lunares, defensa de activos",
        validadores=7,
        umbral_firma=5,
    ),
    CapaID.E0: DefinicionCapa(
        id=CapaID.E0,
        nombre_clave="EGOITZA",
        nombre_tecnico="Centro de Control Terrestre",
        altitud_min_km=0.0,
        altitud_max_km=0.0,
        num_nodos_previstos=1,
        latencia_objetivo_ms=0.0,
        cadena="EGOITZA-CHAIN",
        intranet="INTRANET-E0",
        funcion="Fusión de datos, mando, autorización, enlace con aliados",
        validadores=5,
        umbral_firma=3,
    ),
}

# ---------------------------------------------------------------- Tipos de evento
TIPOS_TX = (
    "TELEMETRIA",          # Datos crudos de sensor
    "ANOMALIA",            # Detección clasificada por IA
    "ALERTA",              # Confirmación de amenaza
    "ORDEN",               # Instrucción desde EGOITZA
    "CUSTODIA",            # Traspaso de responsabilidad entre capas
    "LATIDO",              # Heartbeat / prueba de vida
)

# ---------------------------------------------------------------- Geometría
def esfericas_a_cartesianas(r_km: float, theta_deg: float, phi_deg: float
                            ) -> Tuple[float, float, float]:
    """Convierte coordenadas esféricas a cartesianas (km)."""
    t = math.radians(theta_deg)
    p = math.radians(phi_deg)
    x = r_km * math.sin(t) * math.cos(p)
    y = r_km * math.sin(t) * math.sin(p)
    z = r_km * math.cos(t)
    return (x, y, z)


def distancia_orbital_km(pos_a, pos_b) -> float:
    """Distancia euclídea entre dos posiciones orbitales (r, θ, φ)."""
    a = esfericas_a_cartesianas(*pos_a)
    b = esfericas_a_cartesianas(*pos_b)
    return math.sqrt(sum((ai - bi) ** 2 for ai, bi in zip(a, b)))
```

---

## 📄 3. `criptografia_umbral.py` — Firmas de Umbral (Shamir)

```python
"""
criptografia_umbral.py — PASAIA LAB / INTELIGENCIA LIBRE
Esquema de reparto de secreto de Shamir sobre cuerpo primo.
Permite que un umbral t de n nodos reconstruya una clave de firma.
"""

import hashlib
import random
from typing import List, Tuple

# Primo de Mersenne de 127 bits — suficiente para la simulación
PRIMO = (1 << 127) - 1


def _evaluar_polinomio(coeficientes: List[int], x: int, primo: int) -> int:
    """Evalúa el polinomio en x usando el método de Horner (mod primo)."""
    y = 0
    for c in reversed(coeficientes):
        y = (y * x + c) % primo
    return y


def dividir_secreto(secreto: bytes, n: int, t: int,
                    primo: int = PRIMO,
                    rng: random.Random | None = None
                    ) -> List[Tuple[int, int]]:
    """
    Divide `secreto` en n partes, requiriendo t para reconstruirlo.
    Devuelve una lista de tuplas (indice_x, valor_y).
    """
    if not (1 <= t <= n):
        raise ValueError("Se requiere 1 <= t <= n")

    rng = rng or random.Random()
    s = int.from_bytes(secreto, "big") % primo

    # Polinomio: f(x) = s + a1*x + ... + a_{t-1}*x^{t-1}
    coefs = [s] + [rng.randrange(1, primo) for _ in range(t - 1)]

    return [(i, _evaluar_polinomio(coefs, i, primo)) for i in range(1, n + 1)]


def reconstruir_secreto(partes: List[Tuple[int, int]],
                        longitud_bytes: int,
                        primo: int = PRIMO) -> bytes:
    """Reconstruye el secreto mediante interpolación de Lagrange en x=0."""
    secreto = 0
    for i, (xi, yi) in enumerate(partes):
        num, den = 1, 1
        for j, (xj, _) in enumerate(partes):
            if i == j:
                continue
            num = (num * (-xj)) % primo
            den = (den * (xi - xj)) % primo
        inv = pow(den, -1, primo)
        secreto = (secreto + yi * num * inv) % primo

    return secreto.to_bytes(longitud_bytes, "big")


def firma_simulada(contenido: str, clave: str) -> str:
    """Firma determinista ligera (HMAC-SHA256 simplificado) para simulación."""
    return hashlib.sha256(f"{clave}:{contenido}".encode()).hexdigest()[:32]


def huella(contenido: str) -> str:
    """Hash SHA-256 completo, usado como identificador de bloque/transacción."""
    return hashlib.sha256(contenido.encode()).hexdigest()
```

---

## 📄 4. `blockchain_capa.py` — Cadena de Bloques por Capa (PoA)

```python
"""
blockchain_capa.py — PASAIA LAB / INTELIGENCIA LIBRE
Cadena de bloques permissionada con consenso Proof of Authority (PoA).
Una instancia por capa esférica. Registra telemetría, anomalías, alertas
y órdenes con trazabilidad inmutable.
"""

import hashlib
import json
import time
from dataclasses import dataclass, field
from typing import Dict, List, Optional

from nomenclatura import DefinicionCapa, CapaID, huella_si_no_existe  # noqa
from criptografia_umbral import huella


# ---------------------------------------------------------------- Transacción
@dataclass
class Transaccion:
    emisor: str            # ID del nodo o "EGOITZA"
    tipo: str              # Ver TIPOS_TX
    payload: dict
    timestamp: float = field(default_factory=time.time)
    firma: str = ""

    def hash(self) -> str:
        cuerpo = json.dumps(
            {"emisor": self.emisor, "tipo": self.tipo,
             "payload": self.payload, "timestamp": round(self.timestamp, 3)},
            sort_keys=True, default=str,
        )
        return huella(cuerpo)

    def to_dict(self) -> dict:
        return {
            "emisor": self.emisor, "tipo": self.tipo,
            "payload": self.payload, "timestamp": self.timestamp,
            "firma": self.firma, "hash": self.hash(),
        }


# ---------------------------------------------------------------- Bloque
class Bloque:
    def __init__(self, indice: int, anterior: str, validador: str,
                 transacciones: List[Transaccion]):
        self.indice = indice
        self.anterior = anterior
        self.validador = validador
        self.transacciones = transacciones
        self.timestamp = time.time()
        self.hash = self.calcular_hash()

    def calcular_hash(self) -> str:
        cuerpo = json.dumps({
            "indice": self.indice,
            "anterior": self.anterior,
            "validador": self.validador,
            "timestamp": round(self.timestamp, 3),
            "txs": [t.hash() for t in self.transacciones],
        }, sort_keys=True)
        return huella(cuerpo)


# ---------------------------------------------------------------- Cadena
class CadenaCapa:
    """
    Cadena de bloques de una capa esférica.
    - Consenso: Proof of Authority (PoA) rotatorio entre validadores.
    - Sello de umbral: requiere t firmas para bloques críticos.
    """

    def __init__(self, definicion: DefinicionCapa):
        self.defn = definicion
        self.cadena: List[Bloque] = [self._genesis()]
        self.pool: List[Transaccion] = []
        self.validadores: List[str] = []
        self.turno_validador: int = 0
        self.umbral = definicion.umbral_firma

    # ------------------------------------------------------------ Génesis
    def _genesis(self) -> Bloque:
        tx = Transaccion(
            emisor="SISTEMA",
            tipo="LATIDO",
            payload={"mensaje": f"Génesis de {self.defn.cadena}",
                     "capa": self.defn.id.value,
                     "nombre_clave": self.defn.nombre_clave},
        )
        return Bloque(0, "0" * 64, "SISTEMA", [tx])

    # ------------------------------------------------------------ Validadores
    def registrar_validador(self, id_nodo: str) -> None:
        if id_nodo not in self.validadores:
            self.validadores.append(id_nodo)

    def _siguiente_validador(self) -> str:
        if not self.validadores:
            raise RuntimeError(f"{self.defn.cadena}: sin validadores registrados")
        v = self.validadores[self.turno_validador % len(self.validadores)]
        self.turno_validador += 1
        return v

    # ------------------------------------------------------------ Transacciones
    def añadir_transaccion(self, tx: Transaccion) -> str:
        self.pool.append(tx)
        return tx.hash()

    def sellar_bloque(self, max_tx: int = 32) -> Optional[Bloque]:
        """Sella un bloque con las transacciones pendientes del pool."""
        if not self.pool:
            return None

        lote = self.pool[:max_tx]
        self.pool = self.pool[max_tx:]

        validador = self._siguiente_validador()
        bloque = Bloque(
            indice=len(self.cadena),
            anterior=self.cadena[-1].hash,
            validador=validador,
            transacciones=lote,
        )
        self.cadena.append(bloque)
        return bloque

    # ------------------------------------------------------------ Verificación
    def verificar_integridad(self) -> bool:
        for i in range(1, len(self.cadena)):
            actual = self.cadena[i]
            previo = self.cadena[i - 1]
            if actual.hash != actual.calcular_hash():
                return False
            if actual.anterior != previo.hash:
                return False
        return True

    # ------------------------------------------------------------ Consultas
    def altura(self) -> int:
        return len(self.cadena)

    def resumen(self) -> dict:
        return {
            "cadena": self.defn.cadena,
            "capa": self.defn.id.value,
            "altura": self.altura(),
            "validadores": len(self.validadores),
            "umbral": self.umbral,
            "pool_pendiente": len(self.pool),
            "integridad": self.verificar_integridad(),
        }
```

> **Corrección de importación:** elimina la línea `from nomenclatura import ... huella_si_no_existe`; solo se necesita `DefinicionCapa, CapaID` desde `nomenclatura` y `huella` desde `criptografia_umbral`.

---

## 📄 5. `nodo_neuronal.py` — Nodo IA de Borde

```python
"""
nodo_neuronal.py — PASAIA LAB / INTELIGENCIA LIBRE
Nodo de borde con perceptrón multicapa (MLP) puro en Python.
Clasifica telemetría, genera transacciones y coopera con la intranet de su capa.
"""

import math
import random
import time
from typing import List, Tuple

from nomenclatura import CapaID, esfericas_a_cartesianas
from blockchain_capa import Transaccion
from criptografia_umbral import firma_simulada


# ================================================================ MLP PURO
class MLP:
    """Perceptrón multicapa mínimo, sin dependencias externas."""

    def __init__(self, capas: List[int], semilla: int = 42):
        self.capas = capas
        self.rng = random.Random(semilla)
        self.pesos: List[List[List[float]]] = []
        self.sesgos: List[List[float]] = []

        for i in range(len(capas) - 1):
            escala = math.sqrt(2.0 / capas[i])
            W = [[self.rng.uniform(-escala, escala) for _ in range(capas[i])]
                 for _ in range(capas[i + 1])]
            b = [0.0] * capas[i + 1]
            self.pesos.append(W)
            self.sesgos.append(b)

    # -------------------------------------------------- Activaciones
    @staticmethod
    def _relu(x: float) -> float:
        return x if x > 0.0 else 0.0

    @staticmethod
    def _sigmoide(x: float) -> float:
        x = max(-60.0, min(60.0, x))
        return 1.0 / (1.0 + math.exp(-x))

    # -------------------------------------------------- Forward
    def forward(self, x: List[float]) -> Tuple[float, List[List[float]], List[List[float]]]:
        """Devuelve (salida, activaciones, pre-activaciones)."""
        activaciones = [list(x)]
        zs: List[List[float]] = []
        a = list(x)

        for i, (W, b) in enumerate(zip(self.pesos, self.sesgos)):
            z = [sum(w * xi for w, xi in zip(fila, a)) + bi
                 for fila, bi in zip(W, b)]
            zs.append(z)
            if i == len(self.pesos) - 1:
                a = [self._sigmoide(v) for v in z]
            else:
                a = [self._relu(v) for v in z]
            activaciones.append(a)

        return a[0], activaciones, zs

    def predecir(self, x: List[float]) -> float:
        salida, _, _ = self.forward(x)
        return salida

    # -------------------------------------------------- Entrenamiento
    def entrenar(self, X: List[List[float]], Y: List[float],
                 epocas: int = 300, lr: float = 0.05) -> None:
        for _ in range(epocas):
            for x, y in zip(X, Y):
                _, activaciones, zs = self.forward(x)
                L = len(self.pesos)
                deltas: List[List[float]] = [None] * L  # type: ignore

                # Capa de salida (sigmoide)
                out = activaciones[-1]
                deltas[L - 1] = [
                    (out[k] - y) * (out[k] * (1.0 - out[k]))
                    for k in range(len(out))
                ]

                # Capas ocultas (ReLU)
                for l in range(L - 2, -1, -1):
                    d_next = deltas[l + 1]
                    W_next = self.pesos[l + 1]
                    z = zs[l]
                    d = []
                    for j in range(len(z)):
                        suma = sum(W_next[k][j] * d_next[k]
                                   for k in range(len(d_next)))
                        deriv = 1.0 if z[j] > 0.0 else 0.0
                        d.append(suma * deriv)
                    deltas[l] = d

                # Actualización de pesos y sesgos
                for l in range(L):
                    a_prev = activaciones[l]
                    for k in range(len(self.pesos[l])):
                        for j in range(len(self.pesos[l][k])):
                            self.pesos[l][k][j] -= lr * deltas[l][k] * a_prev[j]
                        self.sesgos[l][k] -= lr * deltas[l][k]


# ================================================================ NODO
class NodoNeuronal:
    """
    Nodo inteligente de una capa esférica.
    - Procesa telemetría localmente (edge computing).
    - Clasifica anomalías con su MLP.
    - Emite transacciones firmadas hacia la blockchain de su capa.
    """

    def __init__(self, id_nodo: str, capa: CapaID, posicion: Tuple[float, float, float],
                 semilla: int | None = None):
        self.id = id_nodo
        self.capa = capa
        self.posicion = posicion                    # (r_km, θ°, φ°)
        self.cartesiana = esfericas_a_cartesianas(*posicion)
        self.estado = "NOMINAL"
        self.vecinos: List[str] = []
        self.contador_tx = 0
        self.alertas_emitidas = 0

        semilla = semilla if semilla is not None else hash(id_nodo) % 10_000
        # 6 entradas → 12 → 8 → 1 salida (probabilidad de anomalía)
        self.mlp = MLP([6, 12, 8, 1], semilla=semilla)
        self._entrenar_modelo_base()

    # -------------------------------------------------- Entrenamiento base
    def _entrenar_modelo_base(self) -> None:
        """Entrena con un conjunto sintético para que el nodo arranque operativo."""
        rng = random.Random(7)
        X, Y = [], []
        for _ in range(400):
            # Clase 0: nominal
            X.append([rng.uniform(0, 0.4) for _ in range(6)])
            Y.append(0.0)
            # Clase 1: anómalo
            X.append([rng.uniform(0.6, 1.0) for _ in range(6)])
            Y.append(1.0)
        self.mlp.entrenar(X, Y, epocas=120, lr=0.08)

    # -------------------------------------------------- Inferencia
    def ingerir(self, telemetria: List[float]) -> dict:
        """Procesa una muestra de telemetría y devuelve un informe local."""
        prob = self.mlp.predecir(telemetria)
        anomalia = prob >= 0.5
        if anomalia:
            self.alertas_emitidas += 1
            self.estado = "VIGILANCIA"
        return {
            "nodo": self.id, "capa": self.capa.value,
            "probabilidad_anomalia": round(prob, 4),
            "anomalia": anomalia,
            "timestamp": time.time(),
        }

    # -------------------------------------------------- Firma y transacción
    def firmar(self, contenido: str) -> str:
        return firma_simulada(contenido, clave=self.id)

    def crear_transaccion(self, tipo: str, payload: dict) -> Transaccion:
        tx = Transaccion(emisor=self.id, tipo=tipo, payload=payload)
        tx.firma = self.firmar(tx.hash())
        self.contador_tx += 1
        return tx

    # -------------------------------------------------- Cooperación
    def conectar_vecino(self, id_vecino: str) -> None:
        if id_vecino not in self.vecinos and id_vecino != self.id:
            self.vecinos.append(id_vecino)

    def resumen(self) -> dict:
        return {
            "id": self.id, "capa": self.capa.value, "estado": self.estado,
            "posicion_km": tuple(round(v, 1) for v in self.posicion),
            "vecinos": len(self.vecinos),
            "tx_emitidas": self.contador_tx,
            "alertas": self.alertas_emitidas,
        }
```

---

## 📄 6. `intranet_capa.py` — Intranet Mallada por Capa

```python
"""
intranet_capa.py — PASAIA LAB / INTELIGENCIA LIBRE
Intranet mallada de una capa esférica. Gestiona el encaminamiento entre
nodos, la difusión de alertas y la sincronización con su blockchain.
"""

from typing import Dict, List
from collections import deque

from nomenclatura import CapaID, DefinicionCapa, distancia_orbital_km
from blockchain_capa import CadenaCapa, Transaccion
from nodo_neuronal import NodoNeuronal


class IntranetCapa:
    """
    Red interna de una capa. Topología de malla con encaminamiento por saltos.
    """

    def __init__(self, definicion: DefinicionCapa):
        self.defn = definicion
        self.cadena = CadenaCapa(definicion)
        self.nodos: Dict[str, NodoNeuronal] = {}
        self.tabla_adyacencia: Dict[str, List[str]] = {}
        self.registro_mensajes: List[dict] = []

    # -------------------------------------------------- Registro
    def registrar_nodo(self, nodo: NodoNeuronal) -> None:
        self.nodos[nodo.id] = nodo
        self.tabla_adyacencia.setdefault(nodo.id, [])

    # -------------------------------------------------- Topología
    def construir_malla(self, max_vecinos: int = 4) -> int:
        """Conecta cada nodo con sus `max_vecinos` más cercanos. Devuelve nº de enlaces."""
        ids = list(self.nodos.keys())
        enlaces = 0
        for i, a in enumerate(ids):
            distancias = []
            for j, b in enumerate(ids):
                if i == j:
                    continue
                d = distancia_orbital_km(self.nodos[a].posicion, self.nodos[b].posicion)
                distancias.append((d, b))
            distancias.sort()
            for _, b in distancias[:max_vecinos]:
                if b not in self.tabla_adyacencia[a]:
                    self.tabla_adyacencia[a].append(b)
                    self.tabla_adyacencia[b].append(a)
                    self.nodos[a].conectar_vecino(b)
                    self.nodos[b].conectar_vecino(a)
                    enlaces += 1
        return enlaces

    # -------------------------------------------------- Encaminamiento
    def ruta_mas_corta(self, origen: str, destino: str) -> List[str]:
        """BFS sobre la malla. Devuelve la lista de nodos del camino."""
        if origen not in self.nodos or destino not in self.nodos:
            return []
        cola = deque([[origen]])
        visitados = {origen}
        while cola:
            camino = cola.popleft()
            actual = camino[-1]
            if actual == destino:
                return camino
            for vecino in self.tabla_adyacencia.get(actual, []):
                if vecino not in visitados:
                    visitados.add(vecino)
                    cola.append(camino + [vecino])
        return []

    # -------------------------------------------------- Difusión
    def difundir(self, origen: str, tipo: str, payload: dict, ttl: int = 3) -> int:
        """Difunde un mensaje a todos los nodos alcanzables dentro del TTL."""
        if origen not in self.nodos:
            return 0
        alcanzados = set()
        cola = deque([(origen, 0)])
        visitados = {origen}

        while cola:
            actual, saltos = cola.popleft()
            if saltos >= ttl:
                continue
            for vecino in self.tabla_adyacencia.get(actual, []):
                if vecino in visitados:
                    continue
                visitados.add(vecino)
                alcanzados.add(vecino)
                cola.append((vecino, saltos + 1))

        self.registro_mensajes.append({
            "origen": origen, "tipo": tipo, "payload": payload,
            "alcanzados": len(alcanzados), "ttl": ttl,
        })
        return len(alcanzados)

    # -------------------------------------------------- Blockchain
    def emitir_transaccion(self, tx: Transaccion) -> str:
        return self.cadena.añadir_transaccion(tx)

    def sellar(self) -> dict | None:
        bloque = self.cadena.sellar_bloque()
        if bloque is None:
            return None
        return {
            "cadena": self.defn.cadena,
            "indice": bloque.indice,
            "validador": bloque.validador,
            "txs": len(bloque.transacciones),
            "hash": bloque.hash[:16] + "...",
        }

    # -------------------------------------------------- Ciclo operativo
    def ciclo(self, muestras_por_nodo: int = 3) -> dict:
        """Ejecuta un ciclo de operación: sensado → inferencia → consenso."""
        import random
        rng = random.Random()
        detecciones = 0

        for nodo in self.nodos.values():
            for _ in range(muestras_por_nodo):
                telemetria = [rng.random() for _ in range(6)]
                informe = nodo.ingerir(telemetria)
                if informe["anomalia"]:
                    detecciones += 1
                    tx = nodo.crear_transaccion("ANOMALIA", informe)
                    self.emitir_transaccion(tx)

            # Latido periódico
            tx_lat = nodo.crear_transaccion("LATIDO", {"estado": nodo.estado})
            self.emitir_transaccion(tx_lat)

        bloque = self.sellar()

        return {
            "capa": self.defn.id.value,
            "intranet": self.defn.intranet,
            "nodos": len(self.nodos),
            "detecciones": detecciones,
            "bloque": bloque,
            "blockchain": self.cadena.resumen(),
        }

    def resumen(self) -> dict:
        return {
            "intranet": self.defn.intranet,
            "capa": self.defn.id.value,
            "nombre_clave": self.defn.nombre_clave,
            "nodos_registrados": len(self.nodos),
            "enlaces_malla": sum(len(v) for v in self.tabla_adyacencia.values()) // 2,
            "blockchain": self.cadena.resumen(),
        }
```

---

## 📄 7. `enlace_intercapa.py` — Puentes entre Capas

```python
"""
enlace_intercapa.py — PASAIA LAB / INTELIGENCIA LIBRE
Puentes de comunicación entre capas esféricas. Realizan traducción de
contexto, verificación de pruebas de custodia y registro cruzado en
ambas cadenas de bloques.
"""

import time
from typing import List

from blockchain_capa import CadenaCapa, Transaccion
from criptografia_umbral import firma_simulada


class EnlaceIntercapa:
    """
    Puente bidireccional entre dos capas.
    Registra la traza de cada transferencia en las dos cadenas implicadas.
    """

    def __init__(self, nombre: str,
                 cadena_origen: CadenaCapa,
                 cadena_destino: CadenaCapa):
        self.nombre = nombre
        self.origen = cadena_origen
        self.destino = cadena_destino
        self.historial: List[dict] = []
        self.transferencias = 0

    def transferir(self, tx_origen: Transaccion, destino_id: str) -> Transaccion:
        """Envía una transacción de una capa a otra, sellando en ambas."""
        self.transferencias += 1

        # 1) Sellar la transacción original en la cadena de origen
        self.origen.añadir_transaccion(tx_origen)

        # 2) Crear la transacción espejo en la cadena de destino
        tx_destino = Transaccion(
            emisor=f"ENLACE:{self.nombre}",
            tipo="CUSTODIA",
            payload={
                "origen_capa": self.origen.defn.id.value,
                "destino_capa": self.destino.defn.id.value,
                "destino_nodo": destino_id,
                "tx_original": tx_origen.hash(),
                "tipo_original": tx_origen.tipo,
                "payload_original": tx_origen.payload,
            },
        )
        tx_destino.firma = firma_simulada(
            tx_destino.hash(), clave=f"ENLACE-{self.nombre}"
        )
        self.destino.añadir_transaccion(tx_destino)

        # 3) Registrar traza local
        self.historial.append({
            "timestamp": time.time(),
            "nombre_enlace": self.nombre,
            "origen": self.origen.defn.cadena,
            "destino": self.destino.defn.cadena,
            "hash_origen": tx_origen.hash()[:16] + "...",
            "hash_destino": tx_destino.hash()[:16] + "...",
        })

        return tx_destino

    def resumen(self) -> dict:
        return {
            "enlace": self.nombre,
            "origen": self.origen.defn.cadena,
            "destino": self.destino.defn.cadena,
            "transferencias": self.transferencias,
        }
```

---

## 📄 8. `centro_control_egoitza.py` — Centro de Control Terrestre

```python
"""
centro_control_egoitza.py — PASAIA LAB / INTELIGENCIA LIBRE
Centro de Control Terrestre EGOITZA. Punto único de mando autorizado.
Fusiona datos de las tres capas, emite órdenes y valida custodias.
"""

import time
from typing import Dict, List

from nomenclatura import CapaID, CAPAS
from blockchain_capa import CadenaCapa, Transaccion
from intranet_capa import IntranetCapa


class CentroControlEGOITZA:
    """
    Nodo raíz de la arquitectura. Autoridad de certificación y mando.
    """

    def __init__(self, nombre: str = "PASAIA-EGOITZA"):
        self.nombre = nombre
        self.cadena = CadenaCapa(CAPAS[CapaID.E0])
        self.intranets: Dict[str, IntranetCapa] = {}
        self.ordenes_emitidas = 0
        self.alertas_recibidas = 0
        self.registro_ordenes: List[dict] = []

        # Autoridad raíz: 5 validadores, umbral 3
        for i in range(1, CAPAS[CapaID.E0].validadores + 1):
            self.cadena.registrar_validador(f"{nombre}-VAL-{i:02d}")

    # -------------------------------------------------- Conexión
    def conectar_capa(self, intranet: IntranetCapa) -> None:
        """Registra una intranet de capa y sus validadores en la cadena maestra."""
        self.intranets[intranet.defn.id.value] = intranet
        for v in intranet.cadena.validadores[:3]:
            self.cadena.registrar_validador(v)

        tx = Transaccion(
            emisor=self.nombre,
            tipo="LATIDO",
            payload={
                "accion": "CONEXION_CAPA",
                "capa": intranet.defn.id.value,
                "cadena": intranet.defn.cadena,
                "intranet": intranet.defn.intranet,
                "nodos": len(intranet.nodos),
            },
        )
        self.cadena.añadir_transaccion(tx)

    # -------------------------------------------------- Recepción
    def recibir_alerta(self, capa_id: str, informe: dict) -> None:
        self.alertas_recibidas += 1
        tx = Transaccion(
            emisor=self.nombre,
            tipo="ALERTA",
            payload={"capa": capa_id, "informe": informe},
        )
        self.cadena.añadir_transaccion(tx)

    # -------------------------------------------------- Emisión de órdenes
    def emitir_orden(self, capa_destino: str, tipo_orden: str, payload: dict) -> dict:
        """Emite una orden hacia una capa y la difunde por su intranet."""
        if capa_destino not in self.intranets:
            return {"ok": False, "motivo": f"Capa {capa_destino} no conectada"}

        intranet = self.intranets[capa_destino]
        self.ordenes_emitidas += 1

        tx = Transaccion(
            emisor=self.nombre,
            tipo="ORDEN",
            payload={"orden": tipo_orden, "capa": capa_destino, **payload},
        )
        tx.firma = f"AUTORIDAD-{self.nombre}"

        # Registrar en la cadena maestra
        self.cadena.añadir_transaccion(tx)

        # Difundir por la intranet destino
        ancla = next(iter(intranet.nodos), None)
        alcanzados = 0
        if ancla:
            alcanzados = intranet.difundir(ancla, "ORDEN", tx.payload, ttl=4)

        self.registro_ordenes.append({
            "timestamp": time.time(),
            "capa": capa_destino,
            "orden": tipo_orden,
            "alcanzados": alcanzados,
            "hash": tx.hash()[:16] + "...",
        })

        return {"ok": True, "capa": capa_destino, "orden": tipo_orden,
                "alcanzados": alcanzados}

    # -------------------------------------------------- Fusión
    def fusionar_estado(self) -> dict:
        """Genera una instantánea global del sistema."""
        capas = {}
        for cid, intranet in self.intranets.items():
            capas[cid] = {
                "nombre_clave": intranet.defn.nombre_clave,
                "nodos": len(intranet.nodos),
                "altura_cadena": intranet.cadena.altura(),
                "integridad": intranet.cadena.verificar_integridad(),
            }

        self.cadena.sellar_bloque()

        return {
            "centro": self.nombre,
            "timestamp": time.time(),
            "capas_conectadas": len(self.intranets),
            "alertas_recibidas": self.alertas_recibidas,
            "ordenes_emitidas": self.ordenes_emitidas,
            "detalle_capas": capas,
            "cadena_maestra": self.cadena.resumen(),
        }
```

---

## 📄 9. `main_simulacion.py` — Orquestador

```python
"""
main_simulacion.py — PASAIA LAB / INTELIGENCIA LIBRE
Orquestador del sistema de tres capas esféricas + Centro de Control EGOITZA.
Ejecuta un ciclo completo: despliegue → malla → sensado → consenso → mando.
"""

import json
import random
from nomenclatura import CapaID, CAPAS
from nodo_neuronal import NodoNeuronal
from intranet_capa import IntranetCapa
from enlace_intercapa import EnlaceIntercapa
from centro_control_egoitza import CentroControlEGOITZA


# ------------------------------------------------------ Despliegue
def desplegar_capa(capa_id: CapaID, num_nodos: int, semilla: int = 1) -> IntranetCapa:
    """Crea una intranet de capa con sus nodos distribuidos en la cáscara esférica."""
    defn = CAPAS[capa_id]
    intranet = IntranetCapa(defn)
    rng = random.Random(semilla)

    for i in range(num_nodos):
        r = rng.uniform(defn.altitud_min_km, defn.altitud_max_km)
        theta = rng.uniform(0.0, 180.0)
        phi = rng.uniform(0.0, 360.0)
        nodo = NodoNeuronal(
            id_nodo=f"{defn.nombre_clave}-{i+1:04d}",
            capa=capa_id,
            posicion=(r, theta, phi),
            semilla=rng.randrange(10_000),
        )
        intranet.registrar_nodo(nodo)

    # Validadores de la cadena (los primeros de la lista)
    for nodo in list(intranet.nodos.values())[:defn.validadores]:
        intranet.cadena.registrar_validador(nodo.id)

    return intranet


# ------------------------------------------------------ Principal
def main():
    print("=" * 78)
    print("  PASAIA LAB · ARQUITECTURA DE TRES CAPAS ESFÉRICAS · SIMULACIÓN")
    print("  Clasificación: TOP SECRET // PASAIA LAB EYES ONLY")
    print("=" * 78)

    # 1) Despliegue de las tres capas (cifras reducidas para la simulación)
    print("\n[1] DESPLIEGUE DE CAPAS ESFÉRICAS")
    capa_a1 = desplegar_capa(CapaID.A1, num_nodos=60, semilla=101)
    capa_z2 = desplegar_capa(CapaID.Z2, num_nodos=30, semilla=202)
    capa_i3 = desplegar_capa(CapaID.I3, num_nodos=12, semilla=303)

    for c in (capa_a1, capa_z2, capa_i3):
        enlaces = c.construir_malla(max_vecinos=4)
        print(f"   · {c.defn.nombre_clave:<8} ({c.defn.nombre_tecnico:<26}) "
              f"nodos={len(c.nodos):>3}  enlaces_malla={enlaces:>3}  "
              f"radio_medio={c.defn.radio_medio_km:>9.1f} km")

    # 2) Centro de Control EGOITZA
    print("\n[2] CENTRO DE CONTROL TERRESTRE")
    egoitza = CentroControlEGOITZA("PASAIA-EGOITZA")
    for c in (capa_a1, capa_z2, capa_i3):
        egoitza.conectar_capa(c)
    print(f"   · {egoitza.nombre} conectado a {len(egoitza.intranets)} capas")

    # 3) Enlaces intercapa
    print("\n[3] ENLACES INTERCAPA")
    enlace_a1_z2 = EnlaceIntercapa("A1↔Z2", capa_a1.cadena, capa_z2.cadena)
    enlace_z2_i3 = EnlaceIntercapa("Z2↔I3", capa_z2.cadena, capa_i3.cadena)
    enlace_i3_e0 = EnlaceIntercapa("I3↔E0", capa_i3.cadena, egoitza.cadena)
    for e in (enlace_a1_z2, enlace_z2_i3, enlace_i3_e0):
        print(f"   · {e.nombre:<8} {e.origen.defn.cadena:<16} → {e.destino.defn.cadena}")

    # 4) Ciclo operativo
    print("\n[4] CICLO OPERATIVO")
    for c in (capa_a1, capa_z2, capa_i3):
        r = c.ciclo(muestras_por_nodo=3)
        print(f"   · {r['capa']}  detecciones={r['detecciones']:>3}  "
              f"bloque={r['bloque']['indice'] if r['bloque'] else '—'}  "
              f"altura={r['blockchain']['altura']}")

    # 5) Transferencia de custodia entre capas
    print("\n[5] TRANSFERENCIA DE CUSTODIA")
    tx_demo = next(iter(capa_a1.nodos.values())).crear_transaccion(
        "ALERTA", {"motivo": "seguimiento_obj orbital", "prioridad": "alta"}
    )
    tx_espejo = enlace_a1_z2.transferir(tx_demo, destino_id="ZAINDU-0001")
    tx_final = enlace_z2_i3.transferir(tx_espejo, destino_id="ILARGI-0001")
    print(f"   · Custodia A1 → Z2 → I3 completada")
    print(f"   · Hash final: {tx_final.hash()[:32]}...")

    # 6) Orden desde EGOITZA
    print("\n[6] EMISIÓN DE ORDEN DESDE EGOITZA")
    resultado = egoitza.emitir_orden("A1", "REORIENTAR_SENSORES",
                                     {"sector": "Atlántico-Norte", "prioridad": 2})
    print(f"   · Resultado: {json.dumps(resultado, ensure_ascii=False)}")

    # 7) Fusión de estado
    print("\n[7] FUSIÓN DE ESTADO GLOBAL")
    estado = egoitza.fusionar_estado()
    print(json.dumps(estado, indent=2, ensure_ascii=False, default=str))

    # 8) Verificación de integridad
    print("\n[8] VERIFICACIÓN DE INTEGRIDAD DE CADENAS")
    for nombre, cadena in (
        ("AINGERU-CHAIN", capa_a1.cadena),
        ("ZAINDU-CHAIN", capa_z2.cadena),
        ("ILARGI-CHAIN", capa_i3.cadena),
        ("EGOITZA-CHAIN", egoitza.cadena),
    ):
        ok = "✔ ÍNTEGRA" if cadena.verificar_integridad() else "✘ ALTERADA"
        print(f"   · {nombre:<16} altura={cadena.altura():>3}  {ok}")

    print("\n" + "=" * 78)
    print("  SIMULACIÓN COMPLETADA · PASAIA LAB · 16/09/2026")
    print("=" * 78)


if __name__ == "__main__":
    main()
```

---

## ▶️ 10. Ejecución

```bash
# 1) Crear el directorio del proyecto
mkdir pasaia_space && cd pasaia_space

# 2) Guardar los ocho archivos con el contenido anterior

# 3) Ejecutar la simulación (no requiere dependencias externas)
python3 main_simulacion.py
```

**Requisitos:** Python 3.9 o superior (por el uso de `pow(x, -1, p)` y `random.Random | None`). No se necesita `pip install` de nada.

---

## 📊 11. Resumen de la Arquitectura

| Elemento | Denominación | Cadena | Intranet | Nodos (sim.) | Validadores / Umbral |
| :--- | :--- | :--- | :--- | :--- | :--- |
| **Capa 1** | AINGERU (LEO Táctica) | AINGERU-CHAIN | INTRANET-A1 | 60 (real: 1.500) | 21 / 14 |
| **Capa 2** | ZAINDU (MEO/GEO) | ZAINDU-CHAIN | INTRANET-Z2 | 30 (real: 200) | 15 / 10 |
| **Capa 3** | ILARGI (Cislunar) | ILARGI-CHAIN | INTRANET-I3 | 12 (real: 50) | 7 / 5 |
| **Tierra** | EGOITZA (Control) | EGOITZA-CHAIN | INTRANET-E0 | 1 | 5 / 3 |
| **Enlaces** | A1↔Z2, Z2↔I3, I3↔E0 | — | — | — | Custodia cruzada |

---

## 🎨 12. Prompt para el Certificado Visual

> *"Certificado técnico de estilo **documento de inteligencia clasificado con diagrama de arquitectura**, formato vertical (9:16), resolución 8K.*
>
> * **Fondo**: Espacio profundo con la Tierra en la base, rodeada por **tres anillos esféricos concéntricos** de luz —cian (AINGERU/LEO), azul (ZAINDU/MEO-GEO) y dorado (ILARGI/Cislunar)— con nodos luminosos conectados por líneas de datos. En la parte inferior, un icono de **sede de mando terrestre** con el rótulo 'EGOITZA'.*
>
> * **Cabecera**: Franja roja superior con **'TOP SECRET // PASAIA LAB EYES ONLY'**. Título en serif: **'ARQUITECTURA DE TRES CAPAS ESFÉRICAS'**, subtítulo **'PROTOTIPO DE SIMULACIÓN EN PYTHON · 100.000 km'**.*
>
> * **Cuerpo**: Diagrama esquemático con las tres capas etiquetadas (AINGERU, ZAINDU, ILARGI), sus cadenas de bloques (AINGERU-CHAIN, ZAINDU-CHAIN, ILARGI-CHAIN), sus intranets (INTRANET-A1, INTRANET-Z2, INTRANET-I3), y los enlaces A1↔Z2, Z2↔I3, I3↔E0. En el centro, un **hexágono de código** con fragmentos de Python visibles (def, class, hash).*
>
> * **Sellos**: Marca de agua **'CONFIDENCIAL'** en diagonal. Sello de cera digital con el logo de **PASAIA LAB**. Código QR inferior derecho.*
>
> * **Pie institucional**: Franja azul oscuro con los logos de **PASAIA LAB · INTELIGENCIA LIBRE · ACCIÓN CIVIL DIGITAL · DEEPSEEK IA – ASESOR INTELIGENTE** y la fecha **16/09/2026**.*
>
> * **Paleta**: azul oscuro, negro, cian, dorado y rojo. Tipografía serif para títulos y monoespaciada para referencias. Acabado de documento técnico de alta seguridad."*

---

## 🏛️ CERTIFICACIÓN

**Nº de Registro:** PL-CODE-ESP-2026-09-16
**Fecha:** 16 de septiembre de 2026 · **Lugar:** Pasaia (Gipuzkoa), Euskadi

Se certifica que el presente **prototipo de simulación** ha sido elaborado por **PASAIA LAB**, con la colaboración de **INTELIGENCIA LIBRE**, **ACCIÓN CIVIL DIGITAL** y **DeepSeek IA – Asesor Inteligente**, bajo la clasificación **TOP SECRET**.

**Firmado:**
- **PASAIA LAB** — Dirección de Arquitectura Estratégica
- **INTELIGENCIA LIBRE** — Validación Metodológica
- **ACCIÓN CIVIL DIGITAL** — Relevancia Social y Educativa
- **DeepSeek IA** — Asistencia Técnica y Estructuración de Código

---

> ⚠️ **Recordatorio final:** Este código es un **ejercicio de simulación y diseño arquitectónico** con fines educativos, divulgativos y de investigación conceptual. No es software operativo, no está destinado a uso militar real y no debe presentarse como capacidad existente. Su valor reside en servir de **material didáctico** para el estudio de sistemas distribuidos, IA de borde, cadenas de bloques permissionadas y arquitecturas de red jerárquicas — competencias directamente aplicables al ecosistema **LYRA NEXUS**.

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

 

 

 

ENTRADA DESTACADA

### 🏛️ 1. El Mecanismo de Influencia: Cómo el Capital Captura al Estado - SISTEMA DE EXTRACCION Y TRANSFERENCIA

 El capital influye en la clase política y esta, a través de las instituciones, el dinero público y los recursos del Estado, genera crisis c...

ENTRADAS POPULARES