Capital Refinery
Platform feature · Risk Signals

Observed vs firm policy, on every IC memo. Change a threshold once; every memo re-grades.

Risk Signals is the consolidated firm-policy scoreboard that renders inline on every IC memo, every docx and xlsx export, and every portfolio readiness rollup. Six signal categories with delta / unit / severity-typed entries. Hides clean secondaries by default for tight IC reads. The discipline: every grade carries the observed value, the firm threshold, and the verdict — never a vibe-based judgment.

What Risk Signals does

Most monitoring tools render a dashboard. The reader has to know the firm’s policy thresholds to interpret what they’re seeing. Risk Signals reverses that — it brings the firm policy into the artifact. Every signal carries an observed value, a firm policy threshold pair (max and watch), the delta, the unit, and a severity-typed verdict.

The result: a credit officer, an IC member, or an LP reading the same memo sees the same verdict against the same firm policy — without having to remember which threshold applies, look up the firm’s policy manual, or argue about interpretation. Change a firm threshold once in firm_assumptions.py (or via tenant override); every existing memo re-grades on the next render.

The six signal categories

Signal categories are lane-aware — real-estate-only signals (lease at-risk rent, title exceptions) only fire on re.* lanes; corporate-only signals (customer concentration) carry corporate-specific thresholds. Every signal renders with the same shape regardless of category.

Signal 01
Portfolio LTV

What it measures: Loan-to-value against the firm's policy ceiling and the firm's watch threshold

Example output: Observed 68% vs firm max 70% / watch 65% → severity: watch

Signal 02
Customer concentration

What it measures: Top-1 / top-5 / top-10 customer share of revenue, sub-lane-parameterized

Example output: Observed top-1 at 14% vs corp.distribution max 10% / watch 8% → severity: action

Signal 03
T-3 expense creep

What it measures: Trailing-three-period operating expense escalation vs firm tolerance band

Example output: Observed 8.4% trailing OpEx growth vs firm max 6% / watch 4% → severity: action

Signal 04
Debt-service runway

What it measures: Composite of interest reserve months remaining plus cap-strike-to-current-floating gap

Example output: Interest reserve 9 months vs firm min 12 months; cap-strike gap 280 bps vs firm max 200 bps → severity: action

Signal 05
Lease at-risk rent

What it measures: Tenant-credit-weighted rent exposure to early lease expiry or renewal risk (re.* lanes)

Example output: Observed 24% of NOI from leases expiring within 24 months on weak-credit tenants → severity: action

Signal 06
Title exceptions

What it measures: Title insurance exception count and severity (real estate lanes)

Example output: Observed 3 high-severity exceptions on closing title commitment → severity: action

The firm policy surface

The signals consume an explicit firm policy configuration — approximately a dozen named knobs covering max/watch pairs for LTV, customer concentration, and expense creep; minimum interest reserve months; maximum cap-strike-to-floating gap (in basis points); minimum DSCR; and real-estate-specific thresholds. Defaults are hardcoded at platform initialization; per-tenant overrides plug in via firm_assumptions_overrides without consumer-side changes.

The architecture matters: changing one firm threshold updates every memo that renders against it. The team does not need to manually re-grade prior memos; the next render re-evaluates. Decision integrity is preserved (the IC anchor at decision time captures the policy state) while current state stays consistent with the firm’s current policy.

Where Risk Signals renders

  • Every IC memo at /deal/[id]/memo — inline RiskSignalsView with the observed/policy/verdict columns
  • Every docx export across all 5 lanes (Corp PE, Private Credit, RE-PC, RE-CRE, Hybrid) — signal block inserted via render_risk_signals_section hoisted helper
  • Every xlsx export — signal block as a dedicated sheet
  • Portfolio readiness rollup (operator-only) — aggregated severity counts across positions
  • Risk Signals CLI (python -m tools.risk_signals_cli) — text + JSON modes, per-knob overrides, --show-clean to opt clean secondaries back in

Before / after — what a firm-threshold change does

A common scenario: the firm tightens its top-1 customer concentration policy from 12% max to 10% max (a sub-lane-specific shift in response to recent diligence findings). The single change in firm_assumptions.py (or tenant override) re-grades every existing memo on the next render.

Before the change

A position with observed top-1 customer concentration of 11% reads as watch severity (within firm max 12% but above firm watch 9%). The IC reviewing the memo sees yellow.

After the change

Same position, same observed 11%, but firm max now 10% / watch 8%. The next memo render shows action severity (above the new max). The IC reviewing the memo sees red — same observed value, different firm policy, different verdict. No manual re-grading; the discipline is structural.

Why this matters for the five readers

  • Operator (running the seller-side IRA) — sees in advance which signals will fire when their business is read against buy-side firm policies; the IRA's commentary is calibrated to the policy environment the buyer will apply
  • Banker (running sell-side mandates) — sees which structural signals will surface during the buyer's diligence; can pre-engage remediation rather than discovering during exclusivity
  • Buyer (running the diagnostic) — gets a firm-policy-aligned scoreboard on every IC memo across the portfolio; no human re-interpretation required
  • Lender (underwriting facilities, monitoring covenants) — sees borrower-side signals graded against the lender's own firm policy; covenant design and breach probability are direct outputs
  • LP (reviewing fund governance) — sees the GP's portfolio-wide signal aggregation against the GP's stated firm policy; can spot signal drift across the book

What Risk Signals refuses to do

  • No vibes-based severity — every verdict is observed value vs firm threshold; no LLM-derived sentiment grading
  • No imputation — when a signal cannot be observed (data thin), the entry marks not_observable rather than defaulting to clean
  • No fabricated thresholds — every threshold is a named, configurable knob with hardcoded default and tenant override path; no hidden constants
  • No retroactive overwriting — changing a firm threshold doesn't rewrite history; it re-grades on next render. The IC anchor preserves the policy state at decision time
  • No score theater — there is no composite Risk Signals score. Each signal carries its own verdict. Composite framing would dilute the structural discipline

Sources cited

  • COSO Enterprise Risk Management — Integrating with Strategy and Performance framework — referenced for firm-policy-driven risk governance concepts → https://www.coso.org
  • NACD (National Association of Corporate Directors) — board-level risk oversight principles → https://www.nacdonline.org
  • Risk Signals architecture documentation — internal: docs/features/reporting/memo_dossier_lane_aware.md (Risk Signals section) and docs/features/platform/firm_assumptions.md
  • Falcon Services Q1 2026 — live Risk Signals output on the buy-side proof case at /falcon

See Risk Signals on a deal you bring us.

Bring a closed position or a target you're underwriting. We'll render the scoreboard with your firm-policy thresholds, and you'll see what the IC memo looks like when the firm policy is part of the artifact rather than something the reader has to remember.