Credit & earnings Lab 07

Covenant Headroom

How close is a borrower to leverage, coverage, or liquidity breaches under explicit downside scenarios?

Saved example run

Generated using bundled data. These values illustrate the diagnostic and are not current market observations.

↔ Wide tables scroll horizontally. Keyboard: focus a table, then use the arrow keys.

Scenario comparison

Each row is one period under one scenario. Breach labels are reported by the lab. Liquidity uses the same units as the input file.

Covenant results by period and scenario
PeriodScenarioStatusNet leverageInterest coverageLiquidityBreached covenants
2026-Q1basepass3.5x3.0x40.0None
2026-Q2basepass4.1538x2.4074x34.0None
2026-Q3basebreach5.0455x1.9298x29.0net leverage, interest coverage
2026-Q4basebreach6.1053x1.5702x22.0net leverage, interest coverage, liquidity
2026-Q1hard-landingbreach5.0x2.4x30.0net leverage
2026-Q2hard-landingbreach5.9135x1.9259x24.0net leverage, interest coverage, liquidity
2026-Q3hard-landingbreach7.1591x1.5439x19.0net leverage, interest coverage, liquidity
2026-Q4hard-landingbreach8.6184x1.2562x12.0net leverage, interest coverage, liquidity

Remaining headroom

Negative headroom indicates a breached threshold. Exact captured values are shown below.

Headroom to covenant limits
PeriodScenarioNet leverageInterest coverageLiquidity
2026-Q1base1.0x1.0x15.0
2026-Q2base0.3462x0.4074x9.0
2026-Q3base-0.5455x-0.0702x4.0
2026-Q4base-1.6053x-0.4298x-3.0
2026-Q1hard-landing-0.5x0.4x5.0
2026-Q2hard-landing-1.4135x-0.0741x-1.0
2026-Q3hard-landing-2.6591x-0.4561x-6.0
2026-Q4hard-landing-4.1184x-0.7438x-13.0

All input values, percentage headroom and summary fields are available in the original output below.

The paper trail

Inspect. Reproduce. Extend.

Run this command from the finance-labs repository root to reproduce the bundled example.

Exact command
PYTHONPATH=labs/covenant-headroom/src python3 -m covenant_headroom_lab analyze labs/covenant-headroom/examples/sample_financials.csv --max-net-leverage 4.5 --min-interest-coverage 2.0 --min-liquidity 25 --scenario hard-landing:-20:15:-10

