Skip to content

Analysis zone ​

Curves, financials, ratios, credit lab, review grids, risk, contradictions, regulatory.

ANALYSIS ​

ANALYSIS is where a number is either calculated or checked against a rule. The open deal still matters for financials, ratios, the credit lab, contradictions, regulatory findings, and the COSUMAF header. Curves and the COSUMAF rule engine also use their own market and checklist data.

Sovereign curves and the fixed-income terminal ​

Routes/workspace/sovereign-curves and /workspace/fixed-income-terminal
SidebarSovereign Curves. The monitoring item Auctions & Calendars opens the same URL.
Same componentFixedIncomeTerminalView

Purpose. Build a yield curve for CEMAC treasuries from auction results, then use that curve to price a new bond and to see which listed bonds look cheap or expensive.

What it does. Title Courbes souveraines. Detail: Nelson-Siegel and cubic splines for Cameroon, Gabon, Congo, and Chad. The spline model exists in code and is not what the screen draws. The fitted model is always Nelson-Siegel.

Header KPIs come from sample JSON, not from the fit: TIAO BEAC 5.00% (Taux d’intérêt des appels d’offres, the central bank’s main auction rate), Prêt marginal 6.75% (the rate banks pay for emergency central-bank cash), and a count of ingested auctions.

Four tabs:

  1. Courbes. Issuer and curve-mode filters sit in one compact toolbar on the chart card (segmented codes ALL / CMR / GAB / COG / TCD and modes Spot / Forward / DF). The chart plots the selected countries. Badges show R² and RMSE in basis points. A reference line is drawn at 5.00% and labeled TIAO. A HUD lists Nelson-Siegel parameters β₀, β₁, β₂, and λ, plus R², RMSE, and max residual. If the issuer is not Cameroon, it also shows the 5-year spread versus Cameroon. A table gives the model yield at standard tenors from 13 weeks to 10 years, and spreads of Gabon and Congo versus Cameroon.
  2. Structuration. A new-issue pricer. You set the name, amount (default 50 billion FCFA), tenor (default 5 years), coupon (default 6.5%), credit spread versus the curve (default +25 bp), and either linear amortization or bullet (In Fine), with an optional grace period. Outputs: market yield (curve yield + spread), theoretical price, modified duration, Macaulay duration, and DV01. A stress table shocks the rate from −100 bp to +100 bp and shows the arranger’s profit or loss if they underwrite the bond. A cash-flow schedule lists principal, coupon, discount factor, and present value by year.
  3. Valeur relative. Three banners and two tables. The 2-year versus 10-year slope for Cameroon is computed from the fitted curve. The Gabon-versus-Cameroon 5-year premium banner is hardcoded at +104 bps with badge SURVEILLANCE, and the “2 buy signals / +40 to +48 bp” banner is also hardcoded. The bond table recomputes cheap/fair/rich from sample secondary quotes against the fitted curve. A second table is the sovereign spread matrix versus Cameroon, with a z-score.
  4. Adjudications. Filter by issuer and by BTA or OTA. A paste box runs parseBEACBulletin on text you paste, with a demo button that loads four lines. The ledger itself is the sample auction file. Coverage (bid-to-cover) is colored against 1.20x in the UI only.

Data. Sample file locus-web/data/fixed_income/sample_data/cemac_sovereign_data.json, fitted by NelsonSiegelEngine inside CurveEvaluator.fitSovereignCurve. Curves are fitted for CMR, GAB, COG, and TCD only.

The spot yield at maturity t (in years) is the Nelson-Siegel function:

text
y(t) = β0 + β1 * ((1 - e^(-t/λ)) / (t/λ)) + β2 * (((1 - e^(-t/λ)) / (t/λ)) - e^(-t/λ))

If t is essentially zero, the code returns β0 + β1. Calibration searches λ from 0.2 to 5.0 in steps of 0.05 and solves β₀, β₁, β₂ by weighted least squares. Weights are the square root of the amount allotted, in billions of FCFA. Fits with a negative β₀ are skipped. Fewer than three points returns a hardcoded parameter set. R² is 1 - ssRes/ssTot, floored at 0. RMSE is the square root of the mean squared yield error.

Forward rate: f(t) = β0 + β1*e^(-t/λ) + β2*(t/λ)*e^(-t/λ).

Discount factor: P(t) = exp(-y(t)/100 * t). The chart shows that times 100.

Bond math in the pricer (one payment per year):

  • Clearing yield = curve yield at the tenor + credit spread.
  • Bullet debt pays all principal on the last date. Amortizing debt spreads principal over the years after the grace period.
  • Macaulay duration = the present-value-weighted average time until you receive cash.
  • Modified duration = Macaulay / (1 + yield).
  • DV01 = price in FCFA × modified duration × 0.0001.
  • Clean price is set equal to dirty price, with a comment that this assumes the issue date is today (no accrued coupon yet).
  • The “breakeven coupon” shown on the slider is set equal to the clearing yield. A comment says an amortizing bond should solve for the coupon; the code does not.
  • Underwriting fee suggestion = max(1.25%, modified duration × 0.35% + 0.5%).
  • Profit and loss of a rate move = change in price percent × nominal. The narrative also states the loss for a 25 bp widening as duration × 0.25% × nominal.

Relative value: fair yield is the issuer curve at the bond’s remaining tenor (Cameroon if that issuer has no curve). Spread in bp = (market yield − model yield) × 100. At least +30 bp is ACHAT ALPHA (cheap). At most −25 bp is SURÉVALUÉ (rich). Between those, JUSTE PRIX.

Z-score on the sovereign matrix is spreadBps / 35 - 2.5. That is a display scaling, not a statistical z-score from a history of spreads. The market-radar page has a separate, genuine z-score against a stated mean and standard deviation.

