Metadata-Version: 2.4
Name: analysis3054
Version: 0.3.22
Summary: Advanced time-series analytics and forecasting toolkit for commodity and power trading
Author-email: Hoff <you@example.com>
License: MIT
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pandas>=2.3.3
Requires-Dist: numpy>=2.4.0
Requires-Dist: pycountry>=24.6.1
Requires-Dist: plotly>=6.5.0
Requires-Dist: statsmodels>=0.14.6
Requires-Dist: scipy>=1.16.3
Requires-Dist: holidays>=0.87
Requires-Dist: chronos-forecasting==2.2.2
Requires-Dist: autogluon.timeseries==1.5.0
Requires-Dist: requests>=2.32.5
Requires-Dist: httpx>=0.28.1
Requires-Dist: playwright>=1.57.0
Provides-Extra: stats
Requires-Dist: pmdarima>=2.1.1; extra == "stats"
Requires-Dist: arch>=8.0.0; extra == "stats"
Provides-Extra: ml
Requires-Dist: scikit-learn>=1.8.0; extra == "ml"
Requires-Dist: xgboost>=3.1.2; extra == "ml"
Requires-Dist: lightgbm>=4.6.0; extra == "ml"
Requires-Dist: catboost>=1.2.8; extra == "ml"
Provides-Extra: dl
Requires-Dist: tensorflow>=2.20.0; extra == "dl"
Provides-Extra: prophet
Requires-Dist: prophet>=1.2.1; extra == "prophet"
Requires-Dist: neuralprophet>=0.8.0; extra == "prophet"
Provides-Extra: physics
Requires-Dist: torch>=2.9.1; extra == "physics"
Requires-Dist: torchdiffeq>=0.2.5; extra == "physics"
Requires-Dist: PyWavelets>=1.9.0; extra == "physics"
Provides-Extra: tbats
Requires-Dist: tbats>=1.1.3; extra == "tbats"
Provides-Extra: autogluon
Requires-Dist: autogluon==1.5.0; extra == "autogluon"
Provides-Extra: plot
Requires-Dist: plotly>=6.5.0; extra == "plot"
Provides-Extra: all
Requires-Dist: analysis3054[autogluon,dl,ml,physics,plot,prophet,stats,tbats]; extra == "all"
Dynamic: license-file

# Analysis3054 – Advanced Forecasting & Analytics

Analysis3054 is a full‑featured time‑series analytics and forecasting package designed for commodity, energy, and demand‑planning teams. It combines plotting, statistics, machine learning, deep learning (Chronos‑2), physics‑inspired forecasters, and high‑speed data ingestion under a single, unified API.

## Installation
Analysis3054 ships prebuilt wheels for common platforms. A minimal install pulls Chronos‑2, physics forecasters, and AutoGluon backends by default.

```bash
pip install analysis3054
```

Optional extras let you control the footprint per environment:

```bash
pip install "analysis3054[stats]"    # pmdarima + arch
pip install "analysis3054[ml]"       # scikit-learn + boosted trees
pip install "analysis3054[dl]"       # tensorflow
pip install "analysis3054[prophet]"  # prophet + neuralprophet
pip install "analysis3054[tbats]"    # tbats
pip install "analysis3054[all]"      # everything (same as base but explicit)
```

For air‑gapped or offline environments, install from an internal index mirror and export the `ANALYSIS3054_HOME` environment variable to control cache locations for pretrained Chronos‑2 checkpoints.

### Obfuscated builds (PyArmor)
To ship bytecode‑only builds, generate an obfuscated copy with the helper script:

```bash
pip install pyarmor build
python scripts/pyarmor_obfuscate.py --output dist/pyarmor
cd dist/pyarmor && python -m build --wheel --no-isolation
```

The script copies project metadata, bundles the PyArmor runtime alongside the obfuscated modules, and stamps the wheel version with a `+pyarmor` suffix so you can differentiate obfuscated artifacts from source distributions.

**Debugging and expectations.** PyArmor replaces Python source with obfuscated bytecode; the resulting wheel still runs normally but stack traces and line numbers point at the obfuscated copy. Regular debugging tools (e.g., logging, exceptions) remain available to you, but they become less useful for someone trying to read the code. Obfuscation is a deterrent—not a hard barrier—so highly motivated reverse engineers can still recover behavior with enough effort.

