Investigation Management
import { Aside } from ‘@astrojs/starlight/components’;
What is an investigation
An investigation is a persistent container that groups:
- Evidence: documents, files, OSINT results ingested with SHA-256 checksums
- Entities: people, companies, domains, IPs… extracted from evidence
- Claims: verifiable assertions with complete traceability back to source evidence
- Reports: 9-section documents generated at the end
Everything persists in SQLite + ChromaDB and survives between sessions.
Directory structure
investigations/<slug>/├── evidencias/ # Original files (with SHA-256 hash in filename)├── hallazgos/ # Intermediate outputs (OSINT results in JSON)├── informes/ # Generated reports (Markdown)└── metadata.json # Investigation metadataLifecycle
1. Create the investigation
# From the interactive CLIosint-agent investigation create "Acme Corp Case" --goal "Due diligence"
# Or with the Claude Code skill/investigation-init "Acme Corp Case" --goal "Due diligence"Creates the directory structure, registers the investigation in SQLite, and initializes the ChromaDB collection.
2. Ingest evidence
/evidence-ingest corporate-report.pdf/evidence-ingest contract-2024.docx/evidence-ingest https://example.com/press-releaseThe complete pipeline:
File/URL ↓ SHA-256 hash (dedup: if exists, skip) ↓ Text extraction (PDF/TXT/HTML/MD) ↓ Chunking (overlapping fragments) ↓ Embeddings (multilingual sentence-transformers) ↓ Storage in ChromaDB ↓ Registration in SQLite with metadata3. Investigate IOCs (and save as evidence)
/osint-investigate "acme-corp.com"/osint-investigate "185.220.101.34"The OSINT agent result is automatically saved as evidence in the active investigation.
4. Extract entities
/entity-extractExtracts and normalizes entities from all ingested evidence according to FTM ontology:
- People (with name normalization)
- Companies (with business registry normalization)
- Domains, IPs, emails, phones, bank accounts (IBAN)
- Events, locations, documents
5. Register and verify claims
/claim-track "Acme Corp is registered in Madrid according to corporate report"/verify-claimsEach claim is stored with:
evidence_id: the supporting evidencechunk_id: the specific fragmentsnippet: the exact text where it was extracted fromstatus: VERIFIED / DISPUTED / UNVERIFIED
6. Semantic search
/memory-query "contracts with Chinese suppliers"Searches ChromaDB using embeddings — finds relevant information even when exact words don’t match.
7. Generate report
/report-generateGenerates a 9-section report in investigations/<slug>/informes/:
- Executive summary
- Objective and scope
- Methodology
- Verified findings
- Identified entities
- Evidence
- Risk analysis
- Limitations and warnings
- Recommended next steps
Active investigation
Only one investigation can be “active” at a time. It’s saved in data/.active:
osint-agent investigation use acme-case# → writes "acme-case" to data/.activeClaude Code skills read data/.active automatically.
Managing multiple investigations
osint-agent investigation list # List all investigationsosint-agent investigation use <slug> # Activate an investigationosint-agent status # Status of active investigationosint-agent limits # Monthly operation quotas| Variable | Default | Description |
|---|---|---|
ACTIVE_INVESTIGATIONS_LIMIT | 5 | Max simultaneous active investigations |
MONTHLY_OPERATIONS_LIMIT | 100 | Monthly operations quota |