# Step 285: fiscal support for demand when the rate is at zero

**Why.** In step 283, the investment slump estimated from OECD data leaves the policy rate at zero in 85% of
cases, and preservation at 30%. The usual answer at the lower bound is fiscal policy. Here the government
adds public purchases, public investment for instance, to fill the demand shortfall.

The model is `scripts/closure_model_v285.py`, a copy of step 283; with the new options off it reproduces
step 283 exactly (tested). The grid is `scripts/fiscal_support_v285.py`, with output in
`data/processed/fiscal_support_v285.json`. All runs use the 432 cases with the revised specification, the
symmetric demand closure and the step-283 central-bank rule. Illustrative; not a forecast.

## The support rule

- **Amount.** Support = min(5% of output, φ × last year's underlying shortfall). The underlying shortfall
  is the shortfall plus last year's support.
- **When.** At the bound: only in years in which the policy rate is at zero. Or at any gap: whenever there
  is a shortfall.
- **Financing.** Three versions:
  - **debt:** ordinary spending. It raises the debt and counts against the 90% cap, so under the fiscal
    rule it competes with the benefit.
  - **golden rule:** the support and the debt it creates are left out of the cap. That debt still bears
    interest and still raises the risk premium.
  - **profit levy:** an extra tax on profits of up to 15% of profits pays for the support, and only the
    remainder is borrowed.
- **No supply effect.** The purchases add demand only; any effect on productive capacity is left out.

## Results

Each cell gives the number of the 432 cases in which both displaced cohorts are preserved, with fiscal
crises in brackets. All rows use support φ = 1 at any gap; the "at the bound" row uses φ = 1 at the bound.

| Specification | Slump, OECD estimate (decay 1.27): s 0.6 | s 0.15 | Full slump (decay 1.0): s 0.6 | s 0.15 |
|---|---:|---:|---:|---:|
| No support (step 283) | 131 (290) | 65 (314) | 234 (130) | 167 (228) |
| Support, debt | 108 (322) | 60 (350) | 202 (123) | 163 (201) |
| Support, golden rule | 122 (340) | 88 (350) | 229 (265) | 193 (280) |
| **Support, profit levy** | **202 (128)** | **163 (178)** | **269 (24)** | **251 (42)** |
| Support at the bound only, profit levy | 198 (177) | 147 (218) | 253 (90) | 222 (125) |

When investment holds (decays 0 and 0.35), support is rarely triggered. With the profit levy it changes the
count by at most 5 cases (for example 293–298 against 298 at decay 0, s 0.6).

**What it shows.**

> **Update (10 November 2026).** The figures in this section use separate ceilings for the benefit levy and the support levy (up to 30% of profits together), with support filling the whole gap (φ = 1). The thesis headline uses a shared 15% ceiling for both levies (see "Shared annual ceiling" below): 147 cases (34%) at any gap and 163 (38%) at the lower bound only. Part of the 30%→47% gain reported here comes from the extra tax capacity, not from the support itself.

- **Debt-financed support does not help, and with the debt cap it hurts.** The slump is not a brief gap.
  It is a lasting excess of saving over investment. Filling it with borrowing adds about 3% of output a
  year to the deficit. Under the cap, that spending crowds out the benefit.
- **A golden rule helps a little and costs a lot of debt.** Exempt from the cap, the support no longer
  crowds out the benefit, and with φ = 0.5 preservation rises to 38%–39%. But peak debt reaches 1.2–1.5
  times output, the risk premium rises, and fiscal crises do not fall.
- **Financed from profits, the same support works.** The levy takes back part of the surplus that is not
  being invested and spends it. Preservation in the estimated slump rises from 30% to 47% (from 15% to 38%
  at the low investment sensitivity). Fiscal crises fall from 290 to 128, and peak debt stays near the
  cap. In the full slump it reaches 62%.
- **This fits the thesis's main result.** What protects the displaced is a tax on the profits automation
  creates. Borrowing is no substitute for it, whether to pay the benefit or to support demand.

## Limits

- **Demand only.** Public investment that raised productive capacity would help more in the long run,
  and would also widen the demand gap in the short run. Neither is modelled.
- **A crude rule.** It is annual and based on last year's shortfall, with no lags in implementation and no
  waste.
- **A profit levy on top of the existing 15% levy.** The two together can reach 30% of profits. The model
  has no response of investment or location to the tax.
- **The rule for owners' consumption** (90% of income) sets how much of the taxed profit would otherwise
  have been spent. With a lower propensity among owners, the levy would add more demand.

## Joint consumption and debt screen

The following rerun pairs the same 432 cases at OECD investment decay 1.27. Full support uses φ = 1. A debt pass requires a completed run with peak **total net public debt** at or below 90% of output, including the debt exempted from the spending rule in the golden-rule variants. The 95% crisis threshold remains a separate diagnostic. A joint pass requires both a debt pass and preservation of at least 90% of initial real nonhousing consumption for both displaced cohorts throughout the simulation.

| Interest sensitivity | Support variant | Preserve consumption | Debt ≤90% | Joint pass | Debt >95% |
|---:|---|---:|---:|---:|---:|
| 0.60 | None | 131 | 141 | 60 | 290 |
| 0.60 | Debt, any gap | 108 | 92 | 41 | 322 |
| 0.60 | Debt, zero rate only | 122 | 122 | 56 | 302 |
| 0.60 | Golden rule, any gap | 122 | 92 | 41 | 340 |
| 0.60 | Golden rule, zero rate only | 162 | 113 | 51 | 310 |
| 0.60 | Profit levy, any gap | 202 | 284 | 189 | 128 |
| 0.60 | Profit levy, zero rate only | 198 | 242 | 146 | 177 |
| 0.15 | None | 65 | 110 | 27 | 314 |
| 0.15 | Debt, any gap | 60 | 82 | 23 | 350 |
| 0.15 | Debt, zero rate only | 57 | 84 | 22 | 340 |
| 0.15 | Golden rule, any gap | 88 | 78 | 22 | 350 |
| 0.15 | Golden rule, zero rate only | 104 | 82 | 20 | 350 |
| 0.15 | Profit levy, any gap | 163 | 210 | 125 | 178 |
| 0.15 | Profit levy, zero rate only | 147 | 176 | 93 | 218 |

All variants above completed all 432 runs. The 47% headline is 202/432 for consumption preservation with the levy at any gap. With the debt condition, the same variant has 189/432 joint passes. Triggering only at zero gives 146/432 joint passes. At the lower interest sensitivity, the corresponding counts are 125/432 and 93/432. The conclusions are conditional on the modeled tax and spending rules, including the two separate levy limits described above.

Run from the repository root to reproduce the comparison.

```python
import json
from scripts import fiscal_support_v285 as fiscal

cases = fiscal.fr.unique_cases()
assert len(cases) == 432
archive = json.loads(fiscal.OUT.read_text())["variants"]
for sensitivity in ("s060", "s015"):
    for policy in (
        "phi000_elb", "phi100_gap", "phi100_elb",
        "phi100_gap_golden", "phi100_elb_golden",
        "phi100_gap_levy", "phi100_elb_levy",
    ):
        name = f"{sensitivity}_d127_{policy}"
        rows = [fiscal.run(case, fiscal.VARIANTS[name]) for case in cases]
        assert all(row["completed"] for row in rows)
        debt_pass = [row["peak_debt"] <= fiscal.fr.CAP + 1e-8 for row in rows]
        preserved = sum(row["preserved"] for row in rows)
        joint = sum(row["preserved"] and within_cap
                    for row, within_cap in zip(rows, debt_pass))
        crises = sum(row["crisis"] for row in rows)
        assert (preserved, crises) == (
            archive[name]["preserved"], archive[name]["fiscal_crises"]
        )
        print(name, preserved, sum(debt_pass), joint, crises)
```

## Shared annual ceiling for the two profit levies

The additional benefit and demand-support levies share a single annual ceiling of 15% of positive profits. The benefit levy gets first claim on that budget, matching the existing order in the model. Each levy also retains its own individual rate limit. This ceiling applies to the two **additional** levies, not to the ordinary profit tax.

All runs below use the same 432 cases, OECD investment decay 1.27 and full support (φ = 1). The original runs allow the two levies to reach 30% together. Consumption and total net debt are screened as in the previous section.

| Investment response to rates | Support trigger | Joint, separate limits | Consumption, shared ceiling | Debt ≤90%, shared ceiling | Joint, shared ceiling | Debt >95%, shared ceiling |
|---:|---|---:|---:|---:|---:|---:|
| 0.60 | Any demand gap | 189 | 147 | 199 | 134 | 204 |
| 0.60 | Zero rate only | 146 | 163 | 191 | 119 | 220 |
| 0.15 | Any demand gap | 125 | 102 | 165 | 91 | 260 |
| 0.15 | Zero rate only | 93 | 88 | 151 | 81 | 276 |

Under both interest sensitivities, the joint result is better than the no-support benchmark (60 or 27 cases) but weaker than with separate limits. At the central sensitivity, waiting for the zero rate preserves consumption in more cases than acting at any gap (163 versus 147), while acting at any gap has more joint passes (134 versus 119). The comparison assumes priority for the benefit levy and the existing model response to taxes.

The rows are archived in `data/processed/fiscal_shared_ceiling_v285.json` by `scripts/fiscal_shared_ceiling_v285.py` (test: `scripts/test_fiscal_shared_ceiling_v285.py`). The same calculation, inline:

```python
from scripts import fiscal_support_v285 as fiscal

cases = fiscal.fr.unique_cases()
assert len(cases) == 432
for sensitivity in ("s060", "s015"):
    for trigger in ("gap", "elb"):
        name = f"{sensitivity}_d127_phi100_{trigger}_levy"
        settings = dict(fiscal.VARIANTS[name], shared_levy_rate=.15)
        rows = [fiscal.run(case, settings) for case in cases]
        assert all(row["completed"] for row in rows)
        debt_pass = [row["peak_debt"] <= fiscal.fr.CAP + 1e-8 for row in rows]
        print(name, sum(row["preserved"] for row in rows), sum(debt_pass),
              sum(row["preserved"] and ok for row, ok in zip(rows, debt_pass)),
              sum(row["crisis"] for row in rows))
```
