builtin__reshape
Build a value in a target JSON shape — the reshape tool kind exposed as one callable tool, so a plan can remap keys without authoring a tool YAML or shelling out to jq. Pure: no process, no LLM, no side effects. Read-only.
The
shape is a JSON object whose keys are literal and whose leaf strings are templates over the surrounding step’s data — an earlier result as {{Ex.field}}, the current map element as {{item}}, a plan input as {{input.x}} — exactly like any other step input. The pipeline renders it once (like a map’s over), so the result is that shape with every template resolved, with the same typed splice: a leaf that is exactly one tag keeps the source value’s type (numbers stay numbers, arrays stay arrays); mixed text like "PR #{{item.number}}" renders to a string.
user__ exec tool. A shape referencing a field the data lacks fails the step’s input render, like any other bad path in a step input.
Because that single render is the pipeline’s, the tool itself never re-renders the shape: whatever the templates resolved to is returned verbatim, so values that happen to contain {{ … }} — an LLM quoting a Helm chart, a GitHub Actions expression, a mustache partial — pass through untouched instead of being parsed as graph templates. The flip side is that builtin__reshape is a plan-step tool: called directly by an agent step or from ask/chat, where inputs are model-authored and not plan-rendered, it returns the shape it was given.