Variant identity
How resolved variant_id coordinates are formed and validated.
Each resolved variant gets a derived variant_id composed from its coordinates, joined by :::
<agent>[::<model>[::<effort>][::<context_window_size>][::thinking][::fast]][::<agent_mode>]::<prompt_id>[::<environment_id>][::<product_id>][::<extension_path…>]Rules:
- The prompt component is the prompt id (
p0, or your explicitid), never the prompt text. - For catalog-backed models, the
<model>component is the resolved nativeowner/modelcoordinate with/replaced by-(for exampleanthropic-claude-opus-4-8), not the raw authored string or gateway alias. - The
<agent_mode>segment appears whenever theagent_modeaxis is declared (build included) and is absent when the axis is not declared. Authoringagent_mode: buildtherefore produces different ids than omitting the axis. - Extension-derived variants append the extension id path (for example
sec-edgar::aapl) and record it asresolved_extend_id. When an extension declares a multi-entrypromptslist, the chosen entry's id follows that extension's id in the variant id (for examplesec-edgar::use-xbrl). Like the extension's chosen environment and product, that entry id is a variant coordinate only —resolved_extend_idstays the extension id path. - Optional axes that are not declared contribute nothing, so simple experiments keep short ids like
claude::p0.
The coordinate ids (agent, model and its controls, prompt, environment, product) are recorded on every run so results can group and filter along them. Tests and setup checks can read the same coordinates at runtime from $AX_RUN_CONTEXT_PATH; see Tests.
ax experiment variants <file> prints the resolved variants with their ids and fingerprints.
Validation
ax experiment validate rejects a matrix when two resolved variants collide on variant_id, and requires the fully resolved set to be non-empty, with every variant carrying an agent and a non-empty prompt. See Validation rules for the full list.