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"
}
}