Terms.

  • Yield curve / courbe des taux. Yields of the same issuer’s debt plotted against maturity. Reading it tells you the market’s price of lending for 3 months versus 10 years.
  • Spot. The yield from today to that maturity. Forward. The rate the curve implies for a loan that starts later. Discount factor. The present value of 1 FCFA received at that date. If the 5-year discount factor is 0.70, a 100 FCFA payment in five years is worth 70 today at the curve’s rates.
  • Nelson-Siegel. A four-parameter curve used by central banks because it is smooth and needs only a handful of bonds. β₀ is the long-term level. β₁ drives the short end (the slope). β₂ drives the belly (curvature). λ sets how fast the short-end effect dies. Diebold-Li is the dynamic version of the same formula; the HUD mentions it because the calibration solves those three betas.
  • R². Share of auction-yield variation the curve explains. Close to 1 means the auctions sit near the curve. RMSE. Typical miss, here shown in basis points.
  • TIAO. BEAC’s tender rate, the policy rate banks bid against. The marginal lending rate is the penalty ceiling. A deposit facility at 0% (in the sample file, not on this header) is the floor banks earn on cash parked at the central bank.
  • Tenor. The length of the instrument. 52S means 52 weeks.
  • Primary versus secondary. Primary is the auction where the treasury sells new paper. Secondary is later trading on BVMAC. Alpha here means a secondary price that disagrees with the primary curve: you might buy the cheap one.
  • Bid-to-cover / taux de couverture. Demand divided by the amount offered. 1.10x means investors bid for only 10% more than the state wanted to sell. The product treats a low cover, together with a higher yield, as a weak auction. 2.15x is a strong one.
  • Souscription / prise ferme. Underwriting. The arranger promises to buy the bonds that investors do not take, and holds the price risk until they are sold. The stress table is that inventory risk. A commission d’arrangement is the fee charged for organizing the deal; the cockpit suggests a minimum fee that scales with duration so the fee covers a rate wobble during the selling period.
  • In fine / bullet. All principal at maturity. Amortissable. Principal paid down over time. Différé / grâce. A grace period during which principal is not yet repaid.
  • Prime / décote. Price above 100 is a premium (coupon higher than the required yield). Price below 100 is a discount.
  • Convexity. A second-order price effect stored in the math module. The terminal’s KPI strip shows duration and DV01, not convexity.
  • Steepener. A trade that profits if the curve gets steeper (long rates rise relative to short rates). The badge on the slope banner is hardcoded, not inferred from a position.
  • Z-score. How many standard deviations a point sits from a mean. On this tab the formula is the display scaling above. On Market Radar it is (observed − mean) / sigma.

Business value. An arranger prices a new CEMAC bond off the sovereign curve, then adds a credit spread. A portfolio manager uses the same curve to see which bonds are cheap. A treasury uses the auction ledger to see whether demand is there before they announce the next size. The business decision on the structuring tab is “what coupon clears, and how much money do we lose if yields move 25 bp before we place the bond?”

Use case. Leave the issuer on Gabon, tenor 5 years, spread +25 bp. Read the clearing yield (Gabon 5-year spot plus 0.25%). Read DV01: that is the FCFA loss per 1 bp if L’Archer holds the deal. Open the stress row at +25 bp and compare it with the suggested arrangement fee. Then open Valeur relative and see which BVMAC lines the engine marks ACHAT ALPHA.

What changes between the two URLs. Nothing on the page. fixed-income-terminal is the target of the portfolio shortcut, the alerts card, and the market-radar button. sovereign-curves is the sidebar entry. Auctions & Calendars is a second sidebar link to sovereign-curves.

Next. Market radar, for the auction that moved. Instruments, for the listed line you want to compare.

Financials (SYSCOHADA) ​

Route/workspace/financial-tables
SidebarFinancials
Default forCredit analyst

Purpose. Read the borrower’s official accounts in SYSCOHADA form, year by year, and open the page of the PDF each line came from.

What it does. Title Lecture SYSCOHADA. Detail: historical series tied out to the Central Africa Deloitte statements (that attribution is copy). Two badges always show success: Actif = Passif and VA − Personnel = EBE. Those identities are real checks inside computeSyscohadaRatios (absolute difference under 1 FCFA). This table does not recompute them; it displays the stored lines and paints the badges green.

Tabs: Compte de résultat (income statement), Bilan actif (assets), Bilan passif (liabilities and equity).

Columns: line label, a source button, one column per period, and TCAM (21-23). The growth figure is not a compound annual growth rate. It is (last − first) / abs(first). The column title stays TCAM (21-23) even if the periods you pass in are different. A missing source shows an em dash. When the period carries SoR source_citations, the source button opens that citation (page + optional bbox). Periods without SoR citations may still use legacy sheet defs; the UI does not invent coordinates when a SoR citation exists but has no bbox.

Income-statement lines, in the order a credit analyst reads them:

LineFieldPlain meaning
Chiffre d'affairesrevenueSales
Valeur ajoutéevalue_addedSales minus the goods and services consumed to produce them
Charges de personnelpersonnel_expensesWages and social charges
EBE / EBITDAebitdaValue added minus personnel, in a clean file. The badge claims this identity.
Dotations aux amortissementsdepreciation_amortizationThe year’s allocation of the cost of long-lived assets
Résultat d'exploitation (REX / EBIT)ebitOperating profit after that allocation
Charges financièresfinancial_expensesInterest and fees
Résultat netnet_incomeProfit after interest and tax

Asset lines: net fixed assets (dams, networks), inventories, trade receivables, cash, total assets.

Liability lines: equity, long-term financial debt, short-term financial debt, trade payables, tax and social payables, total liabilities.

Data. currentProject.financial_periods from SoR: after OCR on a financial PDF, DossierAnalyticsService writes FinancialStatements + ExtractedCells and the deal GET maps them into periods. A fresh dossier with no FS upload shows an empty table. Analyst cell overrides remain on /api/locus/deals/{id}/cells/{cellId}/override.

