Saltar al contenido

Base de datos

Tres stores de datos

StoreTecnologiaRutaProposito
Cache OSINTSQLitedata/osint_cache.dbCache de resultados de herramientas
InvestigacionesSQLitedata/osint_ai.dbInvestigaciones, evidencias, entidades, claims
EmbeddingsChromaDBdata/chroma/Busqueda semantica sobre evidencias

SQLite — Cache OSINT (osint_cache.db)

Tabla simple de cache con TTL:

CREATE TABLE cache (
key TEXT PRIMARY KEY, -- Hash de (tool_name + input)
value TEXT, -- Resultado JSON serializado
created_at REAL, -- Unix timestamp
expires_at REAL -- Unix timestamp (created_at + TTL)
);

El TTL se controla con CACHE_TTL_SECONDS (default: 86400 = 24h).

SQLite — Investigaciones (osint_ai.db)

8 tablas que cubren el ciclo completo de investigacion:

investigations

CREATE TABLE investigations (
id INTEGER PRIMARY KEY AUTOINCREMENT,
slug TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
goal TEXT,
status TEXT DEFAULT 'active', -- active, archived
created_at TEXT,
updated_at TEXT,
metadata TEXT -- JSON con info adicional
);

evidences

CREATE TABLE evidences (
id TEXT PRIMARY KEY, -- ev_<uuid>
investigation_id INTEGER,
sha256 TEXT UNIQUE, -- Para deduplicacion
source TEXT, -- Ruta o URL original
source_type TEXT, -- pdf, txt, html, url, osint_result
credibility_tier INTEGER, -- 1 (alta) a 3 (baja)
extracted_text TEXT,
metadata TEXT, -- JSON
ingested_at TEXT
);

entities

CREATE TABLE entities (
id TEXT PRIMARY KEY, -- ent_<uuid>
investigation_id INTEGER,
type TEXT, -- Person, Company, Domain, IP, etc.
name TEXT NOT NULL,
normalized_name TEXT,
identifiers TEXT, -- JSON: {dni, cif, iban, email...}
metadata TEXT,
created_at TEXT,
updated_at TEXT
);

relationships

CREATE TABLE relationships (
id TEXT PRIMARY KEY,
investigation_id INTEGER,
from_entity_id TEXT,
to_entity_id TEXT,
relation_type TEXT, -- owns, controls, member_of, etc.
evidence_id TEXT, -- Evidencia que respalda la relacion
confidence REAL, -- 0.0 - 1.0
metadata TEXT,
created_at TEXT
);

claims

CREATE TABLE claims (
id TEXT PRIMARY KEY, -- clm_<uuid>
investigation_id INTEGER,
text TEXT NOT NULL, -- La afirmacion en lenguaje natural
evidence_id TEXT, -- Evidencia fuente
chunk_id TEXT, -- Fragmento especifico
snippet TEXT, -- Texto exacto del que se extrae
status TEXT DEFAULT 'unverified', -- verified, disputed, unverified
verified_by TEXT,
verified_at TEXT,
created_at TEXT
);

alerts

CREATE TABLE alerts (
id TEXT PRIMARY KEY,
investigation_id INTEGER,
alert_type TEXT, -- entity, search, feed
target TEXT, -- Entidad o query a monitorizar
frequency TEXT, -- daily, weekly, realtime
last_run TEXT,
last_result TEXT,
active INTEGER DEFAULT 1,
created_at TEXT
);

ChromaDB (data/chroma/)

Una coleccion por investigacion: osint_<slug>.

Cada chunk de evidencia se almacena con:

{
"id": "ev_001_chunk_003",
"embedding": [...], # 384 dimensiones (MiniLM-L12)
"document": "...texto del chunk...",
"metadata": {
"evidence_id": "ev_001",
"source": "informe-registral.pdf",
"chunk_index": 3,
"investigation_slug": "caso-acme"
}
}

Scripts CLI de utilidad

En .claude/skills/_shared/scripts/:

ScriptComandos disponibles
puruto_db.py47 comandos CRUD completos para investigaciones
puruto_vector.pyOperaciones ChromaDB (search, upsert, delete)
puruto_hash.pyCalculo y verificacion de hashes SHA-256
puruto_normalize.pyNormalizacion de entidades espanolas
puruto_alerts.pyEjecucion de alertas programadas

Ejemplo de uso directo

Ventana de terminal
# Ver resumen de la investigacion activa
SLUG=$(cat data/.active)
python3 .claude/skills/_shared/scripts/puruto_db.py investigation-summary --slug "$SLUG"
# Listar entidades
python3 .claude/skills/_shared/scripts/puruto_db.py list-entities --slug "$SLUG"
# Busqueda semantica
python3 .claude/skills/_shared/scripts/puruto_vector.py search \
--slug "$SLUG" \
--query "contratos con proveedores chinos" \
--n 5

Investigacion activa

El slug de la investigacion activa se guarda en:

data/.active
Ventana de terminal
cat data/.active # Ver investigacion activa
echo "caso-acme" > data/.active # Cambiar investigacion activa manualmente

Todos los skills de Claude Code leen data/.active automaticamente.