Skip to content

Repository files navigation

PRAETOR

An agentic M&A due-diligence engine — from data room to deal verdict

Praetor (Lat.): the Roman magistrate who heard a case and rendered judgment.

🌍 Live demo: app on Vercel · app on Hugging Face · backend API  |  Search any company on a 3D globe → watch 9 AI agents run diligence live → cited GO / NO-GO / CONDITIONAL verdict.

PRAETOR ingests a target's public footprint, runs parallel specialist diligence across every workstream, cross-references the findings into a single red-flag register, and renders a defensible GO / NO-GO / CONDITIONAL verdict — with every claim traceable to its source document.

Three ways to start a diligence:

  1. Pick any company on the 3D world globe — search the global GLEIF universe (millions of legal entities), the globe flies to the company's HQ city, and PRAETOR runs screening-led diligence (web search + sanctions/registry screening).
  2. Upload your own company report (PDF / DOCX / TXT / MD / CSV) — the agents read the document, screen the named company, and web-search its current standing.
  3. Run a US ticker through the full SEC EDGAR pipeline (10-K items, DEF 14A, EX-21 subsidiaries, EX-10 contracts, XBRL financials).

Hard rule: real data only. Findings are extracted from genuine sources — SEC EDGAR, the real OFAC SDN list, OpenSanctions, GLEIF (legal-entity identity + global search), GDELT (adverse media), GeoNames (HQ geolocation), and live web search via Groq's compound model. Every finding cites the filing + item/clause, the registry record, or the web source it came from. This is a capability demonstration over public data — not investment advice.

It runs keyless and offline-capable by design: no API keys required, and a deterministic mock stands in for the LLM when none is configured (the LLM only narrates and ranks; facts are extracted deterministically and always cited).

The Groq API key (optional, recommended)

One key unlocks two things, both via the same groq/compound system: live LLM narration in the memos/verdict, and the PULSE agent's live web search for a current-standing factor ("is this company healthy right now?"). Add it to backend/.env:

echo 'GROQ_API_KEY=gsk_your_key_here' >> backend/.env

Without it, narration is templated and PULSE falls back to a keyless GDELT adverse-media baseline — the system still runs end to end and tells you the key is needed.


Quick start

python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cd backend

# Diligence on First Solar (default target), live from SEC EDGAR:
python -m praetor run FSLR

# Any US-listed ticker; write the full cited memo to a file:
python -m praetor run NEE --out ../reports/nextera_memo.md

# Use only cached data (no network), or limit workstreams:
python -m praetor run FSLR --offline --only INTEGRITAS,FISCUS,LEX

Set SEC_USER_AGENT to your own contact (SEC requires it for live pulls):

export SEC_USER_AGENT="PRAETOR-diligence/0.1 (you@example.com)"

Optional keys (.env, see .env.example): GROQ_API_KEY enables live LLM narration; OPENSANCTIONS_API_KEY, COMPANIES_HOUSE_API_KEY, OPENCORPORATES_API_TOKEN enrich INTEGRITAS. None are required.

Frontend (3D globe dashboard)

cd frontend
npm install
npm run dev      # http://localhost:5173 — proxies /api to the backend on :8000

The dashboard: a rotating 3D globe (react-globe.gl) you can search and fly to any company's HQ; a report upload panel; the verdict, diligence heatmap, red-flag register (every row linking to its source), the PULSE current-standing panel, the deal knowledge graph (D3), the valuation-impact layer, human gates, and audit trail.

If the backend isn't on :8000, point the dev proxy at it: PRAETOR_API=http://localhost:8011 npm run dev.

API