Terms.

  • Bilan. The balance sheet. Assets are what the company controls. Equity and liabilities are how those assets were financed. They total to the same number if the file is complete. Actif = Passif is that check.
  • Compte de résultat. The income statement for one year. It is a flow. The balance sheet is a stock at the closing date.
  • Valeur ajoutée. The value the company itself created. For a utility it is mostly the tariff minus purchased inputs.
  • Amortissement. Spreading the cost of a dam or a network over its life. It is an accounting charge. It is not cash leaving the bank this year. That is why lenders often look at EBE (before this charge) and then subtract real capital spending separately.
  • Capex. Cash spent to buy or renew fixed assets. On the ratio page it is subtracted when computing cash available for debt. It is not on this table.
  • Créances clients. Money customers owe the company. In this region a large slice can be the state paying late. That becomes the “receivables stretch” shock in the credit lab.
  • Dettes financières. Borrowed money, as opposed to supplier payables or tax payables. Only financial debt goes into leverage.
  • Capitaux propres. Equity: share capital, reserves, retained earnings. The residual after liabilities.
  • TCAM. Literally a compound growth rate. This column is a simple total change from the first year to the last. Read it as “how much did this line move from 2021 to 2023,” not as a per-year compound rate.
  • Deloitte Afrique Centrale. The copy attributes the series to audited statements. The numbers are the seed, and citations point at 01_seeg_etats_financiers_syscohada_2023.pdf.

Business value. Every covenant is a ratio of these lines. If the identity Actif == Passif fails, the regulatory and ratio engines flag UNRECONCILED and block automated covenant certification. In production, this balance sheet reconciliation identity is evaluated directly via the C# PostgreSQL SoR (GET /api/locus/deals/[id]/reconciliation), and any manual analyst adjustments require mandatory human justification and append to the immutable audit log (POST /api/locus/deals/[id]/cells/[cellId]/override). This screen is where a credit analyst sees the lines, the source citations, and overrides before trusting the cockpit.

Use case. Open SEEG, income statement, click the EBE source, and confirm 34.85 billion on the PDF citation. Then open the liability tab and read long-term debt 84.5 billion, of which the citation says 4.2 billion is pledged. That 4.2 billion is the negative-pledge fight on the later pages.

Next. Ratios.

Ratio cockpit ​

Route/workspace/ratio-cockpit
SidebarRatios (under Financials)

Purpose. Turn the latest SYSCOHADA year into the contractual credit ratios, and move three sliders to see those ratios change.

What it does. Title Capacité de dette & covenants. Badge Calcul traçable. The baseline period is the record whose period is 2023, otherwise the last period.

Four cards:

CardRule shown on the cardStatus rule
Levier net (dette / EBE)≤ 3.50xThe covenant flag from the engine: BREACH if above 3.50x, WARNING if above 90% of the cap, else COMPLIANT
Couverture intérêts (ICR)≥ 2.50xLocal: RUPTURE if under 2.50, else SÉCURISÉ. The engine itself has no warning band for ICR
Service dette (DSCR)Cible ≥ 1.30xLocal: ATTENTION if under 1.30, else CONFORME
Fonds de roulement (FRNG)Badge always PositifFoot shows BFR and BFR in days of sales

Expliquer on the leverage card sends a copilot prompt. Voir source opens the underlying SYSCOHADA line citation when SourceCitationId / period source_citations is present (R4). Réinitialiser appears only after a slider moves.

Sliders, applied before computeSyscohadaRatios:

  • Revenue shock −25% to +25%. Revenue is multiplied by 1 + shock/100. EBE is multiplied by 1 + shock × 1.5 / 100. EBIT by 1 + shock × 1.8 / 100. A revenue drop therefore hits profit harder than it hits sales.
  • Rate hike 0 to 400 bp. Interest expense is multiplied by 1 + (bps/100) × 0.15. A 100 bp hike adds 15% to the interest line. It does not reprice the debt from a base rate.
  • Capex overrun 0 to 50%. Capex is multiplied by 1 + overrun/100.

Below the cards, Audit des Covenants Contractuels lists each flag with threshold, actual, and a French detail sentence. The contract named in the subtitle is the bridge-loan agreement.

Formulas in computeSyscohadaRatios (defaults: max net debt/EBE 3.50, min ICR 2.50, min DSCR 1.30):

text
gross debt = long-term financial debt + short-term financial debt
net debt   = gross debt − cash
net debt / EBE = net debt / ebitda          (999 if ebitda ≤ 0)
ICR        = ebit / financial expenses      (999 if expenses ≤ 0)
debt service = scheduled principal + financial expenses
CFADS      = ebitda − corporate tax − capex
DSCR       = CFADS / debt service
FRNG       = (equity + long-term financial debt) − fixed assets
BFR        = (inventories + receivables + other current assets)
             − (trade payables + tax and social + other current liabilities)
BFR days   = (BFR / revenue) × 365

The same function also computes gearing (net debt / equity), EBITDA interest cover (EBE / interest, which is not the ICR card), current ratio, quick ratio, and margins. The cockpit cards do not show all of them. The credit lab uses a different DSCR floor, 1.20x, and a different shock model. If the two pages disagree, that is why.

On unstressed SEEG 2023 the engine’s inputs are the seed: EBE 34.85 billion, cash 14.8 billion, long-term debt 84.5 billion, short-term debt 18.2 billion, so net debt is 87.9 billion and leverage is 87.9 / 34.85 ≈ 2.52x. That matches the issuer card. The DSCR card uses CFADS = EBE − tax − capex, then divides by principal plus interest. The review grid and several narratives instead show DSCR at 1.08x or 1.02x from canned sentences. Read the cockpit number as the one this function produces after your sliders. Read 1.08x as the story number used on Overview, Issuers, the graph, the risk register, and the review grid.

