# latam-oiv-resolver

> Resolver multi-país de operadores de infraestructura crítica (OIV) para
> América Latina. API unificada y JSON Schema para resolver los equivalentes
> a "Operadores de Importancia Vital" (OIV) en los marcos regulatorios LATAM.

[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
[![npm version](https://img.shields.io/badge/npm-v0.1.0--alpha.1-orange.svg)](https://www.npmjs.com/package/latam-oiv-resolver)
[![Status](https://img.shields.io/badge/status-alpha-yellow.svg)](#estado-v010-alpha1--alcance-piloto)
[![Node](https://img.shields.io/badge/node-%3E%3D18-brightgreen.svg)](package.json)
[![CI](https://github.com/raceksd-source/latam-oiv-resolver/actions/workflows/ci.yml/badge.svg)](https://github.com/raceksd-source/latam-oiv-resolver/actions/workflows/ci.yml)
[![CodeQL](https://github.com/raceksd-source/latam-oiv-resolver/actions/workflows/codeql.yml/badge.svg)](https://github.com/raceksd-source/latam-oiv-resolver/actions/workflows/codeql.yml)

Leer en: [English](README.md) · **Español** · [Português (BR)](README.pt-br.md)

---

## Estado: `v0.1.0-alpha.1` · alcance piloto

> **No apto para producción.** Este release es intencionalmente un esqueleto
> alpha. Solo Chile delega hoy en un resolver verificado en producción. Los
> demás países son stubs que documentan las fuentes oficiales e invitan a
> contribuciones locales.

| País | Estado | Origen de la cobertura |
|---|---|---|
| Chile (CL) | Estable (vía paquete companion) | [`anci-oiv-resolver`](https://github.com/raceksd-source/anci-oiv-resolver) v0.5.0 |
| Argentina (AR) | Stub · piloto | Pendiente contribución |
| Brasil (BR) | Stub · piloto (prioritario) | Pendiente contribución |
| Colombia (CO) | Stub · piloto | Pendiente contribución |
| Uruguay (UY) | Stub · piloto | Pendiente contribución |
| México (MX) | Stub · planificado | Pendiente contribución |
| Perú (PE) | Stub · planificado | Pendiente contribución |
| Ecuador (EC) | Stub · planificado | Pendiente contribución |
| Costa Rica (CR) | Stub · planificado | Pendiente contribución |
| Panamá (PA) | Stub · planificado | Pendiente contribución |

---

## Inicio rápido

```bash
npm install latam-oiv-resolver
# Opcional · habilita la cobertura activa de Chile (CL):
npm install anci-oiv-resolver
```

```typescript
import { resolveOperator } from 'latam-oiv-resolver';

const operador = await resolveOperator({
  country: 'CL',
  identifier: '97006000-6',
  razonSocial: 'BANCO DE CRÉDITO E INVERSIONES',
});
// → { country: 'CL', domain: 'bci.cl', sector: 'banking_finance',
//     source: 'companion-package', confidence: 1.0, ... }
```

Ver [`examples/`](examples/) para scripts ejecutables.

---

## Qué hace

- **Normaliza identificadores nacionales** en los distintos formatos
  tributarios y de registro de LATAM (RUT · CNPJ · CPF · RFC · CUIT · NIT ·
  RUC · Cédula Jurídica).
- **Resuelve operador → dominio canónico** por país, con puntaje de
  confianza y proveniencia explícita (`official-registry` ·
  `companion-package` · `community-curated` · `heuristic` · `stub`).
- **Expone un único JSON Schema** para que cada dataset de país valide
  contra el mismo contrato — ver [`data/schema.json`](data/schema.json).
- **No incluye findings, scores CVSS ni inteligencia de vulnerabilidades.**
  El alcance es identificador ↔ operador ↔ dominio. Nada más.

---

## Países soportados

| País | Identificador(es) | Referencia normativa | Estado |
|---|---|---|---|
| Chile (CL) | `RUT` | Ley 21.663 · ANCI | Estable (vía companion) |
| Brasil (BR) | `CNPJ` · `CPF` | PNSI · LGPD (Lei 13.709) · GSI/PR | Stub piloto |
| Argentina (AR) | `CUIT` · `CUIL` | Estrategia Nacional de Ciberseguridad | Stub piloto |
| Uruguay (UY) | `RUT` (UY) | Marco AGESIC | Stub piloto |
| Colombia (CO) | `NIT` | CONPES 3854 · Ley 2300 · ColCERT | Stub piloto |
| México (MX) | `RFC` | LFPDPPP · Sectores Estratégicos | Planificado |
| Perú (PE) | `RUC` | DLeg 1412 · Política Nac. Ciberseguridad | Planificado |
| Ecuador (EC) | `RUC` | Política Nacional de Ciberseguridad | Planificado |
| Costa Rica (CR) | `Cédula Jurídica` | MICITT · Estrategia Nacional | Planificado |
| Panamá (PA) | `RUC` | AIG · Estrategia Nacional | Planificado |

Las menciones genéricas de los reguladores nacionales (ANCI · AGESIC ·
GSI/PR · ColCERT) **no** implican respaldo ni alianza. La fuente de verdad
es siempre la publicación oficial de cada regulador.

---

## Referencia de API

### `resolveOperator(input, options?)`

```typescript
async function resolveOperator(
  input: OperatorIdentifier,
  options?: ResolveOptions
): Promise<ResolvedOperator>;
```

| Campo | Tipo | Descripción |
|---|---|---|
| `input.country` | `LATAMCountry` | ISO 3166-1 alpha-2 (`CL` · `BR` · `MX` · …) |
| `input.identifier` | `string` | Identificador nacional en cualquier formato común |
| `input.razonSocial` | `string?` | Razón social (recomendado para fallback heurístico) |
| `options.verify` | `boolean?` | Solicita verificación DNS donde el adaptador la soporte |
| `options.refresh` | `boolean?` | Fuerza recarga del cache del adaptador (rara vez necesario) |

Retorna un `ResolvedOperator`:

```typescript
interface ResolvedOperator {
  country: LATAMCountry;
  identifier: string;            // forma normalizada
  identifierType: IdentifierType;
  domain: string | null;
  razonSocial: string | null;
  sector: LATAMSector;
  sectorLocal?: string;
  source: ResolutionSource;
  confidence: number;            // 0–1
  verified: boolean | null;
  note?: string;
}
```

### `resolveBatch(inputs, options?)`

```typescript
async function resolveBatch(
  inputs: OperatorIdentifier[],
  options?: ResolveOptions
): Promise<ResolvedOperator[]>;
```

Agrupa los inputs por país para cargar cada adaptador una sola vez.

### `normalize(country, identifier)` · `isValidIdentifier(country, identifier)`

```typescript
import { normalize, isValidIdentifier } from 'latam-oiv-resolver';

normalize('CL', '76.086.428-5');    // → '76086428-5'
normalize('BR', '00000000000191');  // → '00.000.000/0001-91'
normalize('MX', 'xaxx010101000');   // → 'XAXX010101000'
normalize('AR', '30500001735');     // → '30-50000173-5'

isValidIdentifier('CL', '97006000-6'); // → true
```

### `listCountries()`

Retorna el arreglo de códigos `LATAMCountry` expuestos actualmente por el
paquete (adaptadores implementados más los stubs piloto).

Superficie completa: ver [`src/types.ts`](src/types.ts).

---

## Metodología

`latam-oiv-resolver` opera estrictamente sobre **OSINT pasivo**. La resolución
de dominios usa DNS público (registros A · AAAA · MX) y mapeos curados desde
publicaciones públicas de reguladores y registros nacionales. Sin escaneo
activo, sin acceso no autorizado, sin fuentes de datos privadas.

Las referencias a divulgación coordinada de vulnerabilidades se enmarcan
**conforme a los principios de ISO/IEC 29147:2018** e ISO/IEC 30111:2019.
Estos estándares se citan como marcos de proceso, no como declaración de
certificación.

La metodología de contribución por país está documentada en
[`docs/METHODOLOGY-LATAM.md`](docs/METHODOLOGY-LATAM.md). La arquitectura y
el contrato de adaptadores en [`docs/ARCHITECTURE.md`](docs/ARCHITECTURE.md).

---

## Paquete companion

La cobertura de Chile (CL) se delega a [`anci-oiv-resolver`](https://github.com/raceksd-source/anci-oiv-resolver)
v0.5.0, una implementación de referencia mono-país para las 915 entidades
designadas bajo la Ley 21.663 (registro ANCI). Instálalo como peer dependency
opcional para habilitar la resolución activa de CL:

```bash
npm install anci-oiv-resolver
```

Sin el paquete companion, las llamadas a CL caen en el adaptador stub (el
registro público sigue disponible; solo cambia el camino de resolución).

---

## Cómo contribuir un país

Cada país nuevo requiere:

1. **Documentación del marco legal** — `data/countries/{cc}/source.md`
2. **Normalizador de identificador** — `src/normalizers/{tipo}-{cc}.ts`
3. **Adaptador del país** — `src/adapters/{cc}-{regulador}.ts`
4. **Dataset de entidades validado contra JSON Schema** —
   `data/countries/{cc}/known-domains.json`
5. **Tests unitarios + documentación por país**

Los datasets de país son mantenidos por contribuidores residentes en (o con
experticia verificada sobre) el marco normativo de ese país. Ver
[`CONTRIBUTING.md`](CONTRIBUTING.md) y la
[plantilla de issue para nuevo país](.github/ISSUE_TEMPLATE/new-country.yml).

---

## Principios de diseño

1. **Un JSON Schema, muchos países.** Todos los datasets validan contra
   [`data/schema.json`](data/schema.json).
2. **Solo fuentes públicas.** Cada entrada debe citar una publicación
   regulatoria o de registro accesible públicamente. Sin scraping de
   portales privados.
3. **Cuidado por país.** Un dataset de país es mantenido por contribuidores
   locales con experticia verificada en la materia.
4. **Datos versionados, releases semánticos.** Agregar un país es un bump
   `MINOR`, corregir una entidad es `PATCH`, cambios incompatibles de schema
   son `MAJOR`.
5. **Alineado con ISO/IEC 29147:2018 / 30111:2019** como referencia de
   proceso. No es declaración de certificación.

---

## Roadmap

- **Q3 2026** — Estabilización del piloto de 5 países (CL estable · AR · UY ·
  BR · CO).
- **Q4 2026** — Sumar MX · PE · EC y publicar `v1.0.0` estable.
- **Q1–Q2 2027** — Extender a CR · PA · DO · PY · BO · VE · GT · SV · NI · HN.
- **2028+** — 95%+ de cobertura LATAM · cadencia anual de actualización
  alineada con el ciclo de revisión de cada regulador nacional.

Roadmap completo: [`docs/ROADMAP.md`](docs/ROADMAP.md). Gobernanza:
[`docs/GOVERNANCE.md`](docs/GOVERNANCE.md).

---

## Licencia

Apache License 2.0 · ver [LICENSE](LICENSE).

---

## Citación

Citación legible por máquina: [`CITATION.cff`](CITATION.cff).

```bibtex
@misc{mellafe2026latam,
  author       = {Mellafe Zuvic, David},
  title        = {latam-oiv-resolver: Multi-country Critical Infrastructure
                  Operator Resolver for Latin America},
  year         = {2026},
  publisher    = {GitHub},
  version      = {v0.1.0-alpha.1},
  howpublished = {\url{https://github.com/raceksd-source/latam-oiv-resolver}}
}
```

---

## Mantenido por

**Reizan** · compañía independiente de investigación en ciberseguridad.
Operada a través de **AlmaAI SpA** (RUT 78.387.715-5) · La Serena, Chile.

Mantenedor: **David Mellafe Zuvic** · [david@reizan.io](mailto:david@reizan.io)

## Seguridad

Para reportar una vulnerabilidad de forma privada, ver [SECURITY.md](SECURITY.md).