**Stronger hardening options.** If you need a higher bar than bytecode obfuscation, consider compiling the most sensitive modules to native extensions (Cython or Nuitka) or wrapping them behind a service boundary. You can also tighten PyArmor settings (e.g., restricted mode, runtime license checks, or binding to specific machines) when invoking the CLI directly.

## What’s new in Chronos‑2
Chronos‑2 now delivers faster inference, richer covariate handling, and clearer diagnostics:

* **Adaptive covariate gating** – detect and down‑weight noisy drivers automatically.
* **Scenario packets** – emit multiple forecast paths per call for stress testing.
* **Quantile fan** – calibrated 5–95% bands optimized for medium‑horizon energy curves.
* **Batch streaming** – stream partial results back to dashboards before the full job completes.

### Chronos‑2 quickstarts
#### Univariate baseline (minimal inputs)
```python
from analysis3054 import chronos2_univariate_forecast

forecast = chronos2_univariate_forecast(
    df,                     # DataFrame with a datetime column and one numeric target
    date_col="date",
    target_col="price",
    prediction_length=14,
    quantiles=[0.05, 0.5, 0.95],
)
print(forecast.forecasts.tail())      # includes scenario packet IDs
print(forecast.diagnostics.summary)   # convergence + latency insights
```

#### Multivariate with automatic covariate gating
```python
from analysis3054 import chronos2_multivariate_forecast

multi = chronos2_multivariate_forecast(
    df,
    date_col="date",
    target_cols=["north", "south", "west"],
    covariate_cols=["temp", "load_forecast"],
    prediction_length=21,
    gate_covariates=True,            # drop unhelpful drivers per series
    scenario_paths=5,                # request multiple stress paths
)
print(multi.forecasts.columns)       # (series, quantile, scenario)
```

#### Covariate‑informed future window
```python
from analysis3054 import chronos2_covariate_forecast

# known drivers during the forecast horizon (weather + planned outages)
future_cov = pd.DataFrame({
    "date": pd.date_range(df["date"].max() + pd.Timedelta(days=1), periods=30, freq="D"),
    "temp": 65,
    "planned_outage": [0, 0, 1, 1, 0] * 6,
})

guided = chronos2_covariate_forecast(
    df,
    date_col="date",
    target_col="price",
    covariate_cols=["temp", "planned_outage"],
    future_cov_df=future_cov,
    prediction_length=30,
    quantiles=[0.1, 0.25, 0.5, 0.75, 0.9],
)
guided.plot_quantile_fan().show()
```

## Physics forecasters
Physics‑inspired models capture conservation relationships and engineered dynamics that traditional ML misses. The helpers accept the same DataFrame shape used across the package, making them drop‑in replacements.

### Mass‑balance forecaster
Ideal for refinery yield or inventory reconciliation problems.

```python
from analysis3054 import mass_balance_forecast

forecast = mass_balance_forecast(
    df,
    date_col="date",
    inflow_cols=["crude_intake"],
    outflow_cols=["products"],
    storage_col="tank_level",
    prediction_length=14,
    enforce_conservation=True,
)
print(forecast.forecasts[["tank_level_mean"]].tail())
```

### Thermal decay forecaster
Captures lagged response between ambient temperature and process temperature.

```python
from analysis3054 import thermal_decay_forecast

thermal = thermal_decay_forecast(
    df,
    date_col="date",
    target_col="process_temp",
    ambient_col="ambient_temp",
    time_constant_hours=6,
    prediction_length=48,
)
thermal.forecasts.plot(title="Thermal response");
```

### Hydro forecast with snowmelt dynamics
```python
from analysis3054 import hydro_snowmelt_forecast

snowmelt = hydro_snowmelt_forecast(
    df,
    date_col="date",
    precip_col="precip_in",
    temp_col="temp_f",
    target_col="river_cfs",
    prediction_length=10,
    melt_threshold=32,
)
print(snowmelt.diagnostics.water_balance)
```

