# `PtcRunner.SubAgent.Loop.StepAssembler`
[🔗](https://github.com/andreasronge/ptc_runner/blob/main/lib/ptc_runner/sub_agent/loop/step_assembler.ex#L1)

Final step assembly for SubAgent execution.

Centralizes the common pattern of enriching a `%Step{}` with usage metrics,
trace-filtered turns, collected messages, and prompt metadata. Used by both
`Loop` and `Loop.TextMode` to construct the step returned from `SubAgent.run/2`.

# `finalize`

```elixir
@spec finalize(PtcRunner.Step.t(), map(), keyword()) :: PtcRunner.Step.t()
```

Finalize a step with metrics, turns, messages, and prompt metadata from state.

## Options

- `:duration_ms` — required, total execution duration
- `:memory_bytes` — memory used in bytes (default `0`)
- `:turn_offset` — offset for turn count, e.g. `-1` for pre-turn failures (default `0`)
- `:is_error` — whether this is an error step, affects trace filtering (default `false`)
- `:final_turn` — a turn to prepend to `state.turns` before reversing (default `nil`)
- `:final_messages` — override for messages (default `state.messages`)
- `:field_descriptions` — set `step.field_descriptions` (default `nil`, not set)
- `:journal` — override `step.journal` (default `nil`, not set)
- `:summaries` — override `step.summaries` (default `state.summaries`)
- `:child_steps` — override `step.child_steps` (default `state.child_steps`)
- `:extra_usage` — map merged into usage (e.g. `%{fallback_used: true}`)

---

*Consult [api-reference.md](api-reference.md) for complete listing*