Terms.

  • Covenant. A contractual promise that can be tested with a number. If you break it, the lender can accelerate the loan, raise the margin, or stop new drawings. Testing is usually twice a year.
  • ICR (interest coverage). EBIT divided by interest. 2.50x means operating profit covers the interest bill 2.5 times. The review grid’s ICR line is labeled “EBE / interest” and shows a hardcoded 3.20x. The cockpit uses EBIT / interest. Those are different numerators. EBE is before depreciation, so it is larger.
  • DSCR. CFADS divided by debt service. Debt service is principal plus interest, not interest alone. That is why a company can have a fine ICR and a weak DSCR: principal repayments are large.
  • CFADS. Cash flow available for debt service. This codebase defines it as EBE minus tax minus capex. Textbooks vary (some start from EBITDA and adjust working capital). When you read DSCR in Locus, this is the definition.
  • FRNG (fonds de roulement net global). Long-term financing minus long-term assets. If it is positive, long-term money more than covers the fixed assets, and the surplus funds the operating cycle. The badge does not turn red when the number is negative.
  • BFR (besoin en fonds de roulement). Cash trapped in the operating cycle: inventory and unpaid customer bills, minus what the company itself owes suppliers and the tax office. More BFR means more cash tied up. Days of revenue says how many days of sales that stock of cash represents.
  • Headroom / marge de manœuvre. Distance to the covenant. For a maximum leverage covenant it is cap − actual. For a minimum coverage covenant it is actual − floor.
  • Points de base on the rate slider. A market move in the interest rate. The cockpit’s mapping (100 bp → +15% interest expense) is a simplified sensitivity, not a full repricing of Euribor plus margin.

Business value. The credit committee’s question is “if revenue falls 10% and BEAC hikes, do we breach?” The sliders answer that in one screen, with the formula fixed in code so two analysts get the same output. The business decision is whether the headroom is wide enough to approve, or whether the structure needs a reserve account or a longer maturity.

Use case. Open SEEG, note leverage near 2.52x and the DSCR card against 1.30x. Push revenue to −10% and the rate slider to +100 bp. Watch which card flips first. Then open the credit lab, which applies a richer shock (receivables, foreign exchange) and uses the 1.20x DSCR floor written in the alerts.

Next. Credit lab for the committee scenarios. Review grids for the contractual clause the ratio is tested against.

Credit lab ​

Route/workspace/credit-lab
SidebarDebt & Covenants

Purpose. Stress the latest financial year with the shocks a CEMAC credit committee actually argues about (state arrears, a rate jump, a currency tranche), and produce an approve / conditional / reject verdict.

What it does. Title Laboratoire de Stress-Testing & Scénarios Crédit. Réinitialiser returns to the base preset.

Four presets plus a custom state if you move a slider:

PresetBadgeWhat it sets
Cas de base (audité 2023)BaselineAll shocks zero
Sensibilité comité de créditBanque CaseRevenue −10%, EBE margin −2.5 points, rates +100 bp, receivables +30 days, capex −10%
Choc arriérés État et retard BFRRisque CEMACRevenue −12%, margin −1.5 points, +50 bp, receivables +90 days, capex −25%
Choc sévère macro et taux BEACStress ExtrêmeRevenue −20%, margin −5 points, +300 bp, +60 days, capex −30%, FX +20%

A breach banner always uses destructive styling. It names the primary vulnerability: either DSCR already below 1.20x, or the revenue drop, margin compression, rate hike, or cash runway that would get you there. The trigger math holds every other shock at zero and solves one variable at a time.

Six sliders: revenue −30% to +20%, EBE margin compression −10 to +5 percentage points, interest-rate shock 0 to 500 bp, receivables delay 0 to 180 days, capex −50% to +30%, FX 0 to 40%.

Four result tiles: DSCR, net leverage, ICR, and cash absorbed by the receivables stretch. Status labels: Rupture, Alerte, Conforme. Each coverage tile shows base, stressed, threshold, and headroom.

The verdict:

  • More than one covenant at risk, or DSCR in breach → Refus / Restructuration and the headline that the debt must be restructured before syndication.
  • One covenant at risk, or DSCR only on warning → Favorable Sous Réserve and a 6-month DSRA.
  • Otherwise → Favorable and the headline that the file survives standard sensitivity.

Four mitigants are always listed: a 6-month DSRA, a tripartite compensation agreement with the Gabon treasury, subordination and a dividend block while DSCR is under 1.25x, and a margin ratchet on net leverage. A bridge table compares base and stressed revenue, EBE, EBIT, interest, debt service, CFADS, and adjusted net debt.

Data. runStressSimulation on project.financial_periods, last period. Overrides passed from the component: max leverage 3.50, min ICR 2.50, min DSCR 1.20. Amounts display in billions (Mrds).

Shock formulas that differ from the cockpit:

text
stressed revenue = revenue × (1 + revenue shock)
stressed EBE     = revenue × (base margin + margin shock)
stressed EBIT    = stressed EBE − depreciation
base rate        = interest / gross debt, or 5.5% if that cannot be computed
stressed rate    = base rate + bps/10000
FX multiplier    = 1 + fx shock
stressed interest and principal = base × stressed rate or base principal, × FX
tax rate         = tax / EBIT, or 25%
CFADS            = EBE − tax − capex
extra BFR        = (stressed revenue / 365) × extra days
stressed cash    = cash − extra BFR − any CFADS shortfall, floored at 0
stressed net debt = gross debt − stressed cash

Leverage breaches above the cap, and warns above 90% of the cap. Coverage breaches below the floor, and warns below 110% of the floor.