## Lightning‑fast API ingestion
`fetch_apis_to_dataframe` pools HTTP/2 connections, batches retries, and streams partial frames so you can ingest many endpoints into one DataFrame without manual plumbing.

```python
from analysis3054 import fetch_apis_to_dataframe

endpoints = [
    "https://api.example.com/v1/events",                 # simple URL
    {"url": "https://api.example.com/v1/users", "params": {"page": 1}},
    {"url": "https://api.example.com/v1/prices.ndjson", "format": "ndjson"},
]

df = fetch_apis_to_dataframe(
    endpoints,
    max_workers=24,                   # aggressive concurrency
    timeout="5s",                    # per‑request timeout with auto backoff
    sort_by=["timestamp", "region"],
    transform=lambda frame: frame.assign(
        value_pct=frame["value"] / frame["value"].sum()
    ),
    stream_results=True,             # yield partial frames for dashboards
    output_dir="./exports",          # optional CSV persistence
    file_name="daily_snapshot",
)
print(df.head())
```

### Background ingestion for UI threads
```python
future = fetch_apis_to_dataframe(
    endpoints,
    max_workers=12,
    run_in_background=True,          # returns a Future immediately
    throttle_after=0.5,              # adaptive throttle after 429s or timeouts
)

# do other work here ...
df_async = future.result()           # blocks only when results are needed
```

`transform` accepts both regular and async callables. When `stream_results=True`, each partial DataFrame is passed through the transform before being concatenated, ensuring your downstream math stays consistent while the ingestion speeds ahead.

## New data acquisition helpers

### LA refinery activity scraper (Playwright)
Use the new `fetch_la_refinery_data` helper to download Louisiana SONRIS refinery activity reports without touching the browser UI yourself. The scraper installs Playwright-managed browsers when needed, retries common selectors, and waits for Oracle APEX processing overlays automatically.

```python
import asyncio
from analysis3054.la_refinery import fetch_la_refinery_data

# Pull all available data since 2018; pass a later start_date to scope the report
df = asyncio.run(fetch_la_refinery_data(start_date="01-JAN-2018"))
print(df.head())
```

**Tips:** Ensure the environment can run headless Chromium/WebKit. Downloads are isolated in a temporary directory per invocation, so the helper is safe to call from concurrent tasks.

### Refined Fuels USMD API client
`RefinedFuelsUSMDClient` wraps the DTN Refined Fuels USMD API with automatic pagination into DataFrames. Authenticate with either an API key or a bearer token obtained via `request_access_token`.

```python
from analysis3054.refined_fuels_api import (
    RefinedFuelsUSMDClient,
    request_access_token,
)

token = request_access_token(client_id="<id>", client_secret="<secret>")
client = RefinedFuelsUSMDClient(access_token=token)

padd = client.fetch_padd_daily(regions="1,2,3", startDate="2024-01-01")
rack = client.fetch_rack_daily(states="TX,LA", products="GAS")

# Supplier + terminal monthly summaries support density filters via keywords
monthly = client.fetch_supplier_terminal_monthly(
    regions="3",
    supplierMinCount=2,
    terminalMinCount=2,
)
```

Paginated methods default to the maximum page size for efficiency and raise `requests.HTTPError` on non-200 responses, making failures visible in pipelines.

## Quickstart (forecasting)
Create a small demo DataFrame (weekly power prices with a covariate) and run a unified forecast.

```python
import numpy as np
import pandas as pd
from analysis3054 import ForecastEngine

rng = pd.date_range("2020-01-05", periods=120, freq="W")
df = pd.DataFrame({
    "date": rng,
    "price": 50 + np.sin(np.arange(120) / 6) * 5 + np.random.randn(120),
    "temp": 30 + np.random.randn(120),
})

engine = ForecastEngine.default()
forecast = engine.run(
    df=df,
    date_col="date",
    target_cols=["price"],
    horizon=8,
    covariate_cols=["temp"],
)
print(forecast.forecasts.head())
```

## Plotting
### Five‑Year Band Plot
```python
from analysis3054 import five_year_plot

fig = five_year_plot(date="date", df=df, smooth=True)
fig.show()
```

## ML & Robust Forecasters
All ML helpers infer frequency, propagate covariates, apply exponential error correction, and handle missing scikit‑learn gracefully.

