What We Learned We learned that investigative journalism is a graph problem, not a search problem. Traditional approaches look for keywords; real corruption lives in the relationships—donations flowing to officials who then vote for contracts awarded to the donor's company. We also discovered that building reliable AI agents requires deterministic fallbacks at every layer; when ElevenLabs fails or the LLM hallucinates, the system must gracefully degrade rather than crash. Most importantly, we learned that temporal ordering is everything—a donation after a vote is coincidence, but money flowing before a decision is evidence. What's Next for Sentinel Short-term: Scale to all 50 states by integrating federal (FEC, USASpending) and state-level campaign finance APIs. Build a public API so newsrooms can embed Sentinel investigations directly into articles. Medium-term: Add Computer Use agents that automatically file FOIA requests when data is missing, then parse responses. Implement collaborative filtering—when one city's corruption pattern is detected, flag similar patterns in other cities proactively. Long-term: Real-time monitoring dashboards for newsrooms with Slack alerts when new conflicts emerge. Train specialized models on historical corruption cases to improve pattern detection beyond simple graph queries. Partner with ProPublica and local newsrooms to deploy in production. Challenges We Ran Into Graph query complexity: Writing Cypher queries that detect 4-hop conflict paths (donation → employment → vote → contract) while handling temporal constraints and avoiding false positives required deep understanding of graph algorithms. Early versions flagged legitimate business relationships as corruption. Entity resolution at scale: Matching "John Smith" across donation records, employment databases, and meeting minutes when names are misspelled, abbreviated, or use middle initials was brutally hard. We built fuzzy matching with confidence thresholds, but it's still imperfect. Voice narration without hallucination: Getting ElevenLabs to narrate investigations with exact dates, dollar amounts, and names—while maintaining an NPR-style tone—required carefully structured prompts and extensive citation validation. Every claim must trace to a specific public record or the audio becomes misinformation. Data availability: Public records are technically "open" but practically inaccessible—PDFs with embedded images, inconsistent schemas across cities, rate-limited APIs. We spent more time on data wrangling than AI. Accomplishments We're Proud Of Technical depth: We didn't build a ChatGPT wrapper. Our Neo4j conflict detection query performs multi-hop graph traversal with temporal constraints—graduate-level database engineering. The 4-agent pipeline (Pattern Finder → Timeline Builder → Evidence Ranker → Report Compiler) is a legitimate AI orchestration system, not a single LLM call. Zero hallucination architecture: Every single finding cites a specific public record with exact dates and dollar amounts. Our evidence ranking system ensures claims are backed by primary sources (vote records, donation filings) not speculation. End-to-end automation: Input a name, get a visual knowledge graph, a structured investigation report with citations, AND a 3-minute NPR-quality audio briefing—all generated automatically. Most hackathon projects demo one piece; we shipped the full stack. Real-world impact potential: This isn't a toy. ProPublica's entire annual output (12 investigations) could be matched in 2 days with Sentinel. Local newsrooms that can't afford investigative teams could suddenly hold power accountable. How We Built Sentinel Data Layer: Neo4j knowledge graph stores 6 entity types (Officials, Companies, Contracts, Donations, Persons, Properties) and 5 relationship types. We wrote custom Cypher queries to detect conflict patterns: MATCH (official)-[:VOTED_FOR]->(contract)-[:AWARDED_TO]->(company) WHERE donation.date < vote.date. Data ingestion combines API calls (FEC, USASpending), Anthropic's Computer Use for web scraping (SF Ethics, Board of Supervisors minutes), and PDF parsing with OCR. AI Agents: Four specialized agents built with Dedalus ADK run sequentially. Agent 1 (Pattern Finder) detects statistical anomalies—donation amounts 3σ above median, timing gaps <90 days between money and votes. Agent 2 (Timeline Builder) reconstructs chronological narratives with exact day counts. Agent 3 (Evidence Ranker) scores documents on directness, reliability, specificity, and connection strength. Agent 4 (Report Compiler) synthesizes findings with Claude, enforcing citation requirements via structured output parsing. Voice Generation: ElevenLabs "Drew" voice generates NPR-style narration from investigation reports. We use SHA-256 content hashing for audio caching—same script always maps to same MP3, preventing redundant API calls. Script templates enforce 150 WPM pacing and epistemic caution ("evidence suggests" not "proves"). Frontend: Next.js with D3.js force-directed graph visualization. Interactive nodes show entity details on click; edges display relationship types and dates. Custom audio player with progress tracking. Real-time agent status panel animates the 4-box workflow during investigations. Infrastructure: FastAPI backend orchestrates Neo4j queries, agent pipeline, and voice generation. Vultr hosts the graph database and handles OCR for scanned documents. Entire stack runs in Docker for reproducibility. Tech Stack: Neo4j • Anthropic Claude (Computer Use + Agents) • Dedalus ADK • ElevenLabs • FastAPI • Next.js • D3.js • Vultr

Share this project:

Updates

Submission history