{
  "preset": "pt-v14",
  "certified_horizon_days": 252,
  "statistics": {
    "annualised_vol_pct": {
      "measured": 28.3103,
      "band": [
        15.0,
        36.0
      ],
      "in_band": true
    },
    "excess_kurtosis": {
      "measured": 10.0043,
      "band": [
        1.6,
        41.0
      ],
      "in_band": true
    },
    "return_acf1": {
      "measured": 0.0114,
      "band": [
        -0.08,
        0.06
      ],
      "in_band": true
    },
    "abs_return_acf1": {
      "measured": 0.0769,
      "band": [
        0.02,
        0.22
      ],
      "in_band": true
    },
    "abs_return_acf5": {
      "measured": 0.0305,
      "band": [
        0.01,
        0.12
      ],
      "in_band": true
    },
    "abs_return_acf20": {
      "measured": 0.0096,
      "band": [
        -0.04,
        0.08
      ],
      "in_band": true
    },
    "cross_sectional_corr": {
      "measured": 0.2616,
      "band": [
        0.08,
        0.56
      ],
      "in_band": true
    },
    "volume_abs_return_corr": {
      "measured": 0.5108,
      "band": [
        0.46,
        0.66
      ],
      "in_band": true
    },
    "leverage_effect": {
      "measured": -0.0258,
      "band": [
        -0.16,
        0.0
      ],
      "in_band": true
    },
    "volume_change_acf1": {
      "measured": -0.2794,
      "band": [
        -0.32,
        -0.2
      ],
      "in_band": true
    },
    "corr_asymmetry": {
      "measured": -0.0018,
      "band": [
        -0.25,
        0.45
      ],
      "in_band": true
    },
    "corr_asymmetry_lagged": {
      "measured": -0.0327,
      "band": [
        -0.2,
        0.55
      ],
      "in_band": true
    },
    "sector_excess_corr": {
      "measured": 0.2081,
      "band": [
        0.11,
        0.23
      ],
      "in_band": true
    },
    "corr_persistence_acf1": {
      "measured": 0.1771,
      "band": [
        -0.19,
        0.54
      ],
      "in_band": true
    }
  },
  "gaps": [
    {
      "id": "horizon",
      "summary": "the certified horizon is 252 days",
      "detail": "Against bands re-derived at the matching window, the shipped pt-v14 holds ALL FOURTEEN at 504 days, as pt-v12 did before it. pt-v12 was the first to manage it: pt-v3 held 7 there and pt-v10 held 13.\n\nSo why is the horizon still 252? Two reasons, and the band count is neither. First, headroom -- though this reason has weakened: under pt-v12 annualised_vol_pct read 33.89 against a band ending at 34.0, only 0.11 of room on a statistic whose seed spread is many times that. pt-v14 reads 30.24 there, which is 3.76 of room, so the fourteenth row is no longer thin. Second and now decisive on its own, CERTIFIED is what this module certifies and it is measured at 252 days on thirty seeds. The 504-day table is measured, not certified.\n\nWhat remains is a SHAPE problem rather than a level one. Volatility itself stabilises near 32%, so a long run does not drift or blow up, and clustering at lags one and five stays inside its bands. The decay curve is the defect, and the decay-shape gap carries it: exponential memory imitating hyperbolic memory holds up over one year and comes apart over several.\n\nAND THE LONGER HORIZONS ARE MEASURED NOW. This gap ended 'nothing beyond 504 has been measured at all' until 2026-08-27, and pt-v12 made that untrue. tools/calibration/long_horizon.py runs 756, 1260 and 2520 days on thirty seeds, and at 2520 days the panel holds 10 of 14 -- against the 504-day bands, which are the wrong ruler for a ten-year window and are quoted only because no ten-year bands have been derived. That nothing RUNS AWAY is settled by a second measurement needing no band at all: tools/calibration/memory_vs_drift.py reads annualised volatility year by year over ten years on twenty seeds, and it gives 31.5, 35.6, 30.2, 33.5, 33.0, 33.1, 31.3, 32.4, 32.4 and 31.6 percent, which is flat. So a five-year study is reading numbers that exist and are published. What it does not have is a band derived at its own horizon, and there is no committed tool to derive one -- which is what keeps the certification at 252 days.",
      "forbids": "multi-year backtests, and anything keyed on volatility dynamics beyond one year",
      "statistics": [
        "abs_return_acf1",
        "abs_return_acf5",
        "return_acf1",
        "excess_kurtosis"
      ],
      "beyond_days": 252,
      "closed_by": []
    },
    {
      "id": "decay-shape",
      "summary": "volatility memory decays exponentially, not hyperbolically",
      "detail": "Log-log slope over lags 1-20 is -0.953 against real markets' -0.436, about 2.2x steeper, and the curve turns NEGATIVE by lag 30 where real markets remain weakly positive to lag 60. This is a mechanism gap, not a calibration one: the process is built from exponentials, and over one year two of them fake a power law well enough that no panel statistic objects. A two-component mixture was tried and is not sufficient.\n\nSHARPENED 2026-08-26. The model already HAS two timescales, which had not been established. De-trending |r| by a centred 252-day rolling mean over 2520 days on twenty seeds and re-measuring: 86% of the lag-1 autocorrelation survives, 77% of lag-5, 29% of lag-20. Lags 1 and 5 are genuine memory from the GJR recursion, whose shock half-life is 3.9 days; lag 20 is mostly a slowly-varying variance LEVEL fed by the VIX and business-cycle channels. That slow component is not a trend -- annualised volatility year by year over ten years is flat, +0.6% from the first year to the tenth.\n\nThe flattering reading is refused. The raw log-log slope at 2520 days is -0.597, much closer to real markets than the -0.847 read at 252 days, and it would be easy to call this gap an artefact of a short estimator. Strip the slow level and the slope returns to -0.867. The long horizon adds regime variation on top of the defect rather than curing it.\n\nSo the target is specific now: not 'add long memory', which is already present and already does its job at lag 20, but make the FAST component decay hyperbolically rather than exponentially.\n\nAND THE SLOPE ALONE IS NOT THE TARGET. Measured 2026-08-26 on thirty seeds: turning on the market factor's slow variance component improves the log-log slope from -0.716 to -0.504 by LOWERING lag-1 autocorrelation from 0.1107 to 0.0693, while lag 20 does not move at all. A flatter line through a lower point is a better slope and a worse market -- real markets have BOTH short-lag clustering, `abs_return_acf1` between 0.02 and 0.22, and weakly positive autocorrelation out to lag 60. The slope is a ratio of shape to level and can be improved by destroying the level.\n\nScore work on this gap at lag 20 and beyond WITH LAG 1 HELD, never on the slope alone. The same run cost `excess_kurtosis` its 504-day band on five arms of six, because a smoother variance has thinner tails.\n\nRead the scope of that claim precisely. It says no setting of THIS model's parameters turns one slope into the other, because a sum of exponentials is not a power law. It does not say the problem is beyond the project: the volume-change gap carried the stronger claim, that its row was structurally unreachable, and a new mechanism reached it. A mechanism gap is closed by adding mechanism, not by tuning what is here.",
      "forbids": "strategies whose edge depends on volatility memory beyond about lag 20 -- vol targeting and risk parity on a one-month or longer estimate",
      "statistics": [
        "abs_return_acf20"
      ],
      "beyond_days": null,
      "closed_by": []
    },
    {
      "id": "scenario-magnitude",
      "summary": "a scenario's size is right on average and unreliable in one run",
      "detail": "The expected size of a scenario's response is calibrated; the dispersion around it is not, and that is the whole gap now.\n\nThe steady-state lever -- how much more violent a sustained crisis is than a calm market -- reads 6.12x on pt-v14 against real markets' 6.16x, measured from a held VIX 5 to a held VIX 65 on the certified 40-name roster over 252 days at thirty seeds. pt-v10 read 5.05x there and the default before it 3.07x. This gap opened by saying the VIX shock response was materially weaker than the previous preset's; on pt-v14 it is stronger than any preset before it and within two percent of real, so that sentence is WITHDRAWN.\n\n'Direction is right' is measured rather than asserted. Driving the real 2020-21 macro path through the model and correlating daily returns against each driver, over 504 sessions, against the same correlations computed on real AAPL over the same window:\n  return vs change in VIX             -0.423 (real -0.622)\n  return vs change in credit yield    -0.496 (real -0.592)\n  return vs change in valuation       +0.573 (real +0.803)\n  absolute return vs VIX level        +0.512 (real +0.489)\n\nAll four carry the sign theory fixes in advance, and the volatility-clustering channel is close to exact.\n\nThis gap used to read those three directional correlations as response SIZES, and said the model ran at seventy to eighty-five percent of the real response. That is withdrawn (\u00a781). A correlation is beta * sd(driver) / sd(return), which is signal share rather than gain, and measured as gains the three channels are right: OLS slope of daily return on each driver over the same 504 sessions gives -0.00461 against real AAPL's -0.00500 for the VIX, -8.106 against -7.445 for the credit yield, and +1.226 against +1.272 for valuation, all within ten percent, with real AAPL inside the model's six-seed range on every channel.\n\nThe denominator is the defect, and it is what keeps this a gap now that the lever has arrived. Over the driven window the model's residual sd is 1.565x real on pt-v12, down from 1.76x at pt-v10 and barely moved from 1.555x at pt-v11. That is the worst axis in the model. So the expected response to a scenario is calibrated and the dispersion around it is too wide: one run understates how much of its own move was the scenario. The daily-return-sd pair behind the pt-v10 ratio, 0.0355 against real AAPL's 0.0236, has not been re-measured since, so it is quoted with its era rather than as a current reading.\n\nAn event study over the five sessions after each of six dated 2020-21 events agrees on sign TWO times out of six. This paragraph said five of six until 2026-08-27; the notebook it cites prints 2/6. The Fed's intermeeting cut of 3 March 2020 goes the wrong way, +9.9% against AAPL's -1.4%, because an announcement-effect channel is absent rather than miscalibrated; the VIX record close of 16 March misses by declining to move, +0.3% against -7.4%; and the vaccine result and Omicron are single-name Apple news, which a run driven only by a macro path cannot know. The two that agree are the two the macro path carries. See examples/09-a-pandemic-shaped-market.ipynb.\n\nSector structure was the same shortfall measured a second way, and it is now CLOSED. In calm markets it is in band on the shipped preset, 0.2081 at 252 days and 0.1817 at 504 against bands starting at 0.11, which is why the separate sector-structure gap was retired at 0.2.0. Under a held VIX 45 pt-v12 reads +0.109 against a real +0.103, and crisis co-movement reads 0.696 against a real 0.664 to 0.727.\n\nThis paragraph read 'industries hold together in a crisis about a third as tightly as real ones' until 2026-08-26, measured at +0.035 on pt-v10 and +0.064 on pt-v7. pt-v11's crisis work closed it and pt-v12 carries that, so the claim is WITHDRAWN. The crisis shape is right; what remains in this gap is the dispersion above, which is about sizing a scenario rather than about structure.",
      "forbids": "sizing a scenario's impact rather than detecting it",
      "statistics": [],
      "beyond_days": null,
      "closed_by": []
    },
    {
      "id": "macro-range",
      "summary": "the endogenous macro state cannot reach its own crisis regimes",
      "detail": "Left to itself the economy stays in a moderate band, and two consequences follow that are easy to mistake for defects.\n\nINFLATION. Measured over thirty seeds and five years, endogenous inflation peaks at 4.0% on every seed, with sd 1.2 around a mean of 2.0%; US CPI year-on-year 2015-2025 (FRED CPIAUCSL) has sd 2.18, a peak of 9.0% in June 2022 and monthly AR(1) 0.978 against the model's 0.958. The cap is the inflation update's mean reversion, 0.55 of the gap to target each month, a half-life under a month. That coefficient and the 6.0% clamp are dials since 0.1.4, `inflation_reversion` and `inflation_ceiling`, shipped at the old values so every preset reproduces. Measured (calibration record \u00a765): at reversion 0.15 the endogenous series matches the real mean and sd to the second decimal (2.85 / 2.10 against 2.87 / 2.18) and then sits on the clamps; persistence does not move with the dial because it comes from the cycle, wages and unemployment. No preset takes either dial yet, because what a real inflation range does to the equity panel has not been scored, so this gap stands.\n\nTHE CENTRAL BANK'S CRISIS CADENCE. The bank pulls its next meeting in to 21-30 days when a decision leaves it more than 2pp behind an inflation rate above 4%. That path is correct and well exercised, firing in 22.0% of the 11,898 central-bank cases in the parity corpus, but a default run cannot reach it because inflation does not get there. It also fires in STAGFLATION rather than in high inflation as such: at inflation 4.5% with unemployment 9.0% the bank cuts for the output gap and leaves itself further behind, so pinning inflation high with unemployment low will not trigger it however high you pin it.\n\nSo a 2022-style inflation shock has to be driven through a scenario. It will not arise on its own, and neither will the policy response to it.\n\nDRIVING ONE WORKS, and the lever is inflation rather than the policy rate. Measured on real 2022 data over six seeds, against a real S&P of -20.0%: a scenario driving `inflation_rate` with the published CPI path returns a median -23.3%, where the same run with no scenario at all returns -12.6% and one driving only `federal_funds_rate` with the real seven-hike path returns -13.1%, which is the drift and nothing more. Inflation works because it steers the bank's own reaction into the corporate bond yield; an externally pinned policy rate does not reproduce that. Leave `corporate_bond_yield` FREE when doing this, since pinning it severs the very channel the inflation path is using.",
      "forbids": "studying inflation regimes or policy crises from the endogenous economy alone",
      "statistics": [],
      "beyond_days": null,
      "closed_by": []
    },
    {
      "id": "roster-concentration",
      "summary": "a concentrated roster holds at one year and comes apart at two",
      "detail": "`Universe.random()` assigns sectors round-robin over the twelve in `sectors.SECTORS`, so a roster is as close to balanced as its size allows: the certified 40 names put four in each of four sectors and three in each of the other eight. No real index is balanced that way -- the S&P is roughly a third technology and the Nasdaq more so.\n\nRE-MEASURED 2026-08-26 on pt-v12: thirty seeds, the fourteen-statistic panel, both horizons. This gap previously carried 'balanced 9, S&P-like 8, all-technology 7', counts out of the TEN-statistic panel of the pt-v3 era at six seeds, and said so. Superseded:\n\n                      252d     504d   out at 504\n  balanced           14/14    14/14   --\n  S&P-like           14/14    13/14   annualised_vol_pct\n  technology-heavy   14/14    11/14   vol, corr_persistence, xs_corr\n  all-technology     13/13    10/13   vol, corr_persistence, xs_corr\n  defensive          14/14    14/14   --\n\nThe finding has changed shape. AT THE CERTIFIED HORIZON, concentration costs nothing: every shape tested holds the whole panel, so the envelope transfers to a roster shaped like a real index. This gap used to say part of the certification was an artifact of balance; on pt-v12 at 252 days that is no longer measurable.\n\nWhat concentration costs is the SECOND year, and the mechanism is visible rather than mysterious. Cross-sectional correlation rises monotonically with it -- 0.3797 balanced, 0.3813 S&P-like, 0.4112 technology-heavy, 0.5316 all-technology -- which is the model behaving CORRECTLY, since names in one industry should move together more. It rises past the 504-day band's top of 0.41 and annualised volatility follows it out. A band derived from broad real-market windows is the wrong ruler for a single-sector portfolio, so part of this is a statement about the grading rather than about the model.\n\n`sector_excess_corr` is UNDEFINED on an all-technology roster rather than out of band: it asks how much a name moves with its own industry beyond the market, and with one sector those are the same thing. Hence 13 rather than 14 in that row. Measured by `tools/calibration/roster_shapes.py`.",
      "forbids": "inheriting this envelope for a sector-concentrated roster BEYOND one year -- at the certified horizon it now transfers",
      "statistics": [
        "cross_sectional_corr",
        "annualised_vol_pct",
        "corr_persistence_acf1"
      ],
      "beyond_days": null,
      "closed_by": []
    }
  ]
}