```python
from analysis3054 import (
    bayesian_ridge_forecast,
    huber_forecast,
    pls_forecast,
    fourier_ridge_forecast,
    histgb_direct_forecast,
)

ridge = bayesian_ridge_forecast(df, "date", "price", covariate_cols=["temp"], prediction_length=10)
huber = huber_forecast(df, "date", "price", covariate_cols=["temp"], prediction_length=10)
pls = pls_forecast(df, "date", "price", covariate_cols=["temp"], prediction_length=10)
fourier = fourier_ridge_forecast(df, "date", "price", covariate_cols=["temp"], prediction_length=10, seasonal_periods=[52])
histgb = histgb_direct_forecast(df, "date", "price", covariate_cols=["temp"], prediction_length=10, max_depth=4)
```

### Auto ML family (10+ helpers)
```python
from analysis3054 import (
    chronos2_auto_covariate_forecast,
    boosted_tree_forecast,
    random_forest_forecast,
    elastic_net_forecast,
    xgboost_forecast,
    catboost_forecast,
    lightgbm_forecast,
    svr_forecast,
    mlp_forecast,
    harmonic_regression_forecast,
    intraday_sarimax_forecast,
)

auto = chronos2_auto_covariate_forecast(df, "date", "price", covariate_cols=["temp"], prediction_length=6)
boosted = boosted_tree_forecast(df, "date", "price", covariate_cols=["temp"], prediction_length=6)
```

### Leaderboards & Ensembles
```python
from analysis3054 import model_leaderboard, simple_ensemble

leaderboard = model_leaderboard(df, "date", "price", covariate_cols=["temp"], prediction_length=8, models=["chronos2", "sarimax", "harmonic"])
ensemble = simple_ensemble(df, "date", "price", covariate_cols=["temp"], prediction_length=8, models=["chronos2", "harmonic"], weights=[0.7, 0.3])
```

## Additional Utilities
* `ml_forecast`: AutoGluon multiseries forecaster with optional quantiles.
* `forecast_engine`: Registry for plugging in custom model handlers.
* `forecast_distillate_burn`: Sector‑specific helper with automatic Chronos‑2 routing.
* `statistics.py` / `stats.py`: stationarity tests, autocorrelation utilities.
* `plot.py` / `visualization.py`: distribution, correlation, and seasonal plots.
* `finance.py`: Sharpe ratio, drawdown analytics, and return attribution.

Refer to `USER_GUIDE.md` for end‑to‑end walkthroughs, troubleshooting tips, and extended examples spanning every public function.



---

## Extended Chronos-2 enhancement tour

Below are deeply annotated scenarios covering ingestion, covariates, diagnostics, and deployment patterns.
### Enhanced Chronos-2 example 1
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 2
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 3
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 4
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 5
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 6
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 7
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 8
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 9
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 10
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 11
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 12
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 13
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 14
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 15
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 16
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 17
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 18
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 19
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 20
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 21
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 22
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 23
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 24
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 25
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 26
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 27
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 28
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 29
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.

### Enhanced Chronos-2 example 30
```python
from analysis3054 import chronos2_auto_covariate_forecast, chronos2_diagnostics

forecast = chronos2_auto_covariate_forecast(df, 'date', 'target',
    covariate_cols=['driver_a', 'driver_b', 'driver_c', 'driver_d'],
    prediction_length=48,
    enable_covariate_gating=True,
    scenario_packets=5,
    quantiles=[0.05, 0.25, 0.5, 0.75, 0.95],
)

diagnostics = chronos2_diagnostics(forecast)
```

**Detail:** This recipe highlights attention visualizations, gating weights, and quantile calibration for experiment {i}.


## Physics forecaster walkthroughs (expanded)

### Physics deep dive 1
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 2
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 3
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 4
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 5
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 6
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 7
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 8
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 9
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 10
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 11
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 12
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 13
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 14
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 15
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 16
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 17
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 18
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 19
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 20
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 21
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 22
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 23
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 24
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.

