|
| 1 | +<!-- |
| 2 | +SPDX-License-Identifier: CC-BY-SA-4.0 |
| 3 | +SPDX-FileCopyrightText: 2025-2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk> |
| 4 | +--> |
| 5 | + |
| 6 | +[](TOPOLOGY.md) |
| 7 | +[](TOPOLOGY.md) [](https://www.bestpractices.dev/en/projects/new?repo_url=https://github.com/hyperpolymath/InvestigativeJournalist.jl) |
| 8 | +[](https://github.com/hyperpolymath/palimpsest-license) <embed |
| 9 | +src="https://api.thegreenwebfoundation.org/greencheckimage/github.com" |
| 10 | +data-link="https://www.thegreenwebfoundation.org/green-web-check/?url=github.com" /> |
| 11 | +image:<a href="https://img.shields.io/badge/Julia-1.10+-9558B2?logo=julia" |
| 12 | +data-link="https://julialang.org/">Julia</a> |
| 13 | + |
| 14 | +**Structured Evidence for High-Stakes Reporting** |
| 15 | + |
| 16 | +*Turn messy source material into audit-ready investigative artifacts.* |
| 17 | + |
| 18 | +<div id="toc"> |
| 19 | + |
| 20 | +</div> |
| 21 | + |
| 22 | +# Overview |
| 23 | + |
| 24 | +InvestigativeJournalist.jl is a Julia toolkit for managing the |
| 25 | +end-to-end investigative reporting workflow. It provides high-integrity |
| 26 | +structures for ingesting diverse sources, extracting verifiable claims, |
| 27 | +and building a corroboration matrix that minimizes editorial and legal |
| 28 | +risk. |
| 29 | + |
| 30 | +# Core Capabilities |
| 31 | + |
| 32 | +- **Multi-Source Ingestion**: Ingest documents, web snapshots, and |
| 33 | + interview notes with automatic hashing and deduplication. |
| 34 | + |
| 35 | +- **Claim Extraction**: Extract discrete claims and link them to |
| 36 | + entities (people, orgs, places). |
| 37 | + |
| 38 | +- **Corroboration Matrix**: Quantify confidence levels across claims and |
| 39 | + multiple supporting sources. |
| 40 | + |
| 41 | +- **Auditable Provenance**: Every claim in your final draft traces back |
| 42 | + to a cryptographically hashed source document. |
| 43 | + |
| 44 | +- **Timeline & Network Analysis**: Visualize actors and events to detect |
| 45 | + gaps or contradictions in narratives. |
| 46 | + |
| 47 | +# Quick Start |
| 48 | + |
| 49 | +```julia |
| 50 | +using InvestigativeJournalist |
| 51 | + |
| 52 | +# Ingest a source document |
| 53 | +doc = ingest_source("docs/leaked_contract.pdf") |
| 54 | + |
| 55 | +# Extract claims and link to entities |
| 56 | +claims = extract_claims(doc) |
| 57 | +link_entities!(claims) |
| 58 | + |
| 59 | +# Build a corroboration matrix |
| 60 | +matrix = corroborate(claims, all_docs()) |
| 61 | + |
| 62 | +# Generate a publication-ready evidence pack |
| 63 | +pack = generate_publication_pack(story_draft) |
| 64 | +``` |
| 65 | + |
| 66 | +# Suggested Tech Stack |
| 67 | + |
| 68 | +- **Data**: `DataFrames.jl`, `Arrow.jl`, `JSON3.jl` |
| 69 | + |
| 70 | +- **Persistence**: `SQLite.jl` or `DuckDB.jl` |
| 71 | + |
| 72 | +- **Text Analysis**: `TextAnalysis.jl` |
| 73 | + |
| 74 | +- **Visualization**: `Makie.jl` |
| 75 | + |
| 76 | +# Safety & Governance |
| 77 | + |
| 78 | +- **Source Protection**: Support for encrypted fields and redacted |
| 79 | + exports for sensitive whistleblowers. |
| 80 | + |
| 81 | +- **Audit Trail**: Immutable logs for every change in confidence scores |
| 82 | + or claim text. |
| 83 | + |
| 84 | +- **Zero-Unreferenced Policy**: Final publication packages prevent |
| 85 | + inclusion of any claim without a verified evidence link. |
| 86 | + |
| 87 | +# License |
| 88 | + |
| 89 | +Palimpsest-MPL-1.0 License - see [LICENSE](LICENSE) for details. |
0 commit comments