Terms.

  • Stress test. Recompute the ratios on purpose-built bad inputs. The point is the distance to breach, not the base case the company already published.
  • Arriérés. Overdue payments. “Arriérés de l’État” means the government has not paid the utility. The days slider is a DSO shock: days sales outstanding, how long cash sits in receivables.
  • Percentage points (pp). A margin move from 17.6% to 15.1% is −2.5 pp. That is not −2.5% of the margin.
  • FX tranche. Part of the debt is in euros or dollars. If the exchange rate moves against the FCFA, the local-currency cost of that debt rises. The peg makes a large move a political scenario; the slider still lets you impose one. The product’s own parity is fixed at 655.957, so this shock is hypothetical on top of that peg.
  • Ratchet. A clause that changes the margin, or tightens a covenant, when a ratio gets worse. It is listed as a mitigant; the lab does not apply a ratchet schedule to the interest line.
  • Subordination. An agreement that some debt or some dividends are paid only after senior lenders. A dividend block while DSCR is under 1.25x keeps cash inside the company.
  • DSRA 6 mois. Cash trapped at signing equal to six months of debt service.
  • Quasi-fonds propres. Money that behaves like equity (a subordinated shareholder loan, for example) so leverage falls without a full capital increase.
  • Comité de crédit verdict. Approve, approve with conditions, or send the structure back. The lab’s enum is APPROVE, CONDITIONAL_APPROVAL, REJECT_STRUCTURING_REQUIRED.

Business value. This is the page a credit analyst brings to committee. The presets match the stories in the file: a standard bank case, a CEMAC state-arrears case, and a severe BEAC hike. The decision is the verdict plus the conditions precedent the arranger must add to the term sheet.

Use case. Select Choc Arriérés État. Read the DSCR tile and the cash-absorption tile. If the verdict is conditional, the CP to write down is the 6-month DSRA. Switch to the severe preset and see the verdict flip toward restructuring. The same shocks are what the diligence runner’s stress step describes in canned log lines.

Next. Review grids, to attach these ratios to clauses. Risk register, to assign the DSCR issue to the credit risk committee.

Review grids ​

Route/workspace/review-grids
SidebarReview Grids (under Debt & Covenants)

Purpose. A clause-by-clause grid of the loan: commercial terms on one tab, financial covenants on the other, each with a source page and a human verification state.

What it does. Title Grilles de Revue d'Engagements & Covenants (Kira-Style). Kira is a known contract-extraction product; the label means “structured fields pulled out of contracts,” not a live Kira integration.

Badges: percent of fields a human has verified or modified, and the count of covenant breaches. KPIs repeat the certification rate, the count of facility fields, the count of financial covenants, and the count of breaches plus discrepancy flags.