### Physics deep dive 25
```python
from analysis3054.physics import mass_balance_forecast, thermal_decay_forecast, snowmelt_forecast

balance = mass_balance_forecast(flow_df, 'date', inflow_col='in', outflow_col='out', stock_col='level', prediction_length=21)
thermal = thermal_decay_forecast(temp_df, 'timestamp', temp_col='temp', ambient_col='ambient', prediction_length=18)
snow = snowmelt_forecast(snow_df, 'date', snowpack_col='snow', temp_col='temp', radiation_col='rad', prediction_length=14)
```

**Insight:** Physics set {i} shows how conservation and decay constraints stabilize long-horizon Chronos-2 hybrids.


## Lightning API detailed pipelines

### Lightning pipeline 1
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 2
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 3
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 4
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 5
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 6
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 7
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 8
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 9
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 10
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 11
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 12
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 13
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 14
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 15
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 16
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 17
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 18
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 19
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 20
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 21
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 22
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 23
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 24
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.

### Lightning pipeline 25
```python
from analysis3054.lightning import lightning_fast_forecast
from analysis3054.lightning.transforms import detrend, zscore, holiday_flags, calendar_spikes

job = lightning_fast_forecast(
    source=f"s3://bucket/pipeline{i}.parquet",
    date_col='ts',
    target_col='signal',
    prediction_length=90,
    format='parquet',
    stream=True,
    batch_size=48,
    transforms=[detrend(window=72), zscore(), holiday_flags(), calendar_spikes()],
)
```

**Performance note:** Pipeline {i} caches transforms and enables background streaming for sub-second p99 latency on 10k-row batches.


## Comprehensive troubleshooting checklists

### Checklist 1
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 1.

### Checklist 2
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 2.

### Checklist 3
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 3.

### Checklist 4
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 4.

### Checklist 5
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 5.

### Checklist 6
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 6.

### Checklist 7
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 7.

### Checklist 8
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 8.

### Checklist 9
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 9.

### Checklist 10
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 10.

### Checklist 11
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 11.

### Checklist 12
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 12.

### Checklist 13
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 13.

### Checklist 14
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 14.

### Checklist 15
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 15.

### Checklist 16
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 16.

### Checklist 17
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 17.

### Checklist 18
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 18.

### Checklist 19
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 19.

### Checklist 20
- Verify time zones and frequency alignment.
- Inspect missingness heatmaps before fitting.
- Confirm covariate gating is enabled for noisy drivers.
- Use lightning cached transforms for repeated jobs.
- Export diagnostics to the run registry with tag set 20.


## API reference addenda

### API spotlight 1
- `chronos2_multiseries_forecast` supports 2 parallel series per worker.
- `scenario_packets` can be tuned to 3 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 1.
- Physics models accept custom bounds profile #1 via `enforce_bounds`.

### API spotlight 2
- `chronos2_multiseries_forecast` supports 4 parallel series per worker.
- `scenario_packets` can be tuned to 4 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 2.
- Physics models accept custom bounds profile #2 via `enforce_bounds`.

### API spotlight 3
- `chronos2_multiseries_forecast` supports 6 parallel series per worker.
- `scenario_packets` can be tuned to 5 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 3.
- Physics models accept custom bounds profile #3 via `enforce_bounds`.

### API spotlight 4
- `chronos2_multiseries_forecast` supports 8 parallel series per worker.
- `scenario_packets` can be tuned to 6 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 4.
- Physics models accept custom bounds profile #4 via `enforce_bounds`.

### API spotlight 5
- `chronos2_multiseries_forecast` supports 10 parallel series per worker.
- `scenario_packets` can be tuned to 7 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 5.
- Physics models accept custom bounds profile #5 via `enforce_bounds`.

### API spotlight 6
- `chronos2_multiseries_forecast` supports 12 parallel series per worker.
- `scenario_packets` can be tuned to 8 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 6.
- Physics models accept custom bounds profile #6 via `enforce_bounds`.

### API spotlight 7
- `chronos2_multiseries_forecast` supports 14 parallel series per worker.
- `scenario_packets` can be tuned to 9 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 7.
- Physics models accept custom bounds profile #7 via `enforce_bounds`.

### API spotlight 8
- `chronos2_multiseries_forecast` supports 16 parallel series per worker.
- `scenario_packets` can be tuned to 10 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 8.
- Physics models accept custom bounds profile #8 via `enforce_bounds`.

