Context
assertTrue is entirely unsupported. Full upstream parity means evaluating arbitrary JS in the assertion (GraalJS) — that's gated on the #1292 decision. But there's a cheap, genuinely useful phase 1 that does NOT require it:
Phase 1 scope: assertTrue: ${VAR} (variable lookup) and literals, evaluated with JS truthiness on the resolved value. This covers the common CI pattern: runScript sets output.flag → assertTrue: ${output.flag}. Upstream truthiness reference: their 065_when_true.yaml exercises ${undefined}/${null}/${0} falsy, ${123}/${'String'}/objects/arrays truthy — phase 1 needs the same truthiness table for looked-up values (which arrive as strings post-lookup; define and test the string-value truthiness rules explicitly: ''/'false'? — pin to upstream behavior for interpolated string results, add a layer-2-style vector or corpus flow for it).
JS expressions inside assertTrue keep failing loud, referencing #1292.
Repro
- Corpus flow:
scripts/maestro-conformance/corpus/upstream/067_assertTrue_pass.yaml
- Declared divergences:
FLOW_DIVERGENCES['upstream/067_assertTrue_pass'] and the assertTrue item in FLOW_DIVERGENCES['upstream/076_optional_assertion']
Acceptance
Context
assertTrueis entirely unsupported. Full upstream parity means evaluating arbitrary JS in the assertion (GraalJS) — that's gated on the #1292 decision. But there's a cheap, genuinely useful phase 1 that does NOT require it:Phase 1 scope:
assertTrue: ${VAR}(variable lookup) and literals, evaluated with JS truthiness on the resolved value. This covers the common CI pattern:runScriptsetsoutput.flag→assertTrue: ${output.flag}. Upstream truthiness reference: their065_when_true.yamlexercises${undefined}/${null}/${0}falsy,${123}/${'String'}/objects/arrays truthy — phase 1 needs the same truthiness table for looked-up values (which arrive as strings post-lookup; define and test the string-value truthiness rules explicitly:''/'false'? — pin to upstream behavior for interpolated string results, add a layer-2-style vector or corpus flow for it).JS expressions inside
assertTruekeep failing loud, referencing #1292.Repro
scripts/maestro-conformance/corpus/upstream/067_assertTrue_pass.yamlFLOW_DIVERGENCES['upstream/067_assertTrue_pass']and theassertTrueitem inFLOW_DIVERGENCES['upstream/076_optional_assertion']Acceptance
assertTruewith literal/lookup values matches upstream pass/fail on the corpus flow (067 entry removed or narrowed to expression-only, referencing Decision: should Maestro${}interpolation evaluate JS expressions (GraalJS parity) or stay lookup-only? #1292); conformance green with no new divergences.optional: truecomposes (assertTrue failure downgrades to warning when marked optional) once Maestro compat: supportoptionalon scrollUntilVisible and extendedWaitUntil (command- and element-level) #1291 lands.