Context
Numeric option fields on advertised commands currently demand a literal and reject ${VAR} — so an idiomatic env-driven flow dies on a command we support. The engine resolves ${VAR} lookups everywhere else (config/env/runFlow env/runScript output.*); this extends the same lookup to numeric fields, validating the resolved value with the existing rules (integer, range) and failing loud with the source line when the resolved value isn't a valid number.
Scope: variable lookup only. ${0 + 1}-style JS expressions are NOT this issue — that's the #1292 decision. After this lands, upstream/032_element_index still diverges (its corpus value is an expression), but the lookup half of the class is closed and flow 042 goes green.
Fields
extendedWaitUntil.timeout (corpus upstream/042_extended_wait: ${TIMEOUT} from a flow env block)
tapOn.index
- audit for siblings while there:
waitForAnimationToEnd.timeout, swipe.duration, eraseText.charactersToErase, repeat.times, retry.maxRetries — same lookup rule everywhere, one shared helper, not per-field branches.
Repro
FLOW_DIVERGENCES['upstream/042_extended_wait'] in scripts/maestro-conformance/expected-divergence.ts
Acceptance
Context
Numeric option fields on advertised commands currently demand a literal and reject
${VAR}— so an idiomatic env-driven flow dies on a command we support. The engine resolves${VAR}lookups everywhere else (config/env/runFlow env/runScriptoutput.*); this extends the same lookup to numeric fields, validating the resolved value with the existing rules (integer, range) and failing loud with the source line when the resolved value isn't a valid number.Scope: variable lookup only.
${0 + 1}-style JS expressions are NOT this issue — that's the #1292 decision. After this lands,upstream/032_element_indexstill diverges (its corpus value is an expression), but the lookup half of the class is closed and flow 042 goes green.Fields
extendedWaitUntil.timeout(corpusupstream/042_extended_wait:${TIMEOUT}from a flow env block)tapOn.indexwaitForAnimationToEnd.timeout,swipe.duration,eraseText.charactersToErase,repeat.times,retry.maxRetries— same lookup rule everywhere, one shared helper, not per-field branches.Repro
FLOW_DIVERGENCES['upstream/042_extended_wait']inscripts/maestro-conformance/expected-divergence.tsAcceptance
identical;pnpm maestro:conformancegreen with no new divergences.${}interpolation evaluate JS expressions (GraalJS parity) or stay lookup-only? #1292.