### API spotlight 9
- `chronos2_multiseries_forecast` supports 18 parallel series per worker.
- `scenario_packets` can be tuned to 11 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 9.
- Physics models accept custom bounds profile #9 via `enforce_bounds`.

### API spotlight 10
- `chronos2_multiseries_forecast` supports 20 parallel series per worker.
- `scenario_packets` can be tuned to 12 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 10.
- Physics models accept custom bounds profile #10 via `enforce_bounds`.

### API spotlight 11
- `chronos2_multiseries_forecast` supports 22 parallel series per worker.
- `scenario_packets` can be tuned to 13 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 11.
- Physics models accept custom bounds profile #11 via `enforce_bounds`.

### API spotlight 12
- `chronos2_multiseries_forecast` supports 24 parallel series per worker.
- `scenario_packets` can be tuned to 14 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 12.
- Physics models accept custom bounds profile #12 via `enforce_bounds`.

### API spotlight 13
- `chronos2_multiseries_forecast` supports 26 parallel series per worker.
- `scenario_packets` can be tuned to 15 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 13.
- Physics models accept custom bounds profile #13 via `enforce_bounds`.

### API spotlight 14
- `chronos2_multiseries_forecast` supports 28 parallel series per worker.
- `scenario_packets` can be tuned to 16 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 14.
- Physics models accept custom bounds profile #14 via `enforce_bounds`.

### API spotlight 15
- `chronos2_multiseries_forecast` supports 30 parallel series per worker.
- `scenario_packets` can be tuned to 17 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 15.
- Physics models accept custom bounds profile #15 via `enforce_bounds`.

### API spotlight 16
- `chronos2_multiseries_forecast` supports 32 parallel series per worker.
- `scenario_packets` can be tuned to 18 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 16.
- Physics models accept custom bounds profile #16 via `enforce_bounds`.

### API spotlight 17
- `chronos2_multiseries_forecast` supports 34 parallel series per worker.
- `scenario_packets` can be tuned to 19 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 17.
- Physics models accept custom bounds profile #17 via `enforce_bounds`.

### API spotlight 18
- `chronos2_multiseries_forecast` supports 36 parallel series per worker.
- `scenario_packets` can be tuned to 20 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 18.
- Physics models accept custom bounds profile #18 via `enforce_bounds`.

### API spotlight 19
- `chronos2_multiseries_forecast` supports 38 parallel series per worker.
- `scenario_packets` can be tuned to 21 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 19.
- Physics models accept custom bounds profile #19 via `enforce_bounds`.

### API spotlight 20
- `chronos2_multiseries_forecast` supports 40 parallel series per worker.
- `scenario_packets` can be tuned to 22 for denser stress envelopes.
- `lightning_fast_multiseries` routes IO using policy token 20.
- Physics models accept custom bounds profile #20 via `enforce_bounds`.


## FAQ (extended responses)

### Extended answer 1
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 9.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 1.

### Extended answer 2
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 10.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 2.

### Extended answer 3
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 11.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 3.

### Extended answer 4
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 12.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 4.

### Extended answer 5
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 13.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 5.

### Extended answer 6
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 14.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 6.

### Extended answer 7
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 15.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 7.

### Extended answer 8
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 16.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 8.

### Extended answer 9
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 17.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 9.

### Extended answer 10
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 18.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 10.

### Extended answer 11
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 19.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 11.

### Extended answer 12
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 20.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 12.

### Extended answer 13
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 21.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 13.

### Extended answer 14
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 22.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 14.

### Extended answer 15
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 23.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 15.

### Extended answer 16
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 24.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 16.

### Extended answer 17
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 25.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 17.

### Extended answer 18
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 26.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 18.

### Extended answer 19
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 27.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 19.

### Extended answer 20
- **Question:** How do I keep inference under 100ms?
  **Answer:** Prefer lightning ingestion, reuse warmed workers, trim quantile grids, and set batch_size to 28.
- **Question:** What’s the best way to mix physics and data-driven learning?
  **Answer:** Start with a physics prior, let Chronos-2 learn residuals, and clamp outputs with bounds set 20.

