Windows acceptance testing
The primary acceptance example is the twin-rib equipment bracket.
The September 6, 2026 study recorded 5 passed integration tests across 5 serial real solves
in 208.16 seconds on ANSYS Student Mechanical 2026 R1 using explicit mechanical_batch.
Read the formal test report. The preceding offline
baseline was 252 passed, 20 skipped; it is not a new result from this presentation replacement.
An earlier local gRPC handshake failed and was not retested by the bracket study. Other
installations, service packs, CAD importers, licenses, and versions require their own acceptance.
The public JSON summary, case details, and provenance are data attachments to the formal report. Original JUnit and local execution logs are retained only in the ignored local archive.
Python and offline checks
The base offline CLI supports Python 3.11–3.13. The optional ansys extra supports
Python 3.12–3.13; Python 3.13 is recommended. PyMechanical 0.13.2 declares
Requires-Python: >=3.12,<4.0, so installing that extra on Python 3.11 fails.
Create a Windows environment rather than copying another machine's environment:
git clone https://github.com/kaze-kaze/SimStudio.git
cd SimStudio
py -3.13 -m venv .venv
./.venv/Scripts/python.exe -m pip install -e ".[dev,ansys]"
./.venv/Scripts/python.exe -m pip check
./.venv/Scripts/ruff.exe check .
./.venv/Scripts/python.exe -m pytest -q -m "not ansys_integration"
Calling the environment executables directly avoids changing the PowerShell activation policy.
Offline-only users can choose Python 3.11/3.12 and install .[dev] without the optional clients.
Installing clients does not install Mechanical or provide a license.
The two real symbolic-link checks report NOT_RUN when Windows denies link creation with
WinError 1314. Their original rejection assertions still run on a host with that privilege.
Other symbolic-link errors are not hidden.
Validate and dry-run the bracket
The committed STEP and CAD properties are ready to use. The specification already selects local
execution.backend: mechanical_batch and a nominal 8 mm quadratic mesh. CAD dependencies
are required only when regenerating geometry. If copying the specification to another directory,
update inputs.geometry_file to the original STEP's absolute path.
./.venv/Scripts/python.exe -m ansys_skill.cli doctor --json
./.venv/Scripts/python.exe -m ansys_skill.cli validate examples/gusseted-bracket/simulation.yaml --json
./.venv/Scripts/python.exe -m ansys_skill.cli compile examples/gusseted-bracket/simulation.yaml --out build/bracket-compile-01 --json
./.venv/Scripts/python.exe -m ansys_skill.cli run examples/gusseted-bracket/simulation.yaml --out build/bracket-dry-01 --json
The last command must return DRY_RUN and start no Mechanical process. Review the normalized
specification, plan, saved script, and input snapshot. Use a new or empty output directory for every run.
Standalone doctor describes the default gRPC setup; run additionally records a doctor report
for the selected backend. Neither environment discovery nor an open TCP port proves a successful solve.
Explicitly run the installed solver
This command starts Mechanical and can consume its installed license. Use it only for an explicitly requested real solve after reviewing the specification:
./.venv/Scripts/python.exe -m ansys_skill.cli run examples/gusseted-bracket/simulation.yaml --out build/bracket-real-01 --execute --json
./.venv/Scripts/python.exe -m ansys_skill.cli inspect build/bracket-real-01 --json
./.venv/Scripts/python.exe -m ansys_skill.cli report build/bracket-real-01 --json
Batch starts and exits a task-owned local Windows process, captures stdout/stderr, and uses no gRPC
connection. It rejects a remote host, a configured port, start_instance: no, certificates, or
settings that request keeping the instance alive. Batch is never an automatic fallback from gRPC.
The command above solves the nominal 8 mm combined-load case. It does not reproduce the complete study or the 5 mm cover image; use the next section for all five solves.
Require synthetic: false and inspect verification.json, not just the exit code or SOLVED.
CLI requested-results and small-deformation checks must pass. Mixed-load CLI reaction_balance
and disabled cantilever_analytical remain NOT_RUN; the study supplies separate independent
force and moment checks. Stress-singularity review remains WARN. Safety factor and automatic
visual review remain NOT_RUN; the recorded manual image review is separate.
Automated real acceptance
The primary study runs three combined-load cases on 12 / 8 / 5 mm quadratic meshes, then gravity-only and doubled force/pressure cases on the 5 mm mesh. Gravity stays constant. It checks force and moment balance from CAD properties, material values and element types from solver input, selected face geometry, fixed support, input hashes, native PNGs, and full-field linearity.
Run only the bracket entry serially, with explicit opt-in and a fresh output directory:
$previousAnsysAvailable = $env:ANSYS_AVAILABLE
$previousTestBackend = $env:ANSYS_TEST_BACKEND
try {
$env:ANSYS_AVAILABLE = "1"
$env:ANSYS_TEST_BACKEND = "mechanical_batch"
./.venv/Scripts/python.exe -m pytest -q tests/integration/test_engineering_bracket.py --basetemp build/bracket-study-01 --junitxml=build/bracket-study-01.xml
}
finally {
$env:ANSYS_AVAILABLE = $previousAnsysAvailable
$env:ANSYS_TEST_BACKEND = $previousTestBackend
}
Choose a fresh --basetemp directory: pytest owns and may clear it. Never use existing results
or user files as the base directory. Keep these tests serial; parallel pytest workers are rejected
before starting Mechanical. The bracket study requires an explicit real backend and rejects
fake. Use gRPC only on an independently verified host. Ordinary offline pytest -q skips real
integrations and starts no solver.
Engineering acceptance and retained outputs
| Case | Mesh | Loads |
|---|---|---|
mixed_12mm |
12 mm | Three-component force + eccentric pressure + self-weight |
mixed_8mm |
8 mm | Same combined loads |
mixed_5mm |
5 mm | Same combined loads; primary presentation case |
gravity_5mm |
5 mm | Self-weight only |
double_mechanical_5mm |
5 mm | Twice force and pressure; unchanged self-weight |
Force and moment relative tolerances are 0.5% and 1%. Both 12 → 8 and 8 → 5 mm changes must meet 5% for maximum total and pad mean Z displacement, and 10% for pad mean and 95th-percentile equivalent stress. Pad statistics weight nodes equally, not by area.
Full-field linearity compares u(2P+G) = 2u(P+G) - u(G) at matching node IDs and coordinates
with per-node tolerance 1e-12 m + 1e-6 × ||predicted displacement||. Do not simply double maxima
containing gravity. Global stress peaks remain review quantities, excluded from strength acceptance.
Each run retains engineering-checks.json, ordinary CLI reports, RST, a saved Mechanical project,
and solver logs. The study root contains study-summary.json. The development extra includes
Pillow for complete PNG structure verification and pixel decoding of the three native images
per case. Retain separate manual-review evidence without changing automatic visual_review.
DPF isolation and historical diagnostics
Independent DPF extraction runs in its own Python process. In the first bracket-study attempt,
in-process DPF initialization changed the parent Python environment to the product's bundled
Python 3.10 paths. The next Python 3.13 CLI failed with AssertionError: SRE module mismatch.
The worker isolates those changes and retains separate dpf-stdout.log and dpf-stderr.log
files; solve logs are kept separately. A single successful solve did not expose this sequencing bug.
The former public cantilever demonstration is replaced by the bracket. Its beam model remains
only as the internal analytical regression fixture tests/fixtures/cantilever. Earlier real
cantilever and .mechdat / .mechdb template-synchronization acceptance are historical records,
not extra cases in this five-test bracket study.
Retain failed run directories. Diagnostics include environment.json, run-manifest.json,
mechanical-artifacts.json, the batch stdout/stderr logs, face-selection-report.json, and
solver/solve.out when reached. Mechanical messages include source object names/types so empty
localized error text still identifies its origin. Do not discard an error to force verification to pass.
Exit codes: 2 specification, 3 environment, 4 Mechanical/transfer, 5 DPF, 6 verification.
Do not publish proprietary geometry, results, license details, certificates, or private paths.