Multistage Execution

View as Markdown

Set runtime.multiStage=true to run profileset jobs in multistage stages. If you've used autoSimC or similar staged approaches, this is the same idea: run all candidates at low precision first, cull the losers, then re-sim survivors at full precision. The result is the same ranking with less total compute. Jobs without profilesets, or with multiStage omitted/false, run in a single pass as normal.

#Stages and Precision

Multistage execution runs up to three stages at target errors of 1.0, 0.2, and 0.05. Between stages, candidates outside the statistical error band of the top performers are culled. If your profile specifies a target_error already satisfied by an earlier stage, the remaining stages are skipped. The final stage uses your profile's target_error (clamped to the platform safety floor of 0.01) when set, otherwise the stage default of 0.05. The final stage is also the only one where user-specified iterations apply.

#Directives Deferred to Final Stage

These directives are automatically held until the final stage: calculate_scale_factors, scale_delta_multiplier, center_scale_delta, dps_plot_stats, report_details, scale_only.

#Single-Run Fallback

Simmit evaluates your input before execution and may fall back to a single-run. The multiStage.reason field on the result tells you what happened:

ReasonMeaning
eligible_profileset_onlyMultistage ran normally.
disabled_by_optionruntime.multiStage was false or omitted.
no_variants_in_inputNo profileset.* directives found. Multistage requires profilesets.
no_profileset_candidatesProfileset directives resolved to zero candidates.
below_min_candidatesFewer than 4 candidates. Culling is not useful at this scale.
unsupported_copy_set_onlyInput uses copy=/set= blocks without profileset.*. Not stage-separable.
unsupported_mixed_profileset_copy_setInput mixes profileset.* with copy=/set= blocks. Not supported for multistage.
unsupported_multi_actorInput declares more than one player actor.
unsupported_stage_sensitive_directiveInput contains a directive that cannot be safely staged.

#Reading Results

Multistage metadata lives in result.summary.multiStage:

#enabledboolean

true if multistage ran, false if the job fell back to single-pass.

#reasonstring

The routing reason (see table above).

#stagesarray

Array of stage objects in execution order. Empty for single-pass runs.

Each entry in multiStage.stages is:

#stagenumber

Stage number (1-indexed).

#labelstring

initial, intermediate, or final.

#profilesetsnumber

Count entering this stage.

#cullednumber

Count eliminated at the end of this stage. The last executed stage reports 0.

The funnel invariant stages[i].profilesets - stages[i].culled = stages[i+1].profilesets holds between adjacent stages. Each profileset in result.summary.mainActor.profilesets.results also includes a stage field indicating the highest stage it reached. Multistage runs emit artifacts per stage; use kind + stage as the stable identity when consuming result.artifacts.

  • Idempotencyuse idempotency keys to safely retry job submissions.
  • Webhooksset up webhooks to avoid polling for job completion.