Model Changelog

Public release notes · updated 12 May 2026

This is a curated public release log for material methodology changes. Internal release notes are more granular; entries here are selected for relevance to clients evaluating model integrity. See the methodology page for the canonical model specification.

2026 — Q2

v9.2.65 – v9.2.70
May 5 – May 12, 2026
CFA universal source-authority surfacing

Six-version sequence closing CFA Standard V(A) Diligence / Reasonable Basis and V(B) Communication / Fact-vs-Opinion at the display layer. Every factual datapoint on the platform now carries a machine-classified provenance tier (PRIMARY / SECONDARY / PROMOTED / TERTIARY / SEEDED), surfaced as a coloured badge on earnings, MD&A NLP, news sentiment, macro values, and technical signals. Ratio metrics inherit the weakest input's authority. Restatement preservation via database trigger (earnings_actuals_history) closes Standard III(D); a corroboration staging table closes V(A) at the ingestion entry point.

v9.2.62
May 1, 2026
NGX X-Filings self-sustaining capture

Unit-aware PDF parser, scheduler that polls the SharePoint feed every 30 minutes and parses pending PDFs every 4 hours, dual-write semantics that land structured financials in fundamentals and earnings_actuals on every successful parse. Default-to-fail unit detection (missing beats wrong-by-1000×) with quarantine routing. Connection- ordering regression in the overlay pipeline corrected so the v9.2.27 calibrated risk pills (Garman-Klass volatility, distribution- day count, max() composite) re-attach to live rankings.

v9.2.58
April 30, 2026
Earnings capture pipeline self-sustaining

Architectural pivot from hardcoded MARKET_EXPECTATIONSto database-canonical earnings_actuals. The intelligence-feed parser already ingested releases on a 2-hour cadence; the overlay now reads them. New/api/earnings/freshness endpoint exposes coverage, capture latency, and source-mix metrics with a four-tier health classification monitored by the Data Sentinel agent.

v9.2.53
April 30, 2026
Macro freshness ladder calibrated to release cadence

Per-series freshness thresholds widened to match actual NGX publication cadence (CPI monthly with ~15d publication lag; MPC cycle ~85d). The prior universal 1/3/7-day ladder was flagging legitimately-current data as stale on quarterly inputs. Health calculation for the Agent Operations dashboard rate-based with a new WARNING tier between HEALTHY and DEGRADED so transient failures are visible without dominating headline state.

v9.2.27e
April 29, 2026
Composite risk pill (max-operator)

Single risk pill combining 20-day Garman-Klass volatility and 25-day distribution-day count via the max() operator. Five composition schemes tested; only max() cleared the ship threshold. Spearman IC +0.5053 against forward 10-day drawdown, top-vs- bottom quintile separation 5.84×. Documents the structural insight that weighted-average composites dilute strong frontier- market signals; max() preserves the loudest scream without watering down the strong signal toward the weaker one's noise.

2026 — Q1

v9.0.0
April 2026
MD&A NLP signal + earnings surprise factor

Factor stack expanded from seven to nine factors. Weights rescaled uniformly by 0.9× to allocate 10pp to two alternative-data signals: a 120-phrase Nigeria-tuned MD&A lexicon at 8% weight and an earnings-surprise factor at 2% weight. NLP scores are section-weighted (outlook 1.2×, auditor 1.5×, chairman 0.6×) with a negation window that flips polarity on negated phrases.

v9.0.4 – v9.0.5
April 21, 2026
Two-stage DDM + value-trap detection

Regime-conditional ERP premium and margin-of-safety bands. Banking-sector valuation uses a two-stage Damodaran dividend discount model (five-year explicit stage at sustainable growth, Gordon tail at 4% Nigerian long-run nominal GDP floor) because single-stage Gordon goes pathological at the ROE × retention levels Nigerian banks routinely produce. YoY EPS trajectory and sector-aware leverage adjustments catch value-trap configurations that the underlying value composite alone misses.

v8 – v9 portfolio backtest
April 2026
Point-in-time universe construction

New sector_map_history audit table seeded from the minimum factor-scores run-date per ticker. The portfolio backtest now queries this table for the universe-as-it-existed at each historical rebalance date, replacing the previous current-snapshot assumption. Survivorship bias eliminated; backtest results now reflect what an operator could have actually traded at each historical point.