Tabs:

  • Termes de la Facilité & Sûretés. Columns: clause, value extracted by the machine, value confirmed or overridden, source, verification status, actions. Valider sets HUMAN_VERIFIED by Analyste Crédit (L'Archer). Editing sets MODIFIED.
  • Engagements Financiers & Covenants. Columns: code, contractual threshold, “actual” from the cockpit, headroom, status, source, certification. Status text is Rupture de Covenant or Conforme. ✦ Expliquer opens the copilot. Validate here attributes the check to Directeur des Risques.

Verification labels: Vérifié par Analyste, Extrait par IA, Contesté / Litige, Modifié Manuellement.

Data. Review grids stay empty until SYSCOHADA extractions exist in the SoR for the open dossier. There is no hardcoded SEEG facility fallback.

Facility rows (source file 02_convention_pret_relais_53m_eur.pdf):

ClauseExtracted valueFlag
Principal53,400,000 € (about 35.03 billion FCFA)Normal, human-verified
MarginEuribor 3M + 7.20%, and the verified cell also records 6.75% in the term sheetDisputed. Note: 45 bp, about +240k€ a year
MaturityBridge due 30/06/2025, bond in 2031Breach. The bond outlasts the 2028 concession by 3 years
Negative pledgeAbsolute ban on any pledgeBreach. Conflicts with the 4.2 billion turbine escrow in Note 14
Cross-default500 million FCFAExtracted, not yet verified
LawOHADA, CCJA arbitration in Abidjan or the Libreville court—

Covenant rows:

CodeTestThresholdShown actualStatus
LEV_01Net debt / EBE≤ 3.50x2.52x, headroom +0.98xCompliant. Note says a slide-deck EBITDA of 42.1 billion is not enforceable; the certified EBE is 34.85
ICR_01Labeled EBE / net interest≥ 2.50x3.20xCompliant. This 3.20x is a literal, and the numerator in the label is EBE, not the cockpit’s EBIT
DSCR_01DSCR≥ 1.20x1.08x, headroom −0.12xBreach
CAPEX_01Annual capex cap≤ 15 billion FCFA12 billionCompliant
CASH_01Minimum cash≥ 8 billion FCFA14.80 billionCompliant. Note: 4.2 billion of that cash is trapped in the turbine escrow

Terms.

  • Cross-default. If the borrower defaults on some other debt above a threshold (here 500 million FCFA), this loan is also in default. It stops a borrower from quietly defaulting to one lender while staying current with another.
  • CCJA. The OHADA arbitration court in Abidjan. Choosing it means disputes may not be heard only in the local commercial court.
  • Headroom sain. Positive spare room. A negative headroom on DSCR is a breach, not a warning.
  • Pro forma / normalized EBITDA. A management number that adds back items the company says are one-off. Lenders in this product are told to ignore 42.1 billion and keep 34.85 billion, because only the audited EBE is opposable (enforceable against the borrower).
  • Certification. A person, not the model, has accepted the extracted cell. The rate on the badge is the share of cells in HUMAN_VERIFIED or MODIFIED. That rate is the operational control: uncertified cells should not go into a committee memo as facts.

Business value. Models compute ratios. Contracts decide which ratio, which threshold, and which definition. This grid is the bridge. The business decision is “which clauses are still disputed, and who has signed the cell?” A disputed margin must be resolved before the book of investors is opened, because the coupon in the prospectus has to match the contract.

Use case. After OCR + analysis, open the covenant tab: LEV/ICR/DSCR rows are computed from the dossier’s financial_periods. Facility margin/maturity hints appear when term-sheet OCR extracted them into review_grid_extract. A dossier without periods shows empty grids.

Next. Contradictions, which shows the two documents side by side. Risk register, which assigns an owner to each of these breaches.

Risk register ​

Route/workspace/risk-register
SidebarRisk

Purpose. The committee list of risks: severity, owner, evidence, a mitigant, and whether the mitigant is a condition precedent.

What it does. Title Registre Central des Risques & Conditions Suspensives. Badges show the borrower and the count of critical alerts (critical and high).

KPIs: risks being watched, critical risks, the count of CPs, and identified exposure in FCFA.

Filters: severity (Critique, Élevée, Moyenne; LOW exists on the type and has no option), status (Risque Ouvert, En Revue Comité, Mesure Validée, Accepté par Comité), and category (maturity and concession, contractual contradiction, collateral and negative pledge, BEAC regulation, financial covenants, sovereign legal security).

Each card shows id, raw severity, category, status, owner, and the scope. ✦ Expliquer opens the copilot. Two evidence columns: deal documents, and an opposable legal text (OHADA or CEMAC) when one exists. You can set the status with the French buttons. The footer stamps a local update time. Status is held in the page session; it is not written back to the project seed.

Data. Risk register is built from the open deal’s documents, contradictions, and findings — or stays empty for a fresh dossier. No hardcoded SEEG risk pack is injected.

SEEG risks:

TitleCategorySeverityStatusOwnerExposure
Maturity mismatch, concession 2028 vs bond 2031ConcessionCriticalOpenLegal counselThe deal amount. CP: a concession decree beyond 31/12/2031
Margin 6.75% vs 7.20%ContractHighOpenLead arranger157.6 million FCFA, stated as 240,300 euros
Negative pledge vs Note 14 escrowCollateralHighIn committee reviewLegal counsel4.2 billion FCFA. Cites OHADA article 140
BEAC Article 42 declaration missingRegulatoryHighOpenCompliance officer—
DSCR 1.08x vs 1.20xCovenantHighIn committee reviewCredit risk committee14.5 billion FCFA (a year of debt service)
Unverified national utility lawRegulatory gapMediumOpenLegal counselNone

Terms.

  • Condition suspensive. Same idea as a CP: the committee can say yes, and the money still does not move until this clause is satisfied. The card prints Clause CP Term Sheet when the risk carries one.
  • Mesure d'atténuation. The action that makes the risk acceptable: a longer concession, a waiver, a reserve account, a filing.
  • Accepté par comité. The committee saw the risk and took it with no further document. That is different from Mesure Validée, which means the mitigant is in place.
  • Exposition. A franc amount the card attaches to the issue (the disputed interest, the pledged cash, one year of debt service). It is not a probability-weighted loss. Probability and impact fields exist on the object and are not shown.
  • Texte opposable. A statute or contract clause you can show a judge or a regulator. The right-hand column is that text. A structuring risk with no statute says so explicitly.
  • PPP. Public-private partnership. The non-Gabon card is about Congo’s PPP statute, because a port or a utility financed with state support has to fit that law.

Business value. Committees do not approve a 40-page model. They approve a list of risks with owners and conditions. This page is that list. The decision is which risks stay open, which become CPs in the term sheet, and which are accepted.

Use case. Filter to Critique. There is one: the concession date. Leave it Ouvert until legal has a draft decree. Move the negative-pledge card only when a waiver is signed. The DSCR card stays with the credit risk committee and points at the 14.5 billion of annual debt service, which is the scheduled principal sitting on the financial period.

Next. Contradictions for the evidence pair. Memo drafter, where these CPs should be written as the recommendation.

Contradictions ​

Route/workspace/contradiction-radar
SidebarContradictions (under Risk)

Purpose. Show two documents that disagree, with the quoted sentences and the page numbers, so an analyst can resolve the gap instead of averaging it.

What it does. Title File de contradictions. Badges count CRITICAL and MAJOR alerts. There are no filters. Each card has an index, a title, a topic, a variance metric, a severity, and ✦ Expliquer. The body is Lecture analyste. Two columns, Document A and Document B, each with Voir sur le PDF, the quotation, and the file name. Alerts are hydrated from SoR Citation rows (real page/filename; bbox only when usable — never a hardcoded zero box).

Data. currentProject.contradiction_alerts. SEEG’s four seed alerts:

TopicWhat disagreesMetric
INTEREST_RATELoan, page 18: Euribor 3M + 7.20%. Term sheet, page 3: Euribor 3M + 6.75%45 bp, about 240,300 € a year
MATURITY_DATEConcession ends 31/12/2028. Take-out bond runs into 20313 years, the explanation says 35 months
EBITDA_DEFINITIONCertified EBE 34.85 billion. Presentation “normalized EBITDA” 42.1 billion+7.25 billion, +20.8%. The explanation says leverage would move from 2.08x to 2.52x if you switch numerator’s companion debt figure. That sentence is text, not a function
NEGATIVE_PLEDGEAbsolute negative pledge versus an existing 4.2 billion pledge in Note 14The pledged amount

Topics also include COVENANT in the enum. Severity MINOR has no separate color. A new wizard dossier does not copy this list unless the seed merge supplies it; SEEG’s project carries these four.

Terms.

  • Variance metric. The size of the gap in the unit that matters to money: basis points, years, or FCFA. It is the reason the row is on the page.
  • Document A / B. The two sources. Neither is automatically “the winner.” The Q&A sample says 7.20% prevails because it is in the signed loan. The radar does not encode that winner. A human does, by publishing the answer and editing the review-grid cell.
  • Normalized EBITDA. Already covered on the review grid. The radar is the evidence view of the same fight: the slideshow number versus the audited line.

Business value. A single wrong margin in a prospectus is a liability to investors and a reason for COSUMAF to refuse a visa. This page is the control that stops two teams from using two numbers. The decision is which document governs, and which sentence must be amended before the file is sent out.

Use case. Open the interest-rate card, view both PDFs, and write down that the signed loan says 7.20. Then open the EBITDA card and refuse the 42.1 billion figure for any covenant test. The regulatory dashboard repeats each of these alerts as a legal finding.

Next. Regulatory, which attaches a rule to each gap. The memo, which states the open questions.

Regulatory ​

Route/workspace/regulatory
SidebarRegulatory
Default forCompliance officer. Also the default landing tab of the legal edition.

Purpose. Ask which CEMAC and national rules apply to this deal, which findings the file triggers, and how trustworthy the legal corpus is.

What it does. Title Cadre Juridique & Rapprochement Réglementaire. Badges: evaluation date from project.created_at, and a hardcoded peg Parité fixe BEAC 655,957.

If the jurisdiction profile says so, chips show Appel public à l’épargne (BVMAC), Financement transfrontalier, and Entité liée à l’État.

KPIs, computed by analyzeDeal (client) or analyzeDealWithVault (server / jobs):

  • Regulatory coverage = catalogued sources / applicable sources.
  • Attention points = findings with status issue.
  • Open legal questions = status question.
  • Deterministic checks = how many boolean checks passed.

Vault overlay (slices 32–33). When a session can call the SoR, analyzeDealWithVault resolves each statutory cite to vault editionId / provisionId / artifactId / sha256 and may set openStatuteHref → bank BFF
/api/locus/legal-vault/artifacts/{id}/content (hash-verified PDF stream). Findings can be persisted on the dossier as DossierRegulatoryFindings for audit replay. Evaluation predicates still live in code/catalog.ts until provisions are legal_reviewed. Platform PDF attach and review happen in locus-ops, not on this page — see Platform ops and regulatory-data.md.

Heuristics (slice 34). BEAC Art. 42 also fires when the data room mentions EUR/USD / emprunt extérieur / devise (not only currency !== 'XAF'). COSUMAF APE vs private placement uses deal type + document tags + investor/listing keywords.

A warning appears when any involved country’s corpus curation is pending. The sentence says the engine never infers one member state’s national law from another member state’s law.

The curation panel shows five authorities with literal document counts, not a live count of files:

AuthorityWhat it isSample stockTrust shown
OHADACompany law and collateral3 acts, 5 articles, 100%Human-verified
COSUMAFCapital markets and public offerings2 acts, 3 articles, 85%Machine-validated
BEACForeign exchange2 acts, 1 article, 75%Official source verified
COBACBank supervision and large exposures1 act, 1 article, 60%Official source verified
CongoPPP law and local commercial code3 acts, 1 article, 35%Pending digitization

Search runs searchRegulatoryCorpus (limit 4) over the loaded articles. The placeholder examples are pledge of an account, COSUMAF visa, and BEAC currency declaration.

Findings are produced from the deal:

  • One finding per contradiction alert. Negative pledge is filed under OHADA collateral articles 138 and 140. The others are filed as term-sheet versus loan contradictions.
  • Missing audited financials, fewer than three historical years, or a broken balance-sheet or EBE identity.
  • Each covenant BREACH on the latest period, using the ratio engine defaults, so the DSCR floor here is 1.30x, not the 1.20x in the credit lab.
  • Public-offering questions: private-placement language in a public deal, a bond that was not formally classified, a missing visa or information note.
  • State-linked deals without a concession or a statute.
  • Cross-border deals (security must be coordinated across countries).
  • A non-XAF currency, which triggers the BEAC declaration story. The check text says the currency has no special FX formality when the currency is XAF.
  • A pending national corpus.

Each finding shows severity (HIGH, MEDIUM, LOW), a type label (documentary contradiction, financial inconsistency, contractual breach, regulatory point, regulatory gap, missing document, legal risk, calculation anomaly), a confidence word, the deal evidence, and the official text. If counsel review is required, the card says a formal legal opinion is mandatory before issue. When vault IDs are present, open-statute opens the platform PDF (not a tenant deal-room upload).

The bottom registry lists regional and national instruments with a SHA-256 prefix, page count, and articles. Pending national instruments say digitization is required. Catalog pdfPath placeholders are not the CI fixtures under data/regulatory/fixtures/ — those fixtures are for vault bootstrap tests only (see regulatory-data.md).

Terms.

  • Corpus. The library of statutes the engine is allowed to cite. A pending corpus means “we have not ingested this country’s law,” not “the country has no law.”
  • Curation. How far a text has been checked: catalogued, source verified, text extracted, machine validated, human verified, superseded, or pending. The percentage is a stored label.
  • Appel public / placement privé. Public offer versus a sale to qualified investors only. Mixing the words in the documents is a finding because the visa regime depends on the choice.
  • Note d’information. The disclosure document investors receive. For a public bond it is the prospectus-style document COSUMAF visas.
  • Change. Foreign-exchange control. A euro loan from outside the zone is not just a commercial contract; BEAC wants it declared.
  • Sûretés multi-juridictionnelles. Collateral that sits in more than one country. A pledge valid in Gabon is not automatically valid in Congo. The finding tells counsel to coordinate, and it does not draft the local filings.
  • Confiance High/Medium/Low. How direct the evidence is. A contradiction quoted from two deal documents is high. A gap because a national corpus is empty is a different kind of uncertainty.
  • CGI. The national general tax code, selected in spirit by the organization jurisdiction. The dashboard does not run a tax computation.

Business value. A deal can be financially fine and still be unlawful to market. This page is the compliance officer’s list of reasons COSUMAF, BEAC, or a court could stop it. The decision is which findings are issues to fix in the documents, and which are questions that need an external legal opinion before anyone signs.

Use case. Open SEEG and read the four contradiction findings first. Then check whether the public-offering chip is on. If you created a dossier with Appel public à l’épargne and no prospectus in the data room, the visa finding appears. Open the BEAC currency finding if the profile currency is not XAF. Use search for nantissement when you need the OHADA article the negative-pledge card cites.

Next. The COSUMAF auditor, which scores the prospectus text itself.

COSUMAF visa auditor ​

Route/workspace/cosumaf-auditor
SidebarVisa COSUMAF (under Regulatory)

Purpose. Run the bond-offering checklist against this deal’s information note, score how close the file is to a visa, and keep a record of each run.

What it does. The eyebrow is Visa COSUMAF plus the deal code. The title is the deal name. A score readout shows visa_readiness_score / 100 and a decision badge once a run has returned.

Readouts: dossier, issuer (country and sector), amount (billions of FCFA when large enough), and which text was audited (a note you pasted, or the data room plus the internal note).

Tabs:

  • Revue. Counts of blockers, reservations, and passes. A table of rule, legal basis, excerpt, finding, proposed clause, and status. Verser au registre posts the run into the history for this deal code.
  • Note. Paste or upload .pdf or .txt, then Contrôler cette note. You can return to the dossier text.
  • Corpus. Search the COSUMAF regulation. Default query compte séquestre. Calls GET /api/regulatory/search.
  • Historique. Past runs for this deal code: date, issuer, source (Note déposée or Dossier), score, decision.
  • Attestation. A printable A4-style pre-visa certificate (design-system sheet): formal title, operation identity matrix, conic readiness score, numbered material findings with status marks, technical opinion, control seal, and the preparatory disclaimer. Print CSS strips application chrome. It lists every result that is not compliant. The footer says the document is an internal decision aid and is not the COSUMAF visa.

The view posts /api/regulatory/audit with sections built from the open dossier.

Scoring. Start at 100. Subtract blockers × (70 / n) and warnings × (30 / n), where n is the number of checklist rules. Clamp to 0–100. Any blocker produces VISA_PRE_REJECTED (UI label Visa ajourné). Any warning and no blocker produces CONDITIONAL_APPROVAL (Accord conditionnel). All clear produces VISA_READY (Prêt au visa). A blocker is a NON_COMPLIANT result whose severity is BLOCKER. Status marks use Non conforme, Réserve, and Conforme.

The checklist CHK-BOND-2023 (Grille de Contrôle Réglementaire COSUMAF - Émissions Obligatoires):

RuleWhat must be in the noteBasisSeverity
CHK-01 Legal warningThe COSUMAF cover warning that the regulator does not guarantee the opportunity of the investmentArticle 138Blocker
CHK-02 EscrowA subscription escrow account that is blocked at a COBAC-licensed bank until the centralization reportArticle 142Blocker
CHK-03 Fee capArrangement and placement fees ≤ 3.50%Article 155Blocker. The auditor sums every percent it finds in the fee section
CHK-04 Risk factorsIssuer, credit, BVMAC liquidity, and currency/sovereign risksArticle 148Warning
CHK-05 Bondholders’ massA masse des obligataires and a named representativeArticle 162 and OHADABlocker
CHK-06 CustodianAn independent licensed depository and centralizing agentArticle 182Blocker
CHK-07 AmortizationA forecast amortization table and coupon scheduleArticle 150Warning
CHK-08 AuditorsA report from licensed statutory auditorsArticle 136Blocker

Special failures you will read in the finding text: the warning sentence is missing; subscription money is described as immediately available on the operating account; the fee sum exceeds 3.5%; the risk section misses credit or sovereign language; the bondholders’ representative is not named as a lawyer or firm under OHADA. A pass says the clause meets the general regulation and no change is required.

Precedent snippets are attached for a few clause types (a BDEAC visa, a Congo fee clause at 2.85%, a Gabon listing-delay clause). They are examples of language that passed before, not a ruling on this deal.

Terms.

  • Visa. COSUMAF’s authorization to proceed with a public offering. Pré-visa means “our internal score before we file,” which is what the attestation is.
  • Réserve. A point that does not by itself reject the file in this scorer, but keeps the decision at “conditional.” In audit language, a reserve is also the auditor’s qualification. CHK-04 and CHK-07 are that kind of softer failure here.
  • Masse des obligataires. The legal body of all bondholders. OHADA gives it a representative who can act for the group. Without that clause, investors have no collective mechanism.
  • Compte séquestre de souscription. The account where subscription money sits, blocked, until the offering is declared successful. Article 142, as encoded here, forbids dumping that money straight into the company’s operating account.
  • Plafond de frais. A cap on what the arranger and the placing banks may charge, so the issuer’s proceeds are not consumed by fees. 3.50% is the threshold in the checklist JSON.
  • Dépositaire / centralisateur. The institution that holds the securities and the one that collects the orders. Independence matters so the arranger is not also the only record-keeper.
  • DCU. The body that issues the centralization report (procès-verbal de centralisation) after which escrowed funds can be released. The rule text names it.
  • Attestation. The printable sheet. It is useful in a committee pack. It does not bind the regulator.

Business value. Filing a prospectus that misses the cover warning or the escrow clause wastes a regulatory cycle and delays the mandate. The score is a pre-flight. The decision is whether the note is ready to file, ready only after named edits, or must be rewritten.

Use case. Open the SEEG deal, run Revue, and read any Non conforme rows first. If the fee finding quotes a sum above 3.5%, that is CHK-03 adding every percent sign it found. Paste a revised note in the Note tab, rerun, and Verser au registre so Historique shows both scores. Print the attestation only after blockers are gone, and keep the footer in mind: it is not the visa.

Next. Institutional memory, to see how a previous SEEG committee treated the same covenants. The memo, to paste the remaining reservations as open questions.


Source of trust for Locus. If this conflicts with code, code + IMPLEMENTATION_TRACKER.md win.