View original captured output
{
  "results": [
    {
      "breaches": [],
      "headroom": {
        "interest_coverage": 1.0,
        "liquidity": 15.0,
        "net_leverage": 1.0
      },
      "headroom_pct": {
        "interest_coverage": 0.5,
        "liquidity": 0.6,
        "net_leverage": 0.2222
      },
      "inputs": {
        "adjusted_ebitda": 30.0,
        "cash_interest": 10.0,
        "liquidity": 40.0,
        "net_debt": 105.0,
        "period": "2026-Q1",
        "revenue": 120.0
      },
      "metrics": {
        "interest_coverage": 3.0,
        "liquidity": 40.0,
        "net_leverage": 3.5
      },
      "period": "2026-Q1",
      "scenario": "base",
      "status": "pass"
    },
    {
      "breaches": [],
      "headroom": {
        "interest_coverage": 0.4074,
        "liquidity": 9.0,
        "net_leverage": 0.3462
      },
      "headroom_pct": {
        "interest_coverage": 0.2037,
        "liquidity": 0.36,
        "net_leverage": 0.0769
      },
      "inputs": {
        "adjusted_ebitda": 26.0,
        "cash_interest": 10.8,
        "liquidity": 34.0,
        "net_debt": 108.0,
        "period": "2026-Q2",
        "revenue": 112.0
      },
      "metrics": {
        "interest_coverage": 2.4074,
        "liquidity": 34.0,
        "net_leverage": 4.1538
      },
      "period": "2026-Q2",
      "scenario": "base",
      "status": "pass"
    },
    {
      "breaches": [
        "net_leverage",
        "interest_coverage"
      ],
      "headroom": {
        "interest_coverage": -0.0702,
        "liquidity": 4.0,
        "net_leverage": -0.5455
      },
      "headroom_pct": {
        "interest_coverage": -0.0351,
        "liquidity": 0.16,
        "net_leverage": -0.1212
      },
      "inputs": {
        "adjusted_ebitda": 22.0,
        "cash_interest": 11.4,
        "liquidity": 29.0,
        "net_debt": 111.0,
        "period": "2026-Q3",
        "revenue": 105.0
      },
      "metrics": {
        "interest_coverage": 1.9298,
        "liquidity": 29.0,
        "net_leverage": 5.0455
      },
      "period": "2026-Q3",
      "scenario": "base",
      "status": "breach"
    },
    {
      "breaches": [
        "net_leverage",
        "interest_coverage",
        "liquidity"
      ],
      "headroom": {
        "interest_coverage": -0.4298,
        "liquidity": -3.0,
        "net_leverage": -1.6053
      },
      "headroom_pct": {
        "interest_coverage": -0.2149,
        "liquidity": -0.12,
        "net_leverage": -0.3567
      },
      "inputs": {
        "adjusted_ebitda": 19.0,
        "cash_interest": 12.1,
        "liquidity": 22.0,
        "net_debt": 116.0,
        "period": "2026-Q4",
        "revenue": 98.0
      },
      "metrics": {
        "interest_coverage": 1.5702,
        "liquidity": 22.0,
        "net_leverage": 6.1053
      },
      "period": "2026-Q4",
      "scenario": "base",
      "status": "breach"
    },
    {
      "breaches": [
        "net_leverage"
      ],
      "headroom": {
        "interest_coverage": 0.4,
        "liquidity": 5.0,
        "net_leverage": -0.5
      },
      "headroom_pct": {
        "interest_coverage": 0.2,
        "liquidity": 0.2,
        "net_leverage": -0.1111
      },
      "inputs": {
        "adjusted_ebitda": 24.0,
        "cash_interest": 10.0,
        "liquidity": 30.0,
        "net_debt": 120.0,
        "period": "2026-Q1",
        "revenue": 120.0
      },
      "metrics": {
        "interest_coverage": 2.4,
        "liquidity": 30.0,
        "net_leverage": 5.0
      },
      "period": "2026-Q1",
      "scenario": "hard-landing",
      "status": "breach"
    },
    {
      "breaches": [
        "net_leverage",
        "interest_coverage",
        "liquidity"
      ],
      "headroom": {
        "interest_coverage": -0.0741,
        "liquidity": -1.0,
        "net_leverage": -1.4135
      },
      "headroom_pct": {
        "interest_coverage": -0.037,
        "liquidity": -0.04,
        "net_leverage": -0.3141
      },
      "inputs": {
        "adjusted_ebitda": 20.8,
        "cash_interest": 10.8,
        "liquidity": 24.0,
        "net_debt": 123.0,
        "period": "2026-Q2",
        "revenue": 112.0
      },
      "metrics": {
        "interest_coverage": 1.9259,
        "liquidity": 24.0,
        "net_leverage": 5.9135
      },
      "period": "2026-Q2",
      "scenario": "hard-landing",
      "status": "breach"
    },
    {
      "breaches": [
        "net_leverage",
        "interest_coverage",
        "liquidity"
      ],
      "headroom": {
        "interest_coverage": -0.4561,
        "liquidity": -6.0,
        "net_leverage": -2.6591
      },
      "headroom_pct": {
        "interest_coverage": -0.2281,
        "liquidity": -0.24,
        "net_leverage": -0.5909
      },
      "inputs": {
        "adjusted_ebitda": 17.6,
        "cash_interest": 11.4,
        "liquidity": 19.0,
        "net_debt": 126.0,
        "period": "2026-Q3",
        "revenue": 105.0
      },
      "metrics": {
        "interest_coverage": 1.5439,
        "liquidity": 19.0,
        "net_leverage": 7.1591
      },
      "period": "2026-Q3",
      "scenario": "hard-landing",
      "status": "breach"
    },
    {
      "breaches": [
        "net_leverage",
        "interest_coverage",
        "liquidity"
      ],
      "headroom": {
        "interest_coverage": -0.7438,
        "liquidity": -13.0,
        "net_leverage": -4.1184
      },
      "headroom_pct": {
        "interest_coverage": -0.3719,
        "liquidity": -0.52,
        "net_leverage": -0.9152
      },
      "inputs": {
        "adjusted_ebitda": 15.2,
        "cash_interest": 12.1,
        "liquidity": 12.0,
        "net_debt": 131.0,
        "period": "2026-Q4",
        "revenue": 98.0
      },
      "metrics": {
        "interest_coverage": 1.2562,
        "liquidity": 12.0,
        "net_leverage": 8.6184
      },
      "period": "2026-Q4",
      "scenario": "hard-landing",
      "status": "breach"
    }
  ],
  "summary": {
    "base_breaches": 2,
    "periods": 4,
    "scenarios": 2,
    "tightest_headroom_period": "2026-Q4",
    "tightest_headroom_scenario": "hard-landing",
    "total_breaches": 6,
    "worst_net_leverage": 8.6184,
    "worst_net_leverage_period": "2026-Q4",
    "worst_net_leverage_scenario": "hard-landing"
  }
}

Capture execution time unavailable

Source revision was not recorded for this historical capture.

The source link points to the current repository; it may differ from this saved run.