Credit & earnings Lab 07
Covenant Headroom
How close is a borrower to leverage, coverage, or liquidity breaches under explicit downside scenarios?
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.
| Period | Scenario | Status | Net leverage | Interest coverage | Liquidity | Breached covenants |
|---|---|---|---|---|---|---|
| 2026-Q1 | base | pass | 3.5x | 3.0x | 40.0 | None |
| 2026-Q2 | base | pass | 4.1538x | 2.4074x | 34.0 | None |
| 2026-Q3 | base | breach | 5.0455x | 1.9298x | 29.0 | net leverage, interest coverage |
| 2026-Q4 | base | breach | 6.1053x | 1.5702x | 22.0 | net leverage, interest coverage, liquidity |
| 2026-Q1 | hard-landing | breach | 5.0x | 2.4x | 30.0 | net leverage |
| 2026-Q2 | hard-landing | breach | 5.9135x | 1.9259x | 24.0 | net leverage, interest coverage, liquidity |
| 2026-Q3 | hard-landing | breach | 7.1591x | 1.5439x | 19.0 | net leverage, interest coverage, liquidity |
| 2026-Q4 | hard-landing | breach | 8.6184x | 1.2562x | 12.0 | net leverage, interest coverage, liquidity |
Remaining headroom
Negative headroom indicates a breached threshold. Exact captured values are shown below.
| Period | Scenario | Net leverage | Interest coverage | Liquidity |
|---|---|---|---|---|
| 2026-Q1 | base | 1.0x | 1.0x | 15.0 |
| 2026-Q2 | base | 0.3462x | 0.4074x | 9.0 |
| 2026-Q3 | base | -0.5455x | -0.0702x | 4.0 |
| 2026-Q4 | base | -1.6053x | -0.4298x | -3.0 |
| 2026-Q1 | hard-landing | -0.5x | 0.4x | 5.0 |
| 2026-Q2 | hard-landing | -1.4135x | -0.0741x | -1.0 |
| 2026-Q3 | hard-landing | -2.6591x | -0.4561x | -6.0 |
| 2026-Q4 | hard-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.
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.