A passed gate is transparent to its generate: subtree. The accepted attempt's
typed outputs now leave the gate, so a generate → evaluate → repair loop can bind
its result straight to workflow outputs: — closing the gap that forced gated
extraction to round-trip through output_artifact or be rebuilt outside AWF.
Added
- Gate typed-output forwarding.
{{ step.<id>.<field> }}for a producer in a
gate'sgenerate:block now resolves to the gate's accepted attempt from
anywhere a normal step reference works: workflowoutputs:, a downstream
step'srun:/input:/with:, anif:condition, and the
map → gate → reducetyped fan-in (a gate-nested body producer contributes its
accepted attempt's typed outputs toaggregate.json, alongside its files). This
generalizes the prior files-only forwarding to typed outputs. The evaluator's
verdict stays gate-internal — read it with{{ evaluate.<field> }}from inside
the gate only.examples/awf-llm-gate-extract/workflow-typed.yamldemonstrates
a gated extraction bound directly to workflowoutputs:.
Changed
AWF5003restated. It now covers the two cases that remain rejected: a gate
evaluator step referenced from outside the gate, and a gate nested inside a
mapbody referenced directly from outside the map (its accepted attempts fan
in throughreduce:). A gate-nested-in-map producer referenced from outside the
map now reportsAWF5003rather thanAWF5002. No previously valid workflow
changes behavior — this is a pure widening: workflows that were rejected for
referencing a passed gate'sgenerate:output now validate.
Fixed
- Gate integrity is enforced at every layer. The generate-only rule (only
generate:producers forward; the evaluator's verdict stays internal) holds
identically in validation (ir.blockingScope), scalar resolution
(stepRuntimePath), and artifact resolution (passedGateArtifactRuntimePath),
so the scalar and file reference rules cannot drift apart. No IR field, event,
or fold arm was added: the definition digest is unchanged for every existing
workflow, and resume is unaffected.