Base de datos
Tres stores de datos
| Store | Tecnologia | Ruta | Proposito |
|---|---|---|---|
| Cache OSINT | SQLite | data/osint_cache.db | Cache de resultados de herramientas |
| Investigaciones | SQLite | data/osint_ai.db | Investigaciones, evidencias, entidades, claims |
| Embeddings | ChromaDB | data/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/:
| Script | Comandos disponibles |
|---|---|
puruto_db.py | 47 comandos CRUD completos para investigaciones |
puruto_vector.py | Operaciones ChromaDB (search, upsert, delete) |
puruto_hash.py | Calculo y verificacion de hashes SHA-256 |
puruto_normalize.py | Normalizacion de entidades espanolas |
puruto_alerts.py | Ejecucion de alertas programadas |
Ejemplo de uso directo
# Ver resumen de la investigacion activaSLUG=$(cat data/.active)python3 .claude/skills/_shared/scripts/puruto_db.py investigation-summary --slug "$SLUG"
# Listar entidadespython3 .claude/skills/_shared/scripts/puruto_db.py list-entities --slug "$SLUG"
# Busqueda semanticapython3 .claude/skills/_shared/scripts/puruto_vector.py search \ --slug "$SLUG" \ --query "contratos con proveedores chinos" \ --n 5Investigacion activa
El slug de la investigacion activa se guarda en:
data/.activecat data/.active # Ver investigacion activaecho "caso-acme" > data/.active # Cambiar investigacion activa manualmenteTodos los skills de Claude Code leen data/.active automaticamente.