SRVAR toolkit inspired by Grammatikopoulos (2025)
Project description
srvar-toolkit
Shadow-rate VAR toolkit for Bayesian macroeconomic forecasting in pure Python.
Explore the docs »
Quick Start
·
Report Bug
·
Request Feature
Table of Contents
About The Project
srvar-toolkit is a lightweight, testable implementation of Shadow-Rate Vector Autoregression (SRVAR) models for macroeconomic forecasting. It provides a complete Bayesian workflow for fitting VARs with:
- Effective Lower Bound (ELB) constraints — Model interest rates that are censored at the zero lower bound
- Stochastic volatility — Capture time-varying uncertainty in economic variables
- Legacy Minnesota-style NIW shrinkage — Structured shrinkage on the historical compatibility path
- Variable selection (SSVS) — Identify which predictors matter most
The toolkit is designed for researchers and practitioners who need transparent, reproducible Bayesian VAR estimation without the overhead of large econometric frameworks.
Built With
|
|
|
Features
| Component | Description | How to Enable | Status |
|---|---|---|---|
| Conjugate BVAR (NIW) | Closed-form posterior updates and fast sampling for VAR coefficients/covariance | PriorSpec.niw_default(...) |
Supported |
| Legacy Minnesota-style NIW shrinkage | Historical Minnesota-style NIW construction (non-canonical; compatibility path) | PriorSpec.niw_minnesota_legacy(...) |
Supported |
| Canonical Minnesota shrinkage | Equation-wise Minnesota own-vs-cross shrinkage for homoskedastic and diagonal SV models | PriorSpec.niw_minnesota_canonical(...) or prior.method: "minnesota_canonical" |
Supported (homo + diagonal SV) |
| Tempered Minnesota bridge | Experimental geometric bridge between legacy and canonical Minnesota scaling | PriorSpec.niw_minnesota_tempered(...) or prior.method: "minnesota_tempered" |
Experimental (diagonal SV only) |
| Variable Selection (SSVS) | Spike-and-slab inclusion indicators for stochastic search | PriorSpec.from_ssvs(...) |
Supported |
| Bayesian LASSO (BLASSO) | Bayesian LASSO shrinkage prior for VAR coefficients (global or adaptive) | PriorSpec.from_blasso(...) |
Supported |
| Shadow-Rate / ELB | Latent shadow-rate sampling at the effective lower bound | ModelSpec(elb=ElbSpec(...)) |
Supported |
| Stochastic Volatility | Diagonal SV with RW/AR(1) state dynamics; optional triangular covariance (time-invariant correlations); optional factor SV (full time-varying covariance; v1: NIW+RW) | ModelSpec(volatility=VolatilitySpec(...)) |
Supported |
| Combined ELB + SV | Joint shadow-rate and stochastic volatility model | ModelSpec(elb=..., volatility=...) |
Supported |
| Robust Shocks | Student‑t and outlier-mixture innovations (homoskedastic VARs; factor SV supported) | ModelSpec(shocks=ShockSpec(...)) |
Supported |
| Steady-State VAR (SSP) | Parameterize the VAR intercept via a steady-state mean mu (optional mu-SSVS) |
ModelSpec(steady_state=SteadyStateSpec(...)) |
Supported |
| Forecasting | Posterior predictive simulation with quantiles | srvar.api.forecast(...) |
Supported |
| Conditional Forecasting | Scenario forecasts with hard constraints (linear Gaussian VARs) | srvar.scenario.conditional_forecast(...) |
Supported |
| Stationarity Conditioning | Optional rejection of unstable VAR draws during forecasting/backtesting | forecast(..., stationarity="reject") |
Supported |
| Structural IRFs (Cholesky) | Cholesky-identified impulse responses from posterior draws | srvar.analysis.irf_cholesky(...) |
Supported |
| Sign-Restricted IRFs | Structural IRFs via sign-restriction rotations | srvar.analysis.irf_sign_restricted(...) |
Supported |
| FEVD (Cholesky) | Forecast error variance decomposition from Cholesky-identified IRFs | srvar.analysis.fevd_cholesky(...) |
Supported |
| Historical Decompositions (Cholesky) | Decompose historical movements into structural shock contributions | srvar.analysis.historical_decomposition_cholesky(...) |
Supported |
| Plotting | Shadow rate, volatility, and fan chart visualisations | srvar.plotting |
Supported |
| Backtesting | Rolling/expanding refit + forecast with plots + metrics; optional streaming metrics mode | srvar backtest config.yml |
Supported |
| ELB-Censored Evaluation | Floor realized values and (optionally) forecast draws at an ELB to match interest-rate scoring conventions | evaluation.elb_censor (backtest) |
Supported |
| WIS (Weighted Interval Score) | Draw-based WIS for probabilistic forecast evaluation | evaluation.wis (backtest) |
Supported |
| Pinball Loss (Quantile Score) | Draw-based pinball (quantile) loss for probabilistic forecast evaluation | evaluation.pinball (backtest) |
Supported |
| Log Score (Gaussian LPD) | Gaussian approximation log score from predictive draws | evaluation.log_score (backtest) |
Supported |
| Model Comparison (DM test) | Diebold–Mariano test with Newey–West/HAC variance for comparing loss series | srvar.stats.diebold_mariano_test(...) |
Supported |
| Model Comparison (GW test) | Giacomini–White conditional predictive ability test (MATLAB-compatible NW covariance) | srvar.stats.giacomini_white_test(...) |
Supported |
| Forecast Pooling (Ensembles) | Combine multiple predictive distributions via weighted mixtures | srvar.ensemble.pool_forecasts(...) |
Supported |
Labeled Outputs (xarray) |
Convert fit/forecast/IRF/FEVD outputs to labeled xarray.Dataset objects |
srvar.xarray.*_to_xarray(...) |
Supported |
| Posterior Diagnostics (ArviZ) | Convert outputs to arviz.InferenceData for diagnostics/plotting |
srvar.arviz.*_to_inferencedata(...) |
Supported |
| Replication Harness | Starter configs + scripts for Carriero et al. (2025) baselines | papers/carriero2025forecasting/ |
Supported |
Glossary (acronyms)
- ELB: effective lower bound (censoring constraint applied to selected observed series)
- NIW: Normal-Inverse-Wishart prior (conjugate Bayesian VAR)
- SSVS: stochastic search variable selection (spike-and-slab variable selection)
- SVRW: stochastic volatility random walk (diagonal log-variance random-walk model)
- KSC: Kim-Shephard-Chib mixture approximation for log-(\chi^2)
- SSP: steady-state parameterization (replace intercept with long-run mean
mu)
Getting Started
Prerequisites
- Python 3.11 or higher
- pip package manager
Reproducible local environment (recommended)
If you're concerned about cross-platform differences (macOS/Windows/Linux), installing into a fresh virtual environment is the most reliable workflow.
python -m venv .venv
# Activate (macOS/Linux)
source .venv/bin/activate
# Activate (Windows PowerShell)
# .venv\Scripts\Activate.ps1
python -m pip install -U pip
# Normal user install from PyPI (CLI + FRED fetch)
python -m pip install "srvar-toolkit[cli,fred]"
For development (tests + docs + plotting):
python -m pip install -e ".[dev,cli,fred,docs,plot]"
Installation
Option 1: PyPI install (recommended for users)
pip install srvar-toolkit
Option 2: PyPI install with extras
# With CLI commands
pip install 'srvar-toolkit[cli]'
# With plotting support
pip install 'srvar-toolkit[plot]'
# With labeled xarray outputs
pip install 'srvar-toolkit[xarray]'
# With ArviZ integration (InferenceData outputs)
pip install 'srvar-toolkit[arviz]'
# With FRED data fetching
pip install 'srvar-toolkit[fred]'
# CLI plus FRED fetching
pip install 'srvar-toolkit[cli,fred]'
Option 3: Editable install (recommended for development)
git clone https://github.com/shawcharles/srvar-toolkit.git
cd srvar-toolkit
pip install -e .
Option 4: Editable install with extras
# With plotting support
pip install -e '.[plot]'
# With labeled xarray outputs
pip install -e '.[xarray]'
# With ArviZ integration (InferenceData outputs)
pip install -e '.[arviz]'
# With FRED data fetching
pip install -e '.[fred]'
# With all development tools
pip install -e '.[dev]'
# All extras
pip install -e '.[dev,plot,fred,docs,xarray,arviz]'
Note: srvar fetch-fred requires the optional fred extra.
If you are working from a local checkout and see a warning like srvar-toolkit ... does not provide the extra 'fred', make sure you are installing from the repository root:
python -m pip install -e ".[fred]"
You will also need a FRED API key (set FRED_API_KEY in your environment).
Usage
Quick Start
Fit a simple Bayesian VAR and generate forecasts:
import numpy as np
from srvar import Dataset
from srvar.api import fit, forecast
from srvar.spec import ModelSpec, PriorSpec, SamplerConfig
# Create a dataset
ds = Dataset.from_arrays(
values=np.random.standard_normal((80, 2)),
variables=["y1", "y2"]
)
# Configure the model
model = ModelSpec(p=2, include_intercept=True)
prior = PriorSpec.niw_default(k=1 + ds.N * model.p, n=ds.N)
sampler = SamplerConfig(draws=500, burn_in=100, thin=1)
# Fit and forecast
fit_res = fit(ds, model, prior, sampler)
fc = forecast(fit_res, horizons=[1, 4], draws=200)
print(fc.mean)
Labeled outputs (xarray / ArviZ)
Optional labeled outputs are available via srvar.xarray and srvar.arviz (see srvar/xarray.py
and srvar/arviz.py):
from srvar.xarray import fit_to_xarray, forecast_to_xarray
ds_fit = fit_to_xarray(fit_res)
ds_fc = forecast_to_xarray(fc)
Conventions:
- Core dims are
draw,time,variable(plushorizonfor forecasts andfactorfor FSV). - Time-varying SV/FSV states are aligned to the full
timeindex; the firstpentries areNaNbecause these states are defined on the effective sampleT - p. - For factor SV,
ds_fit["loadings"]is an alias ofds_fit["lambda"].
ArviZ (InferenceData) integration:
from srvar.arviz import fit_to_inferencedata
idata = fit_to_inferencedata(fit_res)
Notebooks
Expository Jupyter notebooks live in examples/notebooks/ (see examples/notebooks/README.md).
Steady-State VAR (SSP)
SSP replaces the explicit intercept with a steady-state mean vector mu.
import numpy as np
from srvar.api import fit, forecast
from srvar.spec import ModelSpec, PriorSpec, SamplerConfig, SteadyStateSpec
model = ModelSpec(
p=2,
include_intercept=True,
steady_state=SteadyStateSpec(mu0=np.array([0.0, 0.0]), v0_mu=0.1),
)
YAML (CLI) example:
model:
p: 2
include_intercept: true
steady_state:
mu0: [0.02, 0.03]
v0_mu: 0.01
ssvs:
enabled: false
spike_var: 0.0001
slab_var: 0.01
inclusion_prob: 0.5
Shadow-Rate Model with Stochastic Volatility
from srvar import Dataset, ElbSpec, VolatilitySpec
from srvar.api import fit, forecast
from srvar.spec import ModelSpec, PriorSpec, SamplerConfig
# Configure ELB + SV model
model = ModelSpec(
p=4,
include_intercept=True,
elb=ElbSpec(applies_to=["interest_rate"], bound=0.125),
volatility=VolatilitySpec(enabled=True)
)
# Fit with the explicit legacy Minnesota-style NIW prior
prior = PriorSpec.niw_minnesota_legacy(p=4, y=data_array, n=n_vars)
sampler = SamplerConfig(draws=2000, burn_in=500, thin=2)
fit_res = fit(dataset, model, prior, sampler)
PriorSpec.niw_minnesota(...) remains available as a backward-compatible alias for
PriorSpec.niw_minnesota_legacy(...). For equation-specific own-vs-cross shrinkage, use
PriorSpec.niw_minnesota_canonical(...) or prior.method: "minnesota_canonical"; that explicit
canonical path currently supports homoskedastic models and diagonal stochastic volatility.
Triangular and factor SV remain on the legacy NIW path. For diagonal-SV sensitivity work, the
experimental bridge PriorSpec.niw_minnesota_tempered(..., alpha=0.25) and
prior.method: "minnesota_tempered" keep the equation-wise path but temper the canonical
variance map back toward the legacy baseline.
Plotting
from srvar.plotting import plot_shadow_rate, plot_forecast_fanchart, plot_volatility
# Plot inferred shadow rate
fig, _ax = plot_shadow_rate(fit_res, var="interest_rate")
fig.savefig("shadow_rate.png", dpi=150, bbox_inches="tight")
# Plot forecast fan chart
fig, _ax = plot_forecast_fanchart(fc, var="gdp_growth")
fig.savefig("forecast.png", dpi=150, bbox_inches="tight")
# Plot volatility paths
fig, _ax = plot_volatility(fit_res, var="gdp_growth")
fig.savefig("volatility.png", dpi=150, bbox_inches="tight")
For more examples, see the examples/README.md.
SSP example:
examples/ssp_fit_forecast.py
CLI + YAML (config-driven runs)
For production-style usage, you can run the toolkit from a YAML configuration file.
# Validate a config (checks schema, variable names, and basic compatibility)
srvar validate config/demo_config.yaml
# Run fit (+ optional forecast/plots depending on the config)
srvar run config/demo_config.yaml
# Override output directory
srvar run config/demo_config.yaml --out outputs/my_run
# Run a rolling/expanding backtest (refit + forecast over multiple origins)
srvar backtest config/backtest_demo_config.yaml
# Override output directory for backtest
srvar backtest config/backtest_demo_config.yaml --out outputs/my_backtest
# Fetch macro data directly from FRED into a cached CSV
srvar fetch-fred config/fetch_fred_demo_config.yaml
# Preview what would be fetched/written (no network calls)
srvar fetch-fred config/fetch_fred_demo_config.yaml --dry-run
# Preflight-check that series IDs exist (network call)
srvar fetch-fred config/fetch_fred_demo_config.yaml --validate-series
Loading saved run artifacts
srvar run writes artifacts into the output directory (from output.out_dir or --out), including:
config.ymlfit_result.npzforecast_result.npz(if forecasting is enabled)
To reload a run later (without re-reading the original CSV), use:
from srvar.artifacts import load_run_dir
fit_res = load_run_dir("outputs/my_run")
New artifacts do not require pickle deserialisation. Artifacts written before the format migration
need allow_legacy_pickle=True and must only be loaded when their source and integrity are trusted;
that option can execute pickle code. See the artifact reference for
the migration details.
For an end-to-end example (fit → IRF/FEVD/HD, including factor SV), see
examples/fsv_structural_analysis.py.
See:
config/demo_config.yaml(comment-rich template)config/minimal_config.yaml(minimal runnable)config/backtest_demo_config.yaml(comment-rich backtest template)config/fetch_fred_demo_config.yaml(comment-rich FRED fetch template)config/fsv_demo_config.yaml(factor SV demo config)config/elb_fsv_demo_config.yaml(ELB + factor SV demo config)config/ssp_fsv_demo_config.yaml(steady-state + factor SV demo config)config/carriero2025_backtest_15var_shadow.yaml(Carriero et al. 2025: shadow-rate VAR baseline config)papers/carriero2025forecasting/README.md(replication harness entrypoint)
Replication: Carriero et al. (2025)
From the repository root:
# Optional deps needed for YAML configs + (optional) FRED fetching
python -m pip install -e ".[cli,fred]"
# Run the two baseline configs (expects data/cache/carriero2025_15var.csv to exist)
python papers/carriero2025forecasting/run_replication.py
# Fetch the dataset from FRED first (requires FRED_API_KEY)
python papers/carriero2025forecasting/run_replication.py --fetch-data
Backtest config keys (high level)
In addition to the standard keys (data, model, prior, sampler, output), backtesting uses:
backtest: refit schedule and forecast horizonsmode:expandingorrollingmin_obs: minimum training sample size at first originstep: origin step sizehorizons: list of horizons to evaluatedraws,quantile_levels: forecast distribution settingsstationarity,stationarity_tol,stationarity_max_draws: optional stationarity conditioning
evaluation: which metrics/plots to generatecoverage: empirical interval coverage by horizonpit: PIT histograms for calibration checkscrps: CRPS-by-horizon plot + CRPS in metrics tablewis: weighted interval score (WIS) in metrics tablepinball: pinball (quantile) loss in metrics tablelog_score: Gaussian log score (log predictive density) in metrics tableelb_censor: ELB-censored scoring (floor realized values; optionally floor forecasts)metrics_table: writemetrics.csv
output.store_forecasts_in_memory: control whether backtests retain all forecast draws in RAM (required for plots)
Backtest artifacts
When you run srvar backtest, outputs are written into output.out_dir (or --out), for example:
config.ymlmetrics.csvcoverage_all.png,coverage_<var>.pngpit_<var>_h<h>.pngcrps_by_horizon.pngbacktest_summary.json
Roadmap
- Conjugate BVAR (NIW) with closed-form posteriors
- Legacy Minnesota-style NIW shrinkage priors
- Stochastic Search Variable Selection (SSVS)
- Shadow-rate / ELB data augmentation
- Stochastic volatility (RW/AR1; diagonal/triangular covariance)
- Combined ELB + SV model
- Forecasting with fan charts
- Plotting utilities
- Bayesian LASSO prior
- Steady-state VAR parameterisation
- Dirichlet-Laplace prior
- Full-covariance stochastic volatility (factor SV; v1: NIW+RW)
- Replication harness: Carriero et al. (2025) baseline configs + table builder
- Replication: match paper tables/figures end-to-end (data and evaluation details)
See the open issues for a full list of proposed features.
Contributing
Contributions are welcome and appreciated. To contribute:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes and add tests
- Run the test suite (
pytest) - Commit your changes (
git commit -m 'feat: add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
For full contributor guidelines (including docs builds, style, and testing expectations), see CONTRIBUTING.md.
Limitations and performance notes
- This is currently an alpha research toolkit.
- SV coverage is still evolving: diagonal SV, triangular covariance (time-invariant correlations), and factor SV (time-varying full covariance) are supported. Factor SV is currently limited to
prior.family: "niw"with RW dynamics; ELB, steady-state, and robust shocks are supported. - MCMC runtime depends heavily on
T,N, and sampler settings (draws/burn-in/thinning). - Backtests can stream
metrics.csvwithout keeping all forecast draws in RAM (seeoutput.store_forecasts_in_memory). - Stationarity conditioning is implemented as rejection of unstable coefficient draws; this can be expensive for weak priors (see
forecast.stationarity_max_draws/backtest.stationarity_max_draws).
The documentation site contains more detailed guidance and caveats.
Development Setup
# Clone and install with dev dependencies
git clone https://github.com/shawcharles/srvar-toolkit.git
cd srvar-toolkit
pip install -e '.[dev]'
# Install pre-commit hooks
pre-commit install
# Run tests
pytest
# Run linting
ruff check
ruff format --check
License
Distributed under the MIT License. See LICENSE for more information.
Citing
If you use srvar-toolkit in your research, please cite both the software and the original methodology paper.
Software Citation
@software{shaw2025srvar,
author = {Shaw, Charles},
title = {srvar-toolkit: Shadow-Rate VAR Toolkit for Python},
year = {2026},
url = {https://github.com/shawcharles/srvar-toolkit},
version = {0.3.1}
}
Methodology Citation
@article{grammatikopoulos2025forecasting,
author = {Grammatikopoulos, Michael},
title = {Forecasting With Machine Learning Shadow-Rate VARs},
journal = {Journal of Forecasting},
year = {2025},
pages = {1--17},
doi = {10.1002/for.70041}
}
@article{carriero2025forecasting,
title={Forecasting with shadow rate VARs},
author={Carriero, Andrea and Clark, Todd E and Marcellino, Massimiliano and Mertens, Elmar},
journal={Quantitative Economics},
volume={16},
number={3},
pages={795--822},
year={2025},
publisher={Wiley Online Library}
}
Acknowledgments
This toolkit implements methods from:
Grammatikopoulos, M. 2025. "Forecasting With Machine Learning Shadow-Rate VARs." Journal of Forecasting 1–17. https://doi.org/10.1002/for.70041
Carriero, A., Clark, T. E., Marcellino, M., & Mertens, E. 2025. "Forecasting with shadow rate VARs." Quantitative Economics 16(3), 795–822.
For the original MATLAB replication code, see: MichaelGrammmatikopoulos/MLSRVARs
For an additional MATLAB replication toolbox with code written by Elmar Mertens, see: elmarmertens/CCMMshadowrateVAR-code
Additional References
- Kim, S., Shephard, N., & Chib, S. (1998). "Stochastic Volatility: Likelihood Inference and Comparison with ARCH Models." Review of Economic Studies 65(3), 361–393.
- Carriero, A., Clark, T. E., & Marcellino, M. (2019). "Large Bayesian Vector Autoregressions with Stochastic Volatility and Non-Conjugate Priors." Journal of Econometrics 212(1), 137–154.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file srvar_toolkit-0.3.1.tar.gz.
File metadata
- Download URL: srvar_toolkit-0.3.1.tar.gz
- Upload date:
- Size: 133.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
57c45740b720d4eacd8db3761e2db0d3625ec3fd6b0ace7f70f49f612a29bd92
|
|
| MD5 |
2788bfeca428915fa91e9e258841c810
|
|
| BLAKE2b-256 |
3d36a370cec325da7a1e1cb127f1563a41520e539b5d13a8c07cdb748bce9062
|
Provenance
The following attestation bundles were made for srvar_toolkit-0.3.1.tar.gz:
Publisher:
release.yml on shawcharles/srvar-toolkit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
srvar_toolkit-0.3.1.tar.gz -
Subject digest:
57c45740b720d4eacd8db3761e2db0d3625ec3fd6b0ace7f70f49f612a29bd92 - Sigstore transparency entry: 2194968385
- Sigstore integration time:
-
Permalink:
shawcharles/srvar-toolkit@d73a51b1a53282883bb48d9616a9758a440213c1 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/shawcharles
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d73a51b1a53282883bb48d9616a9758a440213c1 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file srvar_toolkit-0.3.1-py3-none-any.whl.
File metadata
- Download URL: srvar_toolkit-0.3.1-py3-none-any.whl
- Upload date:
- Size: 158.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2575f788793323799044bbfe4f8441a921cc1534b5b7c96a16e975200d2dba59
|
|
| MD5 |
f23ee9ea2b23d88cadfd25fab9cde06e
|
|
| BLAKE2b-256 |
5134f134db6c54779c3395f0e9b3872d9e03102002c1a58c1a97e54939fcd48b
|
Provenance
The following attestation bundles were made for srvar_toolkit-0.3.1-py3-none-any.whl:
Publisher:
release.yml on shawcharles/srvar-toolkit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
srvar_toolkit-0.3.1-py3-none-any.whl -
Subject digest:
2575f788793323799044bbfe4f8441a921cc1534b5b7c96a16e975200d2dba59 - Sigstore transparency entry: 2194968391
- Sigstore integration time:
-
Permalink:
shawcharles/srvar-toolkit@d73a51b1a53282883bb48d9616a9758a440213c1 -
Branch / Tag:
refs/tags/v0.3.1 - Owner: https://github.com/shawcharles
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@d73a51b1a53282883bb48d9616a9758a440213c1 -
Trigger Event:
workflow_dispatch
-
Statement type: