Optional validation plan¶
This page records the optional validation lanes used to build confidence beyond required PR CI. These checks are concrete and reproducible, but they are not required for ordinary pull requests because they depend on local VMEC2000, SIMSOPT, optional seed repositories, or expensive optimization runs.
Current CI verification¶
Do not treat a checked-in SHA or workflow URL as the current release baseline.
Before using this plan for release validation, verify the newest main CI run
directly:
gh run list --repo uwplasma/vmec_jax --branch main --workflow CI --limit 5
gh run view RUN_ID --repo uwplasma/vmec_jax --json status,conclusion,jobs
Record the verified run ID, head SHA, conclusion, and completion time in the release notes for the candidate commit.
The required CI split remains:
fast tests on Python 3.10, 3.11, and 3.12,
Python 3.11 coverage at the current
95%gate,bounded physics smoke,
parity manifest dry-run smoke,
wheel/sdist build plus fast docs,
full guide docs.
The manual/nightly physics-full job remains outside ordinary PR execution.
Plan helper¶
The declarative helper is:
python validation/qi_seed_robustness_plan.py \
--output results/qi_seed_audit/validation_plan.json
It writes a JSON manifest with required lanes, optional lanes, family representatives, acceptance criteria, and deferred validation lanes. For a reviewable text form:
python validation/qi_seed_robustness_plan.py \
--format markdown \
--output results/qi_seed_audit/validation_plan.md
The helper does not run VMEC2000, SIMSOPT, optimization, or GitHub API
queries. Its default CI baseline is an explicit unverified placeholder;
pass the verified run metadata with --ci-status, --ci-head-sha,
--ci-url, and --ci-completed-at-utc only after checking the current
main workflow. The manifest records commands and gates that should be
executed deliberately by a local or scheduled validation lane.
Family-representative QI workflow¶
The seed-robustness workflow starts with solved-state diagnostics rather than a full optimizer sweep. The family representatives are:
Family |
Label |
Required for probe |
Source |
|---|---|---|---|
|
|
yes |
bundled |
|
|
optional |
|
|
|
yes |
bundled |
|
|
yes |
bundled |
|
|
yes |
bundled |
Run the no-optimization audit first:
PYTHONPATH=. python examples/optimization/audit_qi_seed_suitability.py \
--quick \
--output results/qi_seed_audit/summary.json \
--csv results/qi_seed_audit/summary.csv
Acceptance for this lane:
QI, QH, QA, and simple rows are present from bundled assets.
QP is included when
OMNIGENITY_OPTIMIZATION_ROOTis available; otherwise it is recorded inskipped_defaultsrather than failing.Each row records smooth QI, legacy QI, mirror ratio, elongation, aspect ratio, mean iota, failed constraints, and ranks.
Smooth-QI rows use
include_bounce_endpoints=Trueby default, matching the normalized level endpoints used by the legacy branch-shuffle diagnostic.No optimization is launched.
Required no-executable CI coverage reads bundled VMEC2000 wout files for
the QI, QH, QA, simple, and finite-beta representatives and checks final
residual, flux, energy, iota-profile, and non-axisymmetric geometry quantities.
There is still no checked-in QP input + wout fixture; QP remains an
optional OMNIGENITY_OPTIMIZATION_ROOT lane until a small fixture can be
added.
Before running even tiny optimizer probes, write a dry-run manifest:
PYTHONPATH=. python examples/optimization/audit_qi_seed_suitability.py \
--quick \
--prefine-probes plan \
--prefine-manifest results/qi_seed_audit/prefine_manifest.json
This manifest is the review artifact. It lists selected rows, hard caps,
expected output files, exact commands, selected phimin values, endpoint
mode, and the repeated-stage prefine plan. The default prefine plan is capped
at --prefine-stage-modes 1,1,2,2,3 with per-stage and total nfev caps
recorded for each selected seed. Constrained mirror cleanup uses
--prefine-mirror-surface-index all by default so the acceptance gate cannot
pass by improving only one Boozer surface. Only after review should a local
operator use --prefine-probes run --prefine-reviewed.
Planned and executed prefine manifests include deterministic compact summaries
with status counts, completed stage modes, best seed by final objective, best
objective improvement, failed and timed-out probes, objective-history
regressions when compact histories are present, acceptance status, and a
recommended next action. These summaries are promotion gates for the next
probe only; longer QI sweeps still require final diagnostics and plot review.
Completed monotone probes with final QI objective at or below 5e-2 are
accepted as stable low-objective seeds even if the tiny smoke budget leaves
them unchanged.
Continuation probes carry the optimized VMEC input between stages. In
particular, a mode-1 projection that zeros higher boundary modes remains the
seed for the next mode-2 stage unless the stage itself reintroduces those modes
as active zero-increment degrees of freedom.
Accepted optimization histories are exact-replay histories, not raw trial-solve
histories. If the relaxed trial solve accepts a point that replays worse under
the exact Jacobian path, the optimizer retains the best exact point as the
final output and increments rejected_trial_exact_history_count.
Optional external lanes¶
External VMEC asset intake¶
Candidate SIMSOPT and Landreman vmec_equilibria decks are tracked in
validation/external_vmec_asset_manifest.toml. This manifest is
metadata-only: it records pinned source URLs, visible license status,
physics-family tags, companion reference files, and whether an asset is a good
small fixture, an explicit fetched asset, or only a reference target.
Use the inventory helper to list or verify candidates without copying upstream
data into the repository:
python tools/diagnostics/external_vmec_asset_inventory.py \
--family stellarator --family fixed_boundary
python tools/diagnostics/external_vmec_asset_inventory.py \
--repository landreman_vmec_equilibria \
--source-root landreman_vmec_equilibria=outputs/external_benchmark_sources/vmec_equilibria \
--fail-missing
The current policy is:
SIMSOPT assets are MIT licensed upstream. Small text input decks may be bundled with attribution when they materially improve required CI; larger NetCDF references should stay fetched or optional.
landreman/vmec_equilibriahas no visible GitHub license metadata. Keep those cases as explicit local-fetch/reference validation targets unless the license is clarified.Free-boundary Landreman inputs are useful targets, but several reference missing mgrid files in that repository. Prefer the SIMSOPT W7-X generated mgrid workflow, or keep those Landreman rows as blocked optional lanes until the corresponding mgrid source is identified.
Representative candidates already recorded there include:
SIMSOPT circular tokamak and ITERModel axisymmetric fixed-boundary decks.
SIMSOPT
basic_non_stellsymandLandremanSenguptaPlunk_section5p3for fixed-boundaryLASYM=true.SIMSOPT
LandremanPaul2021_QA_lowresandLandremanPaul2021_QH_reactorScale_lowresfor QA/QH non-axisymmetric fixed-boundary parity and performance.SIMSOPT
examples/2_Intermediate/free_boundary_vmec.pyfor a W7-X generated-mgrid free-boundary workflow.Landreman
HSX_QHS_vacuum_ns201, Ku/Boozer QHS, NCSX, W7-X, and ITER-like fixed-boundary decks as optional reference/fetch-only validation targets.
SIMSOPT formula parity:
RUN_SIMSOPT_VALIDATION=1 pytest -q tests/test_simsopt_optional_validation.py
VMEC2000 executable smoke:
VMEC2000_EXEC=/path/to/xvmec2000 \
VMEC2000_INTEGRATION=1 \
pytest -q tests/test_vmec2000_exec_fast_validation.py
Full VMEC2000 marker tier:
VMEC2000_EXEC=/path/to/xvmec2000 \
VMEC2000_INTEGRATION=1 \
pytest -q -m vmec2000
These lanes must remain optional. They skip or stay unselected unless the operator installs the external dependency and exports the required environment variables.
Recent bounded parity notes¶
On 2026-05-19, after e0b00e7, the no-executable physics gates stayed green:
python -m pytest tests/test_wout_physics_gates.py tests/test_vmec_parity_physics_fast_gates.py -q
This covered 13 bundled physics/parity scalar checks in about 2.4 seconds on the local machine.
The additional executable-backed
up_down_asymmetric_tokamak nightly gate did not promote. VMEC2000 and
vmec_jax both wrote zero aspect/volume scalars for the low-residual
zero-pressure end state, so the optional gate treats aspect as unavailable for
that specific case in the saved-artifact comparison. The leading residuals in
that dated artifact were lmns relRMS about 1.78e-2 against a 1e-3
gate, bsupumns relRMS about 1.05e-2 against a 1e-2 gate, and
bsubvmns diff RMS about 5.72e-4 against a near-zero VMEC2000 reference.
This remains an optional/instrumented LASYM gap, not a promoted strict external
parity result.
On 2026-05-22, local external fixed-boundary probes were added to the optional
planning manifest after bounded xvmec2000 stage-trace checks against
/Users/rogeriojorge/local/simsopt and
/Users/rogeriojorge/local/vmec_equilibria:
python tools/diagnostics/external_vmec_asset_inventory.py \
--source-root simsopt=/Users/rogeriojorge/local/simsopt \
--source-root landreman_vmec_equilibria=/Users/rogeriojorge/local/vmec_equilibria \
--json-out outputs/external_vmec_assets/all_local_inventory.json
EXTERNAL_IDS="fixed_nonaxis_lasym_false_simsopt_qh_reactor_lowres_external,fixed_nonaxis_lasym_false_landreman_w7x_standard_boundary,fixed_nonaxis_lasym_false_landreman_ncsx_fixed_boundary,fixed_nonaxis_lasym_false_simsopt_w7x_standard,fixed_nonaxis_lasym_true_simsopt_basic_non_stellsym_external,fixed_nonaxis_lasym_false_landreman_hsx_qhs_fixed"
python tools/diagnostics/parity_sweep_manifest.py \
--vmec-exec ~/bin/xvmec2000 \
--ids "$EXTERNAL_IDS" \
--output-root outputs/parity_sweeps_external_matrix
Those rows stay optional planning entries. They are bounded single-grid,
eight-iteration checks that broaden external coverage across SIMSOPT QH,
SIMSOPT W7-X, SIMSOPT LASYM=true basic non-stellarator-symmetric,
Landreman W7-X, Landreman NCSX, and Landreman HSX-QHS fixed-boundary assets
without vendoring the external inputs or requiring free-boundary mgrid files.
The refreshed local run
outputs/parity_sweeps_external_full6/20260522_224144/summary.json passed
all six rows against ~/bin/xvmec2000 with per-row runtimes between
13.45 s and 15.10 s. This is still optional evidence because the
inputs live in local external checkouts, but it is the current bounded
VMEC2000 matrix for SIMSOPT/Landreman fixed-boundary assets.
The Landreman Ku/Boozer QHS deck is now a bounded optional manifest row after
the comparator learned to patch multiline NS_ARRAY/NITER_ARRAY/
FTOL_ARRAY assignments and to ignore NITER=-1 final-reference
threed1 records. The local probe
outputs/parity_sweeps_external_kuboozer_probe/n4qh_4013d3d passed the
eight-iteration single_ns=16 stage-trace gate with zero residual-scalar
drift and matching final-grid WOUT geometry. The pre-existing
SIMSOPT LandremanSenguptaPlunk_section5p3 LASYM=true planning probe
remained a non-promoted target in the same run context because the strict
2e-3 stage-trace gate failed at iteration 10 with a maximum printed
fsqz relative difference of about 2.97e-2.
The 2026-05-22 optional converged-WOUT nightly rerun, plus the follow-up LASYM
bsubvmns fix, classify the current optional lanes as follows:
LandremanPaul2021_QA_lowresconverged-WOUT parity passed locally against~/bin/xvmec2000.basic_non_stellsym_pressureconvergedLASYM=truefinite-beta WOUT parity now passes locally after the asymmetricbsubvmnschannel was reconstructed from VMEC’s corrected half-mesh IEQUI source.cth_like_free_bdyconverged-WOUT parity is skipped in the optional pytest matrix until it is reduced to a bounded gate; the promoted free-boundary evidence is still the stock-executable stage-trace smoke.
Next parity gates¶
The next parity gates are:
Keep the solved-state QI diagnostic fixture green while broadening optimizer seed-robustness claims.
Run reviewed repeated-stage family-prefine probes across QI, QP, QH, QA, and simple seeds.
Keep VMEC2000 executable smoke green before broadening the executable-backed manifest matrix. The current stock-executable
LASYM=truecoverage is a vacuum-entry smoke, not strict field-by-field free-boundary parity:VMEC2000_EXEC=/path/to/xvmec2000 \ VMEC2000_INTEGRATION=1 \ pytest -q tests/test_vmec2000_exec_fast_validation.py::test_vmec2000_free_boundary_lasym_true_reaches_vacuum_solve
Keep the optional bounded free-boundary
LASYM=truemanifest case instrumented until strict external parity is demonstrated. Thefreeb_scalpotcomparator needs an instrumented VMEC2000 executable that honors theVMEC_DUMP_*environment variables; a stockxvmec2000run can still solve the case, but it will not emit the scalpot/vacuum dumps used for this diagnostic.VMEC2000_EXEC=/path/to/xvmec2000 \ VMEC2000_INTEGRATION=1 \ PYTHONPATH=. python tools/diagnostics/parity_sweep_manifest.py \ --ids freeb_nonaxis_lasym_true_cth_like_local \ --output-root results/parity/freeb_lasym_true \ --manifest tools/diagnostics/parity_manifest.toml \ --vmec-exec "$VMEC2000_EXEC"
This self-contained
vmec_jax/examplescase uses a scaled synthetic mgrid with current signs matched to the plasma current. It exerciseslfreeb=True,lasym=True, non-axisymmetric vacuum coupling with explicit per-iteration runtime andfreeb_scalpotaccuracy thresholds.Keep SIMSOPT formula-level comparisons green where SIMSOPT is installed.
Deferred validation lanes¶
The deferred lanes are intentionally not required CI:
Full multi-seed constrained-QI optimization sweep with visual Boozer
|B|contour audit.Full VMEC2000 parity manifest against a local executable and fetched large assets.
SIMSOPT finite-difference optimization comparison beyond formula-level residual parity.
GPU-specific QI prefine and optimization robustness matrix.