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.
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
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
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
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
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
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.