# Israeli fiscal starting conditions: 2025 sensitivity

Source: [Bank of Israel Annual Report 2025, chapter 6](https://boi.org.il/media/u4zp5dm5/chap-6e-2025.pdf), table 6.1 and box 6.3. Table 6.1 reports net public debt of 66.4% of GDP, gross public debt of 68.5%, a 6.5% national-accounts general-government deficit and 3.6% interest expenditure. The actual primary deficit calculated from these rounded values is 2.9% of GDP. Box 6.3 uses an estimated structural primary deficit of 1.3%.

The model tracks net debt. The reference v269 case initializes that variable from the earlier gross-debt proxy and balances its opening overall budget. The sensitivity replaces the debt proxy with the observed net-debt ratio. For each primary anchor, the model's 1% nominal rate implies opening interest of 0.664% of GDP. This interest is added to the primary deficit to construct the model's opening overall deficit, because v269's spending shift moves the overall balance. The 6.5% observed overall deficit is tested separately as a stress. The shifts change recurring commitments in the model, so the runs do not assume that the observed deficit is a forecast, nor distinguish temporary war expenditure from permanent commitments. Other baseline inputs, including modeled taxes, are carried over from v269.

Each row runs the same 108 distinct cases per consumption-share setting. A joint pass requires both displaced cohorts to retain 90% of initial real nonhousing consumption throughout and satisfy the strict 90%-of-output net public debt screen.

| Fiscal setting | Opening net debt (% GDP) | Model opening overall deficit (% GDP) | Joint passes, consumption share 0.90 | Joint passes, share 0.76 |
|---|---:|---:|---:|---:|
| v269 reference | 64.7 | 0.000 | 62/108 | 66/108 |
| Net debt only | 66.4 | 0.000 | 62/108 | 66/108 |
| Structural primary anchor | 66.4 | 1.964 | 55/108 | 62/108 |
| Actual primary anchor | 66.4 | 3.564 | 29/108 | 62/108 |
| Actual total deficit stress | 66.4 | 6.500 | 29/108 | 29/108 |

In the final stress, 72/108 paths complete at a consumption share of 0.90 and 108/108 at 0.76. Counts always use the full scenario denominator. The fiscal anchor matters in this model, but the effect of the actual primary anchor is sensitive to the consumption-share assumption. No scenario probabilities, causal estimates or full 2025 national-accounts recalibration are inferred.

## Temporary spending versus recurring commitments

The actual-primary case opens at a 2.9% primary deficit, equivalent to a 3.564% model overall deficit. Keep the structural primary anchor of 1.3% and let the extra 1.6 points of opening real spending fall linearly to zero by model year 3 or 7. The durations are scenario assumptions. Later deficit ratios are outcomes of the model, since prices, revenue, output and interest change.

| Path for the excess spending | Joint passes at 0.90 | Rationed at least once at 0.90 | Strict debt-screen failures at 0.90 | Joint passes at 0.76 |
|---|---:|---:|---:|---:|
| Fades by year 3 | 55/108 | 50/108 | 36/108 | 62/108 |
| Fades by year 7 | 44/108 | 65/108 | 36/108 | 62/108 |
| Persists throughout | 29/108 | 72/108 | 44/108 | 62/108 |

All 108 runs completed for each of these settings. At the 0.76 consumption share, each path had 36 rationed cases and 36 strict debt-screen failures. At 0.90, the three-year fade returns the same joint pass count as the structural-anchor-only case, while five additional scenarios experience some rationing (50 versus 45).

Reproduce from the repository root with `python -m scripts.israel_fiscal_2025_sensitivity`. The runner checks the opening overall balance of each run and reproduces 62/108 preserved cases at the v269 reference setting.

## Matched cases: where faster spending normalisation matters

The comparison below pairs each case across all three spending paths, with the same productivity, tenure, pass-through and other model assumptions. Counts use the joint consumption and debt outcome defined above.

| Productivity gain | Distinct cases | 3-year fade, share 0.90 | 7-year fade, share 0.90 | Persistent, share 0.90 | Each path, share 0.76 |
|---|---:|---:|---:|---:|---:|
| 25% | 36 | 0 | 0 | 0 | 0 |
| 50% | 36 | 26 | 15 | 0 | 33 |
| 100% | 36 | 29 | 29 | 29 | 29 |

At a consumption share of 0.90, all 26 cases that switch from failure with persistent spending to success with a three-year fade are in the 50% productivity group. In the persistent path all 26 fail the consumption criterion and experience benefit rationing. Of these, 23 still pass the strict debt screen and three fail it as well. The seven-year path recovers 15 of the same cases. At 0.76 the case-level classification is identical across the three spending paths. These comparisons describe the specified grid. They do not identify a continuous productivity threshold or an empirical effect.

## Sensitivity across intermediate consumption shares

The same 108 cases are paired at each consumption share. This parameter is the model's share of disposable resources devoted to consumption. The interval is a sensitivity grid, not a confidence interval or an estimated response for displaced households.

| Model consumption share | Three-year fade | Seven-year fade | Persistent spending |
|---|---:|---:|---:|
| 76% | 62 | 62 | 62 |
| 78% | 62 | 62 | 62 |
| 80% | 62 | 62 | 61 |
| 82% | 62 | 62 | 54 |
| 84% | 62 | 62 | 40 |
| 86% | 62 | 61 | 34 |
| 88% | 58 | 56 | 29 |
| 90% | 55 | 44 | 29 |

Counts denote joint consumption and debt passes out of 108. At the first two settings the same 62 cases pass under every path. The first difference appears at 80% on this grid. At 84%, both fading paths preserve the same 62 cases, while the persistent path preserves only 40. At 90%, the three-year path exceeds the seven-year path by 11 paired cases. The tested points do not locate an exact transition between adjacent values.

To reproduce the matched comparison, run this snippet from the repository root.

```python
from collections import Counter
from itertools import product
from scripts import israel_fiscal_2025_sensitivity as fiscal

model = fiscal.model
inputs = dict(model.b249.inputs(), debt=fiscal.NET_DEBT)
interest = inputs["debt"] * inputs["interest"]
opening = fiscal.ACTUAL_PRIMARY_DEFICIT + interest
floor = fiscal.STRUCTURAL_PRIMARY_DEFICIT + interest
shifts = (fiscal.fade_spending(opening, floor, 3),
          fiscal.fade_spending(opening, floor, 7), opening)
variant = "paired_fiscal_comparison"

for share in (0.76, 0.78, 0.80, 0.82, 0.84, 0.86, 0.88, 0.90):
    by_gain, transitions, persistent_failures = Counter(), Counter(), Counter()
    try:
        with model.b249.israel(inputs):
            for values in product(*(model.FACTORS[key] for key in model.KEYS)):
                case = dict(zip(model.KEYS, values))
                if case["tenure"] in ("renter", "owner_free") and case["stress"] == "rate_shock":
                    continue
                wins = []
                for shift in shifts:
                    model.VARIANTS[variant] = dict(model.VARIANTS["central"], shift=shift)
                    row = model.run(case, inputs, variant, share)
                    assert row["completed"] and abs(row["year0_room"] + opening) < 1e-6
                    debt_ok = (row["peak_debt"] <= 0.90 + 1e-8
                               and not row["flags"]["cap_breached_by_commitments"])
                    wins.append(bool(row["preserved"] and debt_ok))
                gain = case["productivity_gain"]
                by_gain[gain, "cases"] += 1
                for label, passed in zip(("3y", "7y", "persistent"), wins):
                    by_gain[gain, label] += passed
                transitions[tuple(wins)] += 1
                if wins[0] and not wins[2]:
                    persistent_failures[row["preserved"], debt_ok, row["rationed"]] += 1
    finally:
        model.VARIANTS.pop(variant, None)
    assert sum(transitions.values()) == 108
    joint = [sum(count for wins, count in transitions.items() if wins[index])
             for index in range(3)]
    print(share, joint, dict(by_gain), dict(transitions), dict(persistent_failures))
```