2026 — Q1 (earlier)

v7.6.0
March 29, 2026
HMM regime breadth data quality

Replaced silent 0.5 substitution for missing NGX market-breadth observations with inverse-distance-weighted imputation from nearest months with real data. Per-month breadth coverage tracking; confidence haircut up to 20% when imputed-month share exceeds 30%; regime_uncertainty_flag fires when coverage drops below 50%. The HMM no longer learns corrupted transitions from fabricated neutral observations.

v7.5.0
March 29, 2026
PAI real-data upgrade

Three of five Port Activity Index components migrated from synthetic/demo data to real feeds: AIS vessel tracking via aisstream.io WebSocket (35% weight), RSS-based news sentiment from Ships & Ports + Nairametrics (8% weight), and freight pressure via FRED Brent crude (25% weight). Dynamic confidence ceiling now responds to per-source freshness rather than a hardcoded 5.5 / 10 cap.

v7.3.0
March 29, 2026
Factor-engine circuit breaker

Three-state breaker (CLOSED / OPEN / HALF_OPEN) on the factor- response builder with last-known-good persistence and a four-tier degradation chain (fresh → cached → raw-DB → 503-recovery). Five downstream consumers (/api/factors, /api/session, /api/retail, /api/rebalance/targets, /api/chat) all serve last-known-good rather than empty when the builder is unavailable.

v7.2.0
March 29, 2026
Self-healing seed values

Hardcoded macro fallbacks replaced with a self-healing loop: scrapers write to macro_data on success; get_seed_value() reads the latest verified row before falling back to a hardcoded last-resort constant. The fallback is now “last successful scraper run” not “last code deploy”, so seeds stay current without operator intervention. New /api/seeds/statusendpoint surfaces per-seed freshness ratings.

2026 — Earlier history

v6.6.0
March 17, 2026
CFA-grade model integrity sweep

Seven fixes targeting model-assessment gaps: MIE insider-dealings staleness recalibrated to the NGX weekly filing cadence; dynamic carry threshold wired to the /api/factors pipeline (previously defined but never invoked); aggregate overlay cap enforcement post-all- overlays; factor IC tracker bootstrap from up to twelve months of historical scores (no synthetic data); weekly cross-source price validation against Yahoo Finance; PAI confidence ceiling computed dynamically from per-source freshness.

v5.4.0
March 14, 2026
Institutional ops guard

Eight-capability ops module: multi-channel alert dispatcher with throttling, data anomaly detector with price-and-macro sanity bounds, circuit-breaker pattern for the database / EODHD / macro APIs, stale-on-error cache, corporate-action detector (split and reverse-split detection from price ratios), enhanced audit wrapper, API response-timing middleware, EODHD price guard. All configurable via Railway environment variables for production alert routing.

v5.3.0 – v5.3.1
March 11, 2026
Overlay completeness + rebalancing engine

Three new overlays (FX direction, regime-conditional signal thresholds, carry-adjusted alpha) close the alpha pipeline to its current six-layer shape. New rebalancing module with three- tier policy: quarterly full rebalance (30% turnover cap), monthly tactical (10% turnover cap with momentum delta), and 24-to-48-hour event-triggered rebalances on CBN MPC, regime flips, GMF, Brent ± 15%, or sovereign rating actions.

Methodology principles

Behind every release in this changelog sits a small set of institutional disciplines:

  • Calibrate before shipping. Numeric thresholds, weights, and bands trace to either a cited source, a documented probe, or a live input.
  • Fail honestly. Missing data renders as missing. Stale data renders as stale. The display is never given a fallback the underlying source cannot defend.
  • Audit at the database, not the application.Restatement history is trigger-backed because application-level history is bypassable.
  • Distinguish fact from opinion. Every displayed value carries a source-authority tier the user can see and click through.
  • No advisory language. Model labels are HIGH CONVICTION / OVERWEIGHT / NEUTRAL / UNDERWEIGHT, never BUY / SELL / HOLD.

The full institutional context for each release lives in the codebase and the model owner's engineering notes; this page publishes the operator-visible summary.