All ten labs
Example run · Captured stdout

Covenant Headroom

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

Exact commandRepository root
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
Real outputExit code 0
{
  "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"
  }
}