Hash-chained audit log
Every pipeline step is written to an append-only log. Each entry hashes all of its stored fields and links to the previous one, so edited and deleted entries are detected.
$ python main.py audit --verify02How it works
Mint marks work done by rules you can read. Violet marks text written by the model. The model only ever sees candidates the engine has already confirmed.
SEC EDGAR, NGX, NSE Kenya and JSE SENS disclosures, African and global news, in parallel. Each source fails on its own without blocking the run.
filings + news inside the lookback window
115 patterns across 8 signal types. A source must name the company, and the event must be in the same clause as the name.
signal candidates, or none
Rule strength sets the severity band; CRITICAL needs two independent sources. Confidence is measured: how often past flags of the same type and severity were confirmed in a walk-forward backtest. Live outcomes take over once 10 exist.
severity + measured hit rate
The LLM writes the headline, evidence list and reasoning for each confirmed candidate. It cannot add, remove, retype or re-grade a signal; it can only flag doubt.
analyst-language explanation
Alpha score from severity, source credibility, corroboration, recency and liquidity, with the measured move that followed similar flags and an evidence-quality breakdown.
0–100 alpha, direction, review flags
17 compound-event rules: credit risk followed by distress escalates; insider selling before a miss is flagged, buying into a beat is not. Boosts re-check the human-review threshold.
compound events, systemic risk level
The LLM drafts the executive summary. It cannot rate the brief below its most severe signal. If the LLM is down, the brief is built from the findings and flagged.
the brief
Warehouse, company risk memory, entity graph and the hash-chained audit log. Re-runs do not recount the same event.
history for backtests, replay and monitoring
06Scoring
The alpha score ranks how actionable a signal is. The evidence-quality breakdown shows how well supported it is. The move shown with each signal is what actually followed similar flags, with its sample size.
rule-strength band
SEC and exchanges 1.0, Reuters 0.95
independent sources
14-day half-life from publication
live market cap in USD
The weights are design choices, not fitted values. The backtest tests whether a higher alpha means more confirmed events: so far confirmations rise from 8% in the lowest third of scores to 24% and 36% in the highest. Scores of 70 or more, and every CRITICAL signal, require human review.
67%
Reasoning shown in the brief: “Confidence reduced by: single-source (1 corroboration), signal age reducing temporal relevance.”
08Built for review
Compliance, risk and investment committees ask the same question: how do you know? Every part of the system is designed to answer it.
Every pipeline step is written to an append-only log. Each entry hashes all of its stored fields and links to the previous one, so edited and deleted entries are detected.
$ python main.py audit --verifySuppresses low-confidence signals before the LLM sees them and records what was suppressed. Evidence remains linked to its source; attribution doubts and signals requiring further review are explicitly flagged.
$ analyse --complianceRe-runs a stored analysis as of its original date through the same rules, calibration and compound-event logic, and records the feedback data it calibrated with.
$ replay --company Intel --date 2026-08-01Monitoring alerts on a new event or an escalation, records whether the webhook was delivered, and never re-counts an event it has already seen.
$ monitor --run --interval 3600Outcomes are labelled automatically: the move net of a market benchmark, and whether a later SEC filing confirmed the event. Each prediction is scored once, with precision, recall against SEC-confirmed events, and hit rate.
$ outcomes --auto-labelFractional weights are normalised, holdings without a risk profile are reported as coverage rather than counted as zero risk, and contagion pairs are surfaced.
$ portfolio --name fund --risk