cd backend
uvicorn praetor.api:app --reload --port 8000
Method Route Purpose
GET /api/companies/search?q= global company search (GLEIF) with HQ lat/lng for the globe
POST /api/deals/run diligence on a US ticker {ticker, offline, buyer, workstreams?}
POST /api/deals/company screening diligence on a globe pick {name, lei, city, country}
POST /api/deals/upload upload a report (multipart file, company, buyer) and run diligence
GET /api/deals list analysed deals (with HQ coordinates)
GET /api/deals/{id} deal summary + verdict + workstream rollup
GET /api/deals/{id}/findings red-flag register (?workstream=, ?min_severity=)
GET /api/deals/{id}/verdict verdict + valuation-impact layer + cross-refs
GET /api/deals/{id}/graph deal knowledge graph (D3 nodes/links)
GET /api/deals/{id}/memo full Markdown memo
GET /api/deals/{id}/audit audit trail
GET /api/deals/{id}/gates human-in-the-loop gates
POST /api/gates/{id}/resolve sign off a gate {status, resolved_by, note}

Architecture

L0  ORCHESTRATION   praetor/orchestrator.py  — engagement lead: plan, parallel
                    dispatch, shared register, gates, verdict, audit
L1  KNOWLEDGE       praetor/knowledge/       — SQLite medallion lakehouse
                    praetor/deal_factory.py    (bronze/silver/gold), networkx
                    praetor/sources/           deal graph (UBO unwind), hybrid
                                               index (BM25 + hashing embedding),
                                               real data adapters
L2  SPECIALISTS     praetor/agents/          — INTEGRITAS · FISCUS · LEX · AGORA ·
                    (run in parallel)          CENSUS · PEOPLE · CYBER · ESG
L3  SYNTHESIS       praetor/synthesis.py     — cross-reference + valuation impact
                    praetor/tribunal.py        TRIBUNAL: the GO/NO-GO/CONDITIONAL verdict
L4  OUTPUT / HITL   praetor/report.py        — cited memo, register, gates, audit
                    praetor/api.py

Design invariant: every Finding carries source_refs — no claim without provenance. Agents extract findings deterministically from real sources (always cited); the LLM only narrates and ranks, never the source of facts. That is the system's headline anti-hallucination control and its audit story.

Workstreams

Agent Workstream Reads Flags
INTEGRITAS Integrity & background OFAC SDN, OpenSanctions, GLEIF, GDELT, deal graph sanctions, PEP, adverse media, UBO/ownership, ABAC, related-party conflicts
FISCUS Quality of earnings XBRL companyfacts, MD&A revenue trend, margins, cash conversion, leverage, concentration
LEX Legal & contracts EX-10, 10-K Item 3 change-of-control, assignment, indemnity, caps, exclusivity, litigation
AGORA Commercial 10-K Item 1/1A competition, pricing power, demand cyclicality, concentration
CENSUS Tax XBRL, risk factors effective rate, NOLs, transfer pricing, audits
PEOPLE HR proxy, human capital key-person, change-of-control payouts, pensions, labour
CYBER IT / privacy 10-K Item 1C, risk factors, report incidents, IT dependence, GDPR/data-protection
ESG ESG risk factors, Item 3, report environmental liability, climate transition, CSRD/LkSG, governance
PULSE Live web pulse Groq compound web search (or GDELT baseline) current financial health, recent news, controversies → STRONG/STABLE/WATCH/DISTRESSED

Status

  • ✅ L0–L4 backend, verified end-to-end on real data (live + cached): 9 workstreams, synthesis, TRIBUNAL, human gates, audit trail; CLI + REST API.
  • ✅ Three diligence entry points: SEC ticker, uploaded report, globe company pick.
  • ✅ 3D globe dashboard (react-globe.gl + D3): search, fly-to, verdict, heatmap, register with source links, PULSE panel, entity graph, valuation, gates, audit.
  • ✅ Global company search (GLEIF) + offline HQ geolocation (GeoNames).
  • ✅ Live web-search current-standing factor (PULSE via Groq compound; GDELT baseline keyless).
  • ⬜ Richer financials for non-SEC reports (table/figure extraction beyond prose scan).

About

Agentic M&A due-diligence engine: search any company on a 3D globe, 9 AI agents run parallel diligence on real public data (SEC EDGAR, OFAC, GLEIF, GDELT, live web), and render a cited GO/NO-GO/CONDITIONAL verdict.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages