| ∂ b_s[2] / ∂ b_s[1] | Z1 | Z2 |
|---|---|---|
| Z1 seed | 1.02159126 | 0.00000000 |
| Z2 seed | 0.00000000 | 1.02167305 |
The stability structure of the sraffian calibration problem
The debt block decouples into one scalar mode per region, each with level eigenvalue 1 + r_b and detrended ratio eigenvalue (1+r_b)/(1+g); both exceed one because r_b > g. The household portfolio λ’s are orthogonal to the debt map, so no portfolio specification can stabilise the baseline.
Written: 2026-09-26 · Companion to: qmd/reports/2026-09-26-sraffian-baseline-calibration.qmd (the five-lever sweep) and qmd/reports/2026-09-09-transition-matrix-spectrum.qmd (the full 588 × 588 spectrum of the coded arm, which this reduces).
Read from: R/reduced_debt_jacobian.R (written for this report) and its output output/calibration/reduced_debt_jacobian_sraffian.RDS; the sraffian baseline output/scenarios/arms/sraffian/runs/baseline.RDS; the model source model/code/MVP_model_2026.R (the government budget identity at :670 and the spending growth at :533); the companion reports named above.
Status of claims: every number is recomputed from the saved .RDS when this document is rendered. The identification of the eigenvalue with 1 + r_b is a finite-difference match to 8e-05 plus a mechanism read off the source; the two are stated separately.
What this is about
The sraffian arm (uniform-profit-rate price system p = (1+r)p(A+D) + l, standard commodity as numéraire, empirical D = diag(CFC/x)) completes its 100 periods but has no stable baseline: EU nominal debt Z1_b_s compounds without bound. The sweep companion report established that no single fiscal instrument reaches “debt growth ≈ 1”, and measured the binding constraint as r_b > g — nominal output growth g of 1.02%/period (Z1) and 0.45%/period (Z2) against a bill rate r_b of 2.16%.
This report states why that is the binding constraint, in the language of the 2026-09-09 transition-matrix report: the debt subsystem is a reduced Jacobian whose eigenvalues are exactly 1 + r_b (the level) and (1+r_b)/(1+g) (the debt/GDP ratio), and the household portfolio λ’s do not enter it. That last fact is the answer to the calibration question that opened this session — the portfolio is not a stabiliser, and the reason is structural, not a matter of the shipped zero coefficients.
Background the reader may not have
The reduced Jacobian, and why “reduced” is enough
The 2026-09-09 spectrum report diagonalised the full one-period transition matrix M = (I − J_c)⁻¹ J_ℓ (588 × 588) on the coded baseline and found exactly two eigenvalues outside the unit circle, both equal to 1 + r_b, both real, loading on b_s and b_cb. That is the whole instability of the model, and it lives in the government-debt block.
The debt block is a closed two-equation subsystem. Write b_s for the bill stock and va for value added, per region:
b_s[t] = b_s[t-1] + gdef[t]
gdef[t] = primary[t] + r_b · b_s[t-1]
where primary collects g·pg − t − f_cb − vat − tar + id_g·pid_g — everything in the deficit except the interest service. Differentiating b_s[t] with respect to b_s[t-1] gives the reduced Jacobian of the debt block: a 2 × 2 matrix (one row/column per region) whose diagonal entry is the self-loop of each region’s debt and whose off-diagonal is any cross-region coupling.
Two facts make the reduced object the right one rather than a shortcut. First, primary responds to income, not to b_s directly, so at first order the self-loop is 1 + r_b and the off-diagonal is zero. Second, the portfolio λ’s appear nowhere in gdef — they decide who holds the debt, which moves the current account and the distribution of interest income, but never the government’s own budget identity. Both facts are checked numerically below.
The detrended eigenvalue: the 2026-09-09 report computed the wrong object for this question
The 2026-09-09 report diagonalised the level map and reported ρ(M) = 1 + r_b. That is the right answer to “does the debt stock compound”, but the calibration question is about the debt/GDP ratio d[t] = b_s[t]/va[t]. Detrending by nominal growth g = va[t]/va[t-1] − 1,
d[t] = d[t-1] · (1 + r_b)/(1 + g) + primary[t]/va[t].
The level eigenvalue is 1 + r_b; the ratio eigenvalue is (1 + r_b)/(1 + g). Stability of the ratio requires the latter to be below one, i.e. r_b < g. The two objects coincide only when g = 0. This report gives both.
The object itself
R/reduced_debt_jacobian.R measures the reduced Jacobian by finite difference on the actual period map, exactly as R/transition_matrix.R measured the full matrix: perturb b_s in one region at the seed (period 1), re-solve two periods, and difference against the unperturbed solve, with the engine’s fixed-iteration behaviour held common so the difference is a genuine derivative and not a solver discontinuity. The seed-perturbation isolates the self-loop ∂b_s[2]/∂b_s[1], because the interest term r_b · b_s[1] sits inside gdef[2] while the indirect income channel is second-order.
What was found
1. The debt block is diagonal — one independent scalar mode per region
The reduced Jacobian is 0.000000 off-diagonal in both entries. There is no cross-region debt coupling: a perturbation to Z1’s bill stock propagates to Z1’s next-period stock and to nothing in Z2. The two regions’ debt paths are two independent first-order modes. This is why the 2026-09-09 full spectrum showed two (not four) unstable eigenvalues, and why each region can be stabilised or left unstable on its own.
2. The level eigenvalues are exactly 1 + r_b
| Region | finite-difference eigenvalue | 1 + r_b | |difference| |
|---|---|---|---|
| Z1 | 1.0216730468 | 1.0215912638 | 8.18e-05 |
| Z2 | 1.0215912639 | 1.0216730467 | 8.18e-05 |
Both eigenvalues are real and outside the unit circle (1.021591 and 1.021673), matching the 2026-09-09 result on the coded arm to 8e-05. The price system does not move the debt eigenvalue. The sraffian arm changes the profit rate r ( = π·R ) from 22.4% to 25.5%, and that moves the primary deficit (through the profit/wage split and the tax base), not the interest self-loop 1 + r_b — r_b is a fixed markup r_star + μ_b over a fixed policy rate, identical in every arm.
3. The detrended eigenvalues are the ratio growth, and both exceed one
| Region | r_b | g (nominal, per period) | level eigenvalue 1 + r_b | ratio eigenvalue (1+r_b)/(1+g) | ratio growth / period |
|---|---|---|---|---|---|
| Z1 | 2.1591% | 1.0201% | 1.021591 | 1.011275 | +1.1275% |
| Z2 | 2.1673% | 0.4534% | 1.021673 | 1.017061 | +1.7061% |
The ratio eigenvalue is 1.0113 (Z1) and 1.0171 (Z2). The instability is r_b > g, and it is larger in RoW than in the EU (ratio growth 1.71% vs 1.13% per period), because RoW’s nominal growth (0.45%) is lower than the EU’s (1.02%) while its bill rate is essentially the same. This is the measured statement that sits behind the sweep companion report’s “the combination must raise g or lower the effective rate, not just close the primary.”
4. The eigenvalue is not the whole debt path — the primary deficit is the forcing
The level eigenvalue 1 + r_b = r sprintf("%.6f", lam_level["Z1"]) compounds the existing debt stock by 8.1× over the 98 periods from t = 2 to t = 100, if the primary were zero. The measured debt growth is 50.2× (Z1) and 33.1× (Z2). The factor by which the measured path exceeds the eigenvalue’s compounding — about 6.2× in Z1 — is the persistent primary deficit: the forcing term primary[t]/va[t] in the ratio recursion.
This is the separation the calibration effort needed and did not have stated explicitly. A stabiliser can act on the eigenvalue (lower r_b, raise g) or on the forcing (a primary-balance rule). The five levers of the companion report act almost entirely on the forcing; only g_g (which raises g) and the interest rates (which lower r_b) touch the eigenvalue. That is why the fiscal rules, which close the deficit, leave the ratio compounding at the eigenvalue’s rate.
5. The portfolio λ’s are orthogonal to the debt map
R/reduced_debt_jacobian.R perturbs the Z1 foreign-bill intercept lambda20 by ×1.5 and re-solves: Z1_b_s[2] moves by exactly 0 (0 of 6,713 cells differ). The reason is the one stated at the top — gdef reads g, t, r_b, b_s, f_cb, vat, tar, id_g, and none of these reads a λ. The λ’s enter the household portfolio equations (b_h, e_h, mh), which feed disposable income, consumption and the current account — but not the government budget identity. A fully rate-sensitive N-region Tobin system would therefore leave this eigenvalue exactly where it is. The portfolio is a distribution (who holds the debt, and how the external balance clears), not a stabiliser.
What it means
Interpretation, resting on the measurements above.
The stability structure of the calibration problem is now a stated object, not an impression. Two scalar modes, one per region, each with level eigenvalue 1 + r_b and ratio eigenvalue (1+r_b)/(1+g). Both ratios exceed one because r_b > g. The portfolio block is orthogonal to both. Nothing else in the model is unstable.
For the random search, the objective is now precise. The search should minimise the detrended eigenvalue — drive (1+r_b)/(1+g) below one, or equivalently close r_b − g — not the raw debt level. That selects the instrument groups with real leverage: rates (r_star, μ_b, μ_m, μ_l, μ_h) and spending (g_g), the two groups that enter the eigenvalue. taxes acts on the forcing, and portfolio is inert for this purpose. This is the concrete reading of the companion report’s verdict (“no single lever reaches debt growth ≈ 1”) — the levers were aimed at the forcing, while the instability is in the eigenvalue.
For a referee asking whether the model is dynamically well-behaved, the answer is one paragraph with a mechanism, unchanged from 2026-09-09 but now with the ratio object named: the government budget identity has no reaction function strong enough to close the interest–growth gap, and the resulting ratio root is (1+r_b)/(1+g). That is a common and defensible property of an SFC model over a finite horizon, but it is now a measured property of the sraffian arm specifically.
The target-ratio table, and why the horizon is t = 75
The calibration objective reads the model’s twelve target concepts against data/target_values.xlsx and forms the ratio model / target per region. The table below is that ratio, at t = 75 (the evaluation point the search now uses) and at t = 100 (the run horizon), on the sraffian baseline.
| concept | kind | target Z1 | ratio Z1 @75 | ratio Z1 @100 | target Z2 | ratio Z2 @75 | ratio Z2 @100 |
|---|---|---|---|---|---|---|---|
| c | real | 626.318 | 0.933 | 0.935 | 2370.706 | 0.773 | 0.777 |
| id | real | 196.615 | 0.818 | 0.821 | 908.672 | 0.796 | 0.801 |
| g | real | 239.459 | 1.002 | 1.002 | 675.328 | 1.000 | 1.000 |
| rex | real | 102.776 | 1.662 | 1.669 | 66.357 | 2.579 | 2.586 |
| imp | real | 66.357 | 0.913 | 0.915 | 102.776 | 0.803 | 0.807 |
| M_TOT_int | real | 123.152 | 0.898 | 0.900 | 105.855 | 0.833 | 0.837 |
| fd | real | 1098.811 | 0.962 | 0.964 | 3918.288 | 0.878 | 0.881 |
| go | real | 2153.602 | 0.908 | 0.910 | 8424.517 | 0.831 | 0.834 |
| va | nominal | 1081.514 | 1.026 | 1.028 | 3935.585 | 0.903 | 0.907 |
| gdef | nominal | 0.250 | 176.234 | 296.812 | 0.250 | -158.918 | -293.852 |
| b_s | nominal | 876.026 | 3.792 | 5.455 | 3345.247 | 1.323 | 0.903 |
| debt_gdp | ratio | 0.810 | 3.697 | 5.307 | 0.850 | 1.465 | 0.995 |
Three things in that table are the same finding, seen through the target lens.
The real economy fits, and the fiscal block does not. The eight real concepts — consumption, investment, government spending, re-exports, imports, intermediate material demand, final demand, gross output — sit within roughly 0.77–1.03 of target in both regions. The three nominal/fiscal concepts are the outliers: gdef is unbounded in ratio because its target (0.25, a deficit of 0.023% of GDP) is near zero, and b_s and debt_gdp are 3–5× over target in the EU. The model’s misfit is concentrated in exactly the block the spectrum said is unstable.
The fit degrades from t = 75 to t = 100, and that degradation is the ratio eigenvalue. Fitness worsens from 2345.8 to 7270.2; Z1’s b_s ratio moves 3.79 → 5.46 and debt_gdp 3.70 → 5.31, while the real ratios barely move. That is the debt compounding at (1+r_b)/(1+g) = r sprintf("%.4f", lam_ratio["Z1"]) per period — the eigenvalue of §3 — acting on the two fiscal concepts and nothing else. Evaluating the target at t = 75 rather than t = 100 is therefore not an arbitrary choice: it scores the model before the unstable mode has had a further 25 periods to carry the debt away from its target, which is the period when the fit still has a chance of saying something about the parameters rather than about the missing reaction function.
Limits and what is not established
- This is a reduced, first-order object. The 2 × 2 Jacobian captures the debt self-loop and the off-diagonal coupling; it does not re-derive the full 588 × 588 spectrum on the sraffian arm, which would require re-forming
Mwith the production price block (the 2026-09-09 machinery, ~10 min per base point). The claim “nothing else is unstable” is carried from the 2026-09-09 full-spectrum result on the coded arm, not re-measured here. - The finite difference is at the seed (period 1 → 2), not on the interior of the path. The self-loop is constant by construction (
r_bis fixed), so the base point does not matter for the eigenvalue; it does matter for the forcing, which is why the debt-growth figures are quoted at the run horizon. gis measured as the average per-periodvagrowth over the run, which is what the detrending calls for, but it is a realised path quantity, not a model parameter. Underg_g > 0it would drift; the ratio eigenvalue is then time-varying and the quoted number is the baseline’s.- The λ-null is a single-parameter check (one intercept, ×1.5). It establishes that the intercept does not enter
gdef; it does not by itself prove no behavioural λ could, but the source showsgdefreads no λ of any kind, so the two strands agree.
Where this leaves things
- The reduced diagnostic is the objective function for the search. Minimise
(1+r_b)/(1+g) − 1per region; the natural instrument groups areratesandspending(g_gis now wired intoR/calibrate_random_search.R). - The portfolio is out of the stabiliser set, for a measured reason. Wire it (if at all) as a home-bias calibration with the horizontal adding-up constraint, not as a search instrument that can “find” stability.
- The forcing and the eigenvalue must not be conflated again. The five-lever sweep and this spectrum are the same finding seen twice: the levers closed the primary (forcing) and left the interest–growth gap (eigenvalue) untouched.
Sources: R/reduced_debt_jacobian.R · output/calibration/reduced_debt_jacobian_sraffian.RDS · output/scenarios/arms/sraffian/runs/baseline.RDS · model/code/MVP_model_2026.R · qmd/reports/2026-09-26-sraffian-baseline-calibration.qmd · qmd/reports/2026-09-09-transition-matrix-spectrum.qmd · qmd/reports/2026-09-09-dependency-graph